1 use super::abi
::AbiBuilderMethods
;
2 use super::asm
::AsmBuilderMethods
;
3 use super::coverageinfo
::CoverageInfoBuilderMethods
;
4 use super::debuginfo
::DebugInfoBuilderMethods
;
5 use super::intrinsic
::IntrinsicCallMethods
;
6 use super::type_
::ArgAbiMethods
;
7 use super::{HasCodegen, StaticBuilderMethods}
;
10 AtomicOrdering
, AtomicRmwBinOp
, IntPredicate
, RealPredicate
, SynchronizationScope
,
12 use crate::mir
::operand
::OperandRef
;
13 use crate::mir
::place
::PlaceRef
;
16 use rustc_middle
::ty
::layout
::HasParamEnv
;
17 use rustc_middle
::ty
::Ty
;
18 use rustc_target
::abi
::{Align, Size}
;
19 use rustc_target
::spec
::HasTargetSpec
;
21 use std
::iter
::TrustedLen
;
24 #[derive(Copy, Clone)]
31 pub trait BuilderMethods
<'a
, 'tcx
>:
33 + CoverageInfoBuilderMethods
<'tcx
>
34 + DebugInfoBuilderMethods
36 + AbiBuilderMethods
<'tcx
>
37 + IntrinsicCallMethods
<'tcx
>
38 + AsmBuilderMethods
<'tcx
>
39 + StaticBuilderMethods
43 fn new_block
<'b
>(cx
: &'a
Self::CodegenCx
, llfn
: Self::Function
, name
: &'b
str) -> Self;
44 fn with_cx(cx
: &'a
Self::CodegenCx
) -> Self;
45 fn build_sibling_block(&self, name
: &str) -> Self;
46 fn cx(&self) -> &Self::CodegenCx
;
47 fn llbb(&self) -> Self::BasicBlock
;
49 fn position_at_end(&mut self, llbb
: Self::BasicBlock
);
50 fn ret_void(&mut self);
51 fn ret(&mut self, v
: Self::Value
);
52 fn br(&mut self, dest
: Self::BasicBlock
);
56 then_llbb
: Self::BasicBlock
,
57 else_llbb
: Self::BasicBlock
,
62 else_llbb
: Self::BasicBlock
,
63 cases
: impl ExactSizeIterator
<Item
= (u128
, Self::BasicBlock
)> + TrustedLen
,
69 then
: Self::BasicBlock
,
70 catch: Self::BasicBlock
,
71 funclet
: Option
<&Self::Funclet
>,
73 fn unreachable(&mut self);
75 fn add(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
76 fn fadd(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
77 fn fadd_fast(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
78 fn sub(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
79 fn fsub(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
80 fn fsub_fast(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
81 fn mul(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
82 fn fmul(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
83 fn fmul_fast(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
84 fn udiv(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
85 fn exactudiv(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
86 fn sdiv(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
87 fn exactsdiv(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
88 fn fdiv(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
89 fn fdiv_fast(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
90 fn urem(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
91 fn srem(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
92 fn frem(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
93 fn frem_fast(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
94 fn shl(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
95 fn lshr(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
96 fn ashr(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
97 fn unchecked_sadd(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
98 fn unchecked_uadd(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
99 fn unchecked_ssub(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
100 fn unchecked_usub(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
101 fn unchecked_smul(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
102 fn unchecked_umul(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
103 fn and(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
104 fn or(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
105 fn xor(&mut self, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
106 fn neg(&mut self, v
: Self::Value
) -> Self::Value
;
107 fn fneg(&mut self, v
: Self::Value
) -> Self::Value
;
108 fn not(&mut self, v
: Self::Value
) -> Self::Value
;
116 ) -> (Self::Value
, Self::Value
);
118 fn alloca(&mut self, ty
: Self::Type
, align
: Align
) -> Self::Value
;
119 fn dynamic_alloca(&mut self, ty
: Self::Type
, align
: Align
) -> Self::Value
;
120 fn array_alloca(&mut self, ty
: Self::Type
, len
: Self::Value
, align
: Align
) -> Self::Value
;
122 fn load(&mut self, ptr
: Self::Value
, align
: Align
) -> Self::Value
;
123 fn volatile_load(&mut self, ptr
: Self::Value
) -> Self::Value
;
124 fn atomic_load(&mut self, ptr
: Self::Value
, order
: AtomicOrdering
, size
: Size
) -> Self::Value
;
125 fn load_operand(&mut self, place
: PlaceRef
<'tcx
, Self::Value
>)
126 -> OperandRef
<'tcx
, Self::Value
>;
128 /// Called for Rvalue::Repeat when the elem is neither a ZST nor optimizable using memset.
129 fn write_operand_repeatedly(
131 elem
: OperandRef
<'tcx
, Self::Value
>,
133 dest
: PlaceRef
<'tcx
, Self::Value
>,
136 fn range_metadata(&mut self, load
: Self::Value
, range
: Range
<u128
>);
137 fn nonnull_metadata(&mut self, load
: Self::Value
);
139 fn store(&mut self, val
: Self::Value
, ptr
: Self::Value
, align
: Align
) -> Self::Value
;
151 order
: AtomicOrdering
,
155 fn gep(&mut self, ptr
: Self::Value
, indices
: &[Self::Value
]) -> Self::Value
;
156 fn inbounds_gep(&mut self, ptr
: Self::Value
, indices
: &[Self::Value
]) -> Self::Value
;
157 fn struct_gep(&mut self, ptr
: Self::Value
, idx
: u64) -> Self::Value
;
159 fn trunc(&mut self, val
: Self::Value
, dest_ty
: Self::Type
) -> Self::Value
;
160 fn sext(&mut self, val
: Self::Value
, dest_ty
: Self::Type
) -> Self::Value
;
161 fn fptoui_sat(&mut self, val
: Self::Value
, dest_ty
: Self::Type
) -> Option
<Self::Value
>;
162 fn fptosi_sat(&mut self, val
: Self::Value
, dest_ty
: Self::Type
) -> Option
<Self::Value
>;
163 fn fptoui(&mut self, val
: Self::Value
, dest_ty
: Self::Type
) -> Self::Value
;
164 fn fptosi(&mut self, val
: Self::Value
, dest_ty
: Self::Type
) -> Self::Value
;
165 fn uitofp(&mut self, val
: Self::Value
, dest_ty
: Self::Type
) -> Self::Value
;
166 fn sitofp(&mut self, val
: Self::Value
, dest_ty
: Self::Type
) -> Self::Value
;
167 fn fptrunc(&mut self, val
: Self::Value
, dest_ty
: Self::Type
) -> Self::Value
;
168 fn fpext(&mut self, val
: Self::Value
, dest_ty
: Self::Type
) -> Self::Value
;
169 fn ptrtoint(&mut self, val
: Self::Value
, dest_ty
: Self::Type
) -> Self::Value
;
170 fn inttoptr(&mut self, val
: Self::Value
, dest_ty
: Self::Type
) -> Self::Value
;
171 fn bitcast(&mut self, val
: Self::Value
, dest_ty
: Self::Type
) -> Self::Value
;
172 fn intcast(&mut self, val
: Self::Value
, dest_ty
: Self::Type
, is_signed
: bool
) -> Self::Value
;
173 fn pointercast(&mut self, val
: Self::Value
, dest_ty
: Self::Type
) -> Self::Value
;
175 fn icmp(&mut self, op
: IntPredicate
, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
176 fn fcmp(&mut self, op
: RealPredicate
, lhs
: Self::Value
, rhs
: Self::Value
) -> Self::Value
;
199 fill_byte
: Self::Value
,
208 then_val
: Self::Value
,
209 else_val
: Self::Value
,
212 fn va_arg(&mut self, list
: Self::Value
, ty
: Self::Type
) -> Self::Value
;
213 fn extract_element(&mut self, vec
: Self::Value
, idx
: Self::Value
) -> Self::Value
;
214 fn vector_splat(&mut self, num_elts
: usize, elt
: Self::Value
) -> Self::Value
;
215 fn extract_value(&mut self, agg_val
: Self::Value
, idx
: u64) -> Self::Value
;
216 fn insert_value(&mut self, agg_val
: Self::Value
, elt
: Self::Value
, idx
: u64) -> Self::Value
;
221 pers_fn
: Self::Value
,
224 fn set_cleanup(&mut self, landing_pad
: Self::Value
);
225 fn resume(&mut self, exn
: Self::Value
) -> Self::Value
;
226 fn cleanup_pad(&mut self, parent
: Option
<Self::Value
>, args
: &[Self::Value
]) -> Self::Funclet
;
229 funclet
: &Self::Funclet
,
230 unwind
: Option
<Self::BasicBlock
>,
232 fn catch_pad(&mut self, parent
: Self::Value
, args
: &[Self::Value
]) -> Self::Funclet
;
235 parent
: Option
<Self::Value
>,
236 unwind
: Option
<Self::BasicBlock
>,
239 fn add_handler(&mut self, catch_switch
: Self::Value
, handler
: Self::BasicBlock
);
240 fn set_personality_fn(&mut self, personality
: Self::Value
);
247 order
: AtomicOrdering
,
248 failure_order
: AtomicOrdering
,
256 order
: AtomicOrdering
,
258 fn atomic_fence(&mut self, order
: AtomicOrdering
, scope
: SynchronizationScope
);
259 fn set_invariant_load(&mut self, load
: Self::Value
);
261 /// Called for `StorageLive`
262 fn lifetime_start(&mut self, ptr
: Self::Value
, size
: Size
);
264 /// Called for `StorageDead`
265 fn lifetime_end(&mut self, ptr
: Self::Value
, size
: Size
);
267 fn instrprof_increment(
269 fn_name
: Self::Value
,
271 num_counters
: Self::Value
,
278 args
: &[Self::Value
],
279 funclet
: Option
<&Self::Funclet
>,
281 fn zext(&mut self, val
: Self::Value
, dest_ty
: Self::Type
) -> Self::Value
;
283 unsafe fn delete_basic_block(&mut self, bb
: Self::BasicBlock
);
284 fn do_not_inline(&mut self, llret
: Self::Value
);