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