1//===- IntrinsicsCHERICap.td - Defines CHERI intrinsics ----*- tablegen -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file defines all of the memory-capability-specific intrinsics. 11// 12//===----------------------------------------------------------------------===// 13 14 15def int_cheri_cap_length_get : 16 Intrinsic<[llvm_anyint_ty], 17 [llvm_fatptr_ty], 18 [IntrNoMem, IntrWillReturn]>; 19def int_cheri_cap_base_get : 20 Intrinsic<[llvm_anyint_ty], 21 [llvm_fatptr_ty], 22 [IntrNoMem, IntrWillReturn]>; 23 24def int_cheri_cap_perms_and : 25 Intrinsic<[llvm_fatptr_ty], 26 [llvm_fatptr_ty, llvm_anyint_ty], 27 [IntrNoMem, IntrWillReturn]>; 28def int_cheri_cap_perms_get : 29 Intrinsic<[llvm_anyint_ty], 30 [llvm_fatptr_ty], 31 [IntrNoMem, IntrWillReturn]>; 32def int_cheri_cap_flags_set : 33 Intrinsic<[llvm_fatptr_ty], 34 [llvm_fatptr_ty, llvm_anyint_ty], 35 [IntrNoMem, IntrWillReturn]>; 36def int_cheri_cap_flags_get : 37 Intrinsic<[llvm_anyint_ty], 38 [llvm_fatptr_ty], 39 [IntrNoMem, IntrWillReturn]>; 40def int_cheri_cap_bounds_set : 41 Intrinsic<[llvm_fatptr_ty], 42 [llvm_fatptr_ty, llvm_anyint_ty], 43 [IntrNoMem, IntrWillReturn]>; 44def int_cheri_cap_bounds_set_exact : 45 Intrinsic<[llvm_fatptr_ty], 46 [llvm_fatptr_ty, llvm_anyint_ty], 47 [IntrNoMem, IntrWillReturn]>; 48def int_cheri_cap_type_get : 49 Intrinsic<[llvm_anyint_ty], 50 [llvm_fatptr_ty], 51 [IntrNoMem, IntrWillReturn]>; 52def int_cheri_cap_tag_get : 53 GCCBuiltin<"__builtin_cheri_tag_get">, 54 Intrinsic<[llvm_i1_ty], 55 [llvm_fatptr_ty], 56 [IntrNoMem, IntrWillReturn]>; 57def int_cheri_cap_sealed_get : 58 GCCBuiltin<"__builtin_cheri_sealed_get">, 59 Intrinsic<[llvm_i1_ty], 60 [llvm_fatptr_ty], 61 [IntrNoMem, IntrWillReturn]>; 62 63def int_cheri_cap_tag_clear : 64 GCCBuiltin<"__builtin_cheri_tag_clear">, 65 Intrinsic<[llvm_fatptr_ty], 66 [llvm_fatptr_ty], 67 [IntrNoMem, IntrWillReturn]>; 68 69def int_cheri_cap_seal : 70 GCCBuiltin<"__builtin_cheri_seal">, 71 Intrinsic<[llvm_fatptr_ty], 72 [llvm_fatptr_ty, llvm_fatptr_ty], 73 [IntrNoMem, IntrWillReturn]>; 74def int_cheri_cap_conditional_seal : 75 GCCBuiltin<"__builtin_cheri_conditional_seal">, 76 Intrinsic<[llvm_fatptr_ty], 77 [llvm_fatptr_ty, llvm_fatptr_ty], 78 [IntrNoMem, IntrWillReturn]>; 79def int_cheri_cap_unseal : 80 GCCBuiltin<"__builtin_cheri_unseal">, 81 Intrinsic<[llvm_fatptr_ty], 82 [llvm_fatptr_ty, llvm_fatptr_ty], 83 [IntrNoMem, IntrWillReturn]>; 84 def int_cheri_cap_seal_entry: 85 GCCBuiltin<"__builtin_cheri_seal_entry">, 86 Intrinsic<[llvm_fatptr_ty], [llvm_fatptr_ty], 87 [IntrNoMem, IntrWillReturn]>; 88 89def int_cheri_cap_perms_check : 90 Intrinsic<[], [llvm_fatptr_ty, llvm_anyint_ty], 91 [IntrNoMem, IntrHasSideEffects, IntrWillReturn]>; 92def int_cheri_cap_type_check : 93 GCCBuiltin<"__builtin_cheri_type_check">, 94 Intrinsic<[], [llvm_fatptr_ty, llvm_fatptr_ty], 95 [IntrNoMem, IntrHasSideEffects, IntrWillReturn]>; 96def int_cheri_cap_subset_test: 97 GCCBuiltin<"__builtin_cheri_subset_test">, 98 Intrinsic<[llvm_i1_ty], [llvm_fatptr_ty, llvm_fatptr_ty], [IntrNoMem, IntrWillReturn]>; 99def int_cheri_cap_equal_exact: 100 GCCBuiltin<"__builtin_cheri_equal_exact">, 101 Intrinsic<[llvm_i1_ty], [llvm_fatptr_ty, llvm_fatptr_ty], [IntrNoMem, IntrWillReturn]>; 102 103def int_cheri_stack_cap_get : 104 GCCBuiltin<"__builtin_cheri_stack_get">, 105 Intrinsic<[llvm_fatptr_ty], [], [IntrNoMem, IntrWillReturn]>; 106def int_cheri_ddc_get : 107 GCCBuiltin<"__builtin_cheri_global_data_get">, 108 Intrinsic<[llvm_fatptr_ty], [], [IntrNoMem, IntrWillReturn]>; 109def int_cheri_pcc_get : 110 GCCBuiltin<"__builtin_cheri_program_counter_get">, 111 Intrinsic<[llvm_fatptr_ty], [], [IntrNoMem, IntrWillReturn]>; 112 113//////////////////////////////////////////////////////////////////////////////// 114// Offset-related intrinsics 115//////////////////////////////////////////////////////////////////////////////// 116 117def int_cheri_cap_offset_set: 118 Intrinsic<[llvm_fatptr_ty], [llvm_fatptr_ty, llvm_anyint_ty], [IntrNoMem, IntrWillReturn]>; 119def int_cheri_cap_offset_get: 120 Intrinsic<[llvm_anyint_ty], [llvm_fatptr_ty], [IntrNoMem, IntrWillReturn]>; 121def int_cheri_cap_diff: 122 Intrinsic<[llvm_anyint_ty], [llvm_fatptr_ty,llvm_fatptr_ty], [IntrNoMem, IntrWillReturn]>; 123 124//////////////////////////////////////////////////////////////////////////////// 125// Pointer / capability interoperation intrinsics 126//////////////////////////////////////////////////////////////////////////////// 127def int_cheri_cap_address_get: 128 Intrinsic<[llvm_anyint_ty], [llvm_fatptr_ty], [IntrNoMem, IntrWillReturn]>; 129def int_cheri_cap_address_set: 130 Intrinsic<[llvm_fatptr_ty], [llvm_fatptr_ty, llvm_anyint_ty], [IntrNoMem, IntrWillReturn]>; 131 132 133def int_cheri_cap_to_pointer: 134 Intrinsic<[llvm_anyint_ty], [llvm_fatptr_ty, llvm_fatptr_ty], [IntrNoMem, IntrWillReturn]>; 135def int_cheri_cap_from_pointer: 136 Intrinsic<[llvm_fatptr_ty], [llvm_fatptr_ty, llvm_anyint_ty], [IntrNoMem, IntrWillReturn]>; 137 138//////////////////////////////////////////////////////////////////////////////// 139// Building capabilities from untagged data 140//////////////////////////////////////////////////////////////////////////////// 141def int_cheri_cap_build: 142 GCCBuiltin<"__builtin_cheri_cap_build">, 143 Intrinsic<[llvm_fatptr_ty], [llvm_fatptr_ty, llvm_fatptr_ty], [IntrNoMem, IntrWillReturn]>; 144def int_cheri_cap_type_copy: 145 GCCBuiltin<"__builtin_cheri_cap_type_copy">, 146 Intrinsic<[llvm_fatptr_ty], [llvm_fatptr_ty, llvm_fatptr_ty], [IntrNoMem, IntrWillReturn]>; 147 148//////////////////////////////////////////////////////////////////////////////// 149// Tag memory accessor functions 150//////////////////////////////////////////////////////////////////////////////// 151def int_cheri_cap_load_tags: 152 Intrinsic<[llvm_anyint_ty], [llvm_fatptr_ty], [IntrReadMem]>; 153 154/// Round length to compressed capability precision: 155def int_cheri_round_representable_length : 156 GCCBuiltin<"__builtin_cheri_round_representable_length">, 157 Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>], [IntrNoMem, IntrWillReturn]>; 158def int_cheri_representable_alignment_mask : 159 GCCBuiltin<"__builtin_cheri_representable_alignment_mask">, 160 Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>], [IntrNoMem, IntrWillReturn]>; 161 162 163/// This intrinsics makes it easier to avoid spilling registers to create 164/// bounded capabilities for the stack (such as when passing a stack buffer to 165/// another function, etc) 166def int_cheri_bounded_stack_cap : 167 Intrinsic<[llvm_fatptr_ty], [llvm_fatptr_ty, llvm_anyint_ty], [IntrNoMem, IntrWillReturn]>; 168