[−][src]Struct rustc_codegen_llvm::context::CodegenCx
There is one CodegenCx per compilation unit. Each one has its own LLVM
llvm::Context so that several compilation units may be optimized in parallel.
All other LLVM data structures in the CodegenCx are tied to that llvm::Context.
Fields
tcx: TyCtxt<'tcx>check_overflow: booluse_dll_storage_attrs: booltls_model: ThreadLocalModellmod: &'ll Modulellcx: &'ll Contextcodegen_unit: &'tcx CodegenUnit<'tcx>instances: RefCell<FxHashMap<Instance<'tcx>, &'ll Value>>Cache instances of monomorphic and polymorphic items
vtables: RefCell<FxHashMap<(Ty<'tcx>, Option<PolyExistentialTraitRef<'tcx>>), &'ll Value>>Cache generated vtables
const_cstr_cache: RefCell<FxHashMap<Symbol, &'ll Value>>Cache of constant strings,
const_unsized: RefCell<FxHashMap<&'ll Value, &'ll Value>>Reverse-direction for const ptrs cast from globals.
Key is a Value holding a *T,
Val is a Value holding a *[T].
Needed because LLVM loses pointer->pointee association
when we ptrcast, and we have to ptrcast during codegen
of a [T] const because we form a slice, a (*T,usize) pair, not
a pointer to an LLVM array type. Similar for trait objects.
const_globals: RefCell<FxHashMap<&'ll Value, &'ll Value>>Cache of emitted const globals (value -> global)
statics_to_rauw: RefCell<Vec<(&'ll Value, &'ll Value)>>List of globals for static variables which need to be passed to the LLVM function ReplaceAllUsesWith (RAUW) when codegen is complete. (We have to make sure we don't invalidate any Values referring to constants.)
used_statics: RefCell<Vec<&'ll Value>>Statics that will be placed in the llvm.used variable See http://llvm.org/docs/LangRef.html#the-llvm-used-global-variable for details
lltypes: RefCell<FxHashMap<(Ty<'tcx>, Option<VariantIdx>), &'ll Type>>scalar_lltypes: RefCell<FxHashMap<Ty<'tcx>, &'ll Type>>pointee_infos: RefCell<FxHashMap<(Ty<'tcx>, Size), Option<PointeeInfo>>>isize_ty: &'ll Typecoverage_cx: Option<CrateCoverageContext<'tcx>>dbg_cx: Option<CrateDebugContext<'ll, 'tcx>>eh_personality: Cell<Option<&'ll Value>>eh_catch_typeinfo: Cell<Option<&'ll Value>>rust_try_fn: Cell<Option<&'ll Value>>intrinsics: RefCell<FxHashMap<&'static str, &'ll Value>>local_gen_sym_counter: Cell<usize>A counter that is used for generating local symbol names
Implementations
impl<'ll, 'tcx> CodegenCx<'ll, 'tcx>[src]
pub fn const_array(&self, ty: &'ll Type, elts: &[&'ll Value]) -> &'ll Value[src]
pub fn const_vector(&self, elts: &[&'ll Value]) -> &'ll Value[src]
pub fn const_bytes(&self, bytes: &[u8]) -> &'ll Value[src]
pub(in common) fn const_cstr(
&self,
s: Symbol,
null_terminated: bool
) -> &'ll Value[src]
&self,
s: Symbol,
null_terminated: bool
) -> &'ll Value
pub fn const_get_elt(&self, v: &'ll Value, idx: u64) -> &'ll Value[src]
impl<'ll, 'tcx> CodegenCx<'ll, 'tcx>[src]
pub(crate) fn const_bitcast(&self, val: &'ll Value, ty: &'ll Type) -> &'ll Value[src]
pub(crate) fn static_addr_of_mut(
&self,
cv: &'ll Value,
align: Align,
kind: Option<&str>
) -> &'ll Value[src]
&self,
cv: &'ll Value,
align: Align,
kind: Option<&str>
) -> &'ll Value
pub(crate) fn get_static(&self, def_id: DefId) -> &'ll Value[src]
impl<'ll, 'tcx> CodegenCx<'ll, 'tcx>[src]
pub(crate) fn new(
tcx: TyCtxt<'tcx>,
codegen_unit: &'tcx CodegenUnit<'tcx>,
llvm_module: &'ll ModuleLlvm
) -> Self[src]
tcx: TyCtxt<'tcx>,
codegen_unit: &'tcx CodegenUnit<'tcx>,
llvm_module: &'ll ModuleLlvm
) -> Self
pub(crate) fn statics_to_rauw(&self) -> &RefCell<Vec<(&'ll Value, &'ll Value)>>[src]
pub fn coverage_context<'a>(&'a self) -> Option<&'a CrateCoverageContext<'tcx>>[src]
impl<'b, 'tcx> CodegenCx<'b, 'tcx>[src]
pub(crate) fn get_intrinsic(&self, key: &str) -> &'b Value[src]
pub(in context) fn insert_intrinsic(
&self,
name: &'static str,
args: Option<&[&'b Type]>,
ret: &'b Type
) -> &'b Value[src]
&self,
name: &'static str,
args: Option<&[&'b Type]>,
ret: &'b Type
) -> &'b Value
pub(in context) fn declare_intrinsic(
&self,
key: &str
) -> Option<&'b Value>[src]
&self,
key: &str
) -> Option<&'b Value>
pub(crate) fn eh_catch_typeinfo(&self) -> &'b Value[src]
impl<'b, 'tcx> CodegenCx<'b, 'tcx>[src]
pub fn generate_local_symbol_name(&self, prefix: &str) -> String[src]
Generates a new symbol name with the given prefix. This symbol name must
only be used for definitions with internal or private linkage.
impl<'ll, '_> CodegenCx<'ll, '_>[src]
pub fn lookup_debug_loc(&self, pos: BytePos) -> DebugLoc[src]
Looks up debug source information about a BytePos.
impl<'ll, 'tcx> CodegenCx<'ll, 'tcx>[src]
pub fn declare_global(&self, name: &str, ty: &'ll Type) -> &'ll Value[src]
Declare a global value.
If there’s a value with the same name already declared, the function will return its Value instead.
pub fn declare_cfn(&self, name: &str, fn_type: &'ll Type) -> &'ll Value[src]
Declare a C ABI function.
Only use this for foreign function ABIs and glue. For Rust functions use
declare_fn instead.
If there’s a value with the same name already declared, the function will update the declaration and return existing Value instead.
pub fn declare_fn(
&self,
name: &str,
fn_abi: &FnAbi<'tcx, Ty<'tcx>>
) -> &'ll Value[src]
&self,
name: &str,
fn_abi: &FnAbi<'tcx, Ty<'tcx>>
) -> &'ll Value
Declare a Rust function.
If there’s a value with the same name already declared, the function will update the declaration and return existing Value instead.
pub fn define_global(&self, name: &str, ty: &'ll Type) -> Option<&'ll Value>[src]
Declare a global with an intention to define it.
Use this function when you intend to define a global. This function will
return None if the name already has a definition associated with it. In that
case an error should be reported to the user, because it usually happens due
to user’s fault (e.g., misuse of #[no_mangle] or #[export_name] attributes).
pub fn define_private_global(&self, ty: &'ll Type) -> &'ll Value[src]
Declare a private global
Use this function when you intend to define a global without a name.
pub fn get_declared_value(&self, name: &str) -> Option<&'ll Value>[src]
Gets declared value by name.
pub fn get_defined_value(&self, name: &str) -> Option<&'ll Value>[src]
Gets defined or externally defined (AvailableExternally linkage) value by name.
impl<'ll, 'tcx> CodegenCx<'ll, 'tcx>[src]
pub(crate) fn type_named_struct(&self, name: &str) -> &'ll Type[src]
pub(crate) fn set_struct_body(
&self,
ty: &'ll Type,
els: &[&'ll Type],
packed: bool
)[src]
&self,
ty: &'ll Type,
els: &[&'ll Type],
packed: bool
)
pub(crate) fn type_void(&self) -> &'ll Type[src]
pub(crate) fn type_metadata(&self) -> &'ll Type[src]
pub(crate) fn type_ix(&self, num_bits: u64) -> &'ll Type[src]
x Creates an integer type with the given number of bits, e.g., i24
pub(crate) fn type_vector(&self, ty: &'ll Type, len: u64) -> &'ll Type[src]
pub(crate) fn func_params_types(&self, ty: &'ll Type) -> Vec<&'ll Type>[src]
pub(crate) fn type_bool(&self) -> &'ll Type[src]
pub(crate) fn type_int_from_ty(&self, t: IntTy) -> &'ll Type[src]
pub(crate) fn type_uint_from_ty(&self, t: UintTy) -> &'ll Type[src]
pub(crate) fn type_float_from_ty(&self, t: FloatTy) -> &'ll Type[src]
pub(crate) fn type_pointee_for_align(&self, align: Align) -> &'ll Type[src]
pub(crate) fn type_padding_filler(&self, size: Size, align: Align) -> &'ll Type[src]
Return a LLVM type that has at most the required alignment, and exactly the required size, as a best-effort padding array.
pub(crate) fn type_variadic_func(
&self,
args: &[&'ll Type],
ret: &'ll Type
) -> &'ll Type[src]
&self,
args: &[&'ll Type],
ret: &'ll Type
) -> &'ll Type
pub(crate) fn type_array(&self, ty: &'ll Type, len: u64) -> &'ll Type[src]
impl<'a, 'tcx> CodegenCx<'a, 'tcx>[src]
pub fn align_of(&self, ty: Ty<'tcx>) -> Align[src]
pub fn size_of(&self, ty: Ty<'tcx>) -> Size[src]
pub fn size_and_align_of(&self, ty: Ty<'tcx>) -> (Size, Align)[src]
Trait Implementations
impl<'ll, 'tcx> AsmMethods for CodegenCx<'ll, 'tcx>[src]
pub fn codegen_global_asm(&self, ga: &GlobalAsm)[src]
impl<'ll, 'tcx> BackendTypes for CodegenCx<'ll, 'tcx>[src]
type Value = &'ll Value
type Function = &'ll Value
type BasicBlock = &'ll BasicBlock
type Type = &'ll Type
type Funclet = Funclet<'ll>
type DIScope = &'ll DIScope
type DILocation = &'ll DILocation
type DIVariable = &'ll DIVariable
impl<'tcx, 'll> BaseTypeMethods<'tcx> for CodegenCx<'ll, 'tcx>[src]
pub fn type_i1(&self) -> &'ll Type[src]
pub fn type_i8(&self) -> &'ll Type[src]
pub fn type_i16(&self) -> &'ll Type[src]
pub fn type_i32(&self) -> &'ll Type[src]
pub fn type_i64(&self) -> &'ll Type[src]
pub fn type_i128(&self) -> &'ll Type[src]
pub fn type_isize(&self) -> &'ll Type[src]
pub fn type_f32(&self) -> &'ll Type[src]
pub fn type_f64(&self) -> &'ll Type[src]
pub fn type_func(&self, args: &[&'ll Type], ret: &'ll Type) -> &'ll Type[src]
pub fn type_struct(&self, els: &[&'ll Type], packed: bool) -> &'ll Type[src]
pub fn type_kind(&self, ty: &'ll Type) -> TypeKind[src]
pub fn type_ptr_to(&self, ty: &'ll Type) -> &'ll Type[src]
pub fn type_ptr_to_ext(
&self,
ty: &'ll Type,
address_space: AddressSpace
) -> &'ll Type[src]
&self,
ty: &'ll Type,
address_space: AddressSpace
) -> &'ll Type
pub fn element_type(&self, ty: &'ll Type) -> &'ll Type[src]
pub fn vector_length(&self, ty: &'ll Type) -> usize[src]
pub fn float_width(&self, ty: &'ll Type) -> usize[src]
pub fn int_width(&self, ty: &'ll Type) -> u64[src]
pub fn val_ty(&self, v: &'ll Value) -> &'ll Type[src]
impl<'tcx, 'll> ConstMethods<'tcx> for CodegenCx<'ll, 'tcx>[src]
pub fn const_null(&self, t: &'ll Type) -> &'ll Value[src]
pub fn const_undef(&self, t: &'ll Type) -> &'ll Value[src]
pub fn const_int(&self, t: &'ll Type, i: i64) -> &'ll Value[src]
pub fn const_uint(&self, t: &'ll Type, i: u64) -> &'ll Value[src]
pub fn const_uint_big(&self, t: &'ll Type, u: u128) -> &'ll Value[src]
pub fn const_bool(&self, val: bool) -> &'ll Value[src]
pub fn const_i32(&self, i: i32) -> &'ll Value[src]
pub fn const_u32(&self, i: u32) -> &'ll Value[src]
pub fn const_u64(&self, i: u64) -> &'ll Value[src]
pub fn const_usize(&self, i: u64) -> &'ll Value[src]
pub fn const_u8(&self, i: u8) -> &'ll Value[src]
pub fn const_real(&self, t: &'ll Type, val: f64) -> &'ll Value[src]
pub fn const_str(&self, s: Symbol) -> (&'ll Value, &'ll Value)[src]
pub fn const_struct(&self, elts: &[&'ll Value], packed: bool) -> &'ll Value[src]
pub fn const_to_opt_uint(&self, v: &'ll Value) -> Option<u64>[src]
pub fn const_to_opt_u128(&self, v: &'ll Value, sign_ext: bool) -> Option<u128>[src]
pub fn scalar_to_backend(
&self,
cv: Scalar,
layout: &Scalar,
llty: &'ll Type
) -> &'ll Value[src]
&self,
cv: Scalar,
layout: &Scalar,
llty: &'ll Type
) -> &'ll Value
pub fn from_const_alloc(
&self,
layout: TyAndLayout<'tcx>,
alloc: &Allocation,
offset: Size
) -> PlaceRef<'tcx, &'ll Value>[src]
&self,
layout: TyAndLayout<'tcx>,
alloc: &Allocation,
offset: Size
) -> PlaceRef<'tcx, &'ll Value>
pub fn const_ptrcast(&self, val: &'ll Value, ty: &'ll Type) -> &'ll Value[src]
impl<'ll, 'tcx> CoverageInfoMethods for CodegenCx<'ll, 'tcx>[src]
pub fn coverageinfo_finalize(&self)[src]
impl<'tcx, 'll> DebugInfoMethods<'tcx> for CodegenCx<'ll, 'tcx>[src]
pub fn create_function_debug_context(
&self,
instance: Instance<'tcx>,
fn_abi: &FnAbi<'tcx, Ty<'tcx>>,
llfn: &'ll Value,
mir: &Body<'tcx>
) -> Option<FunctionDebugContext<&'ll DIScope, &'ll DILocation>>[src]
&self,
instance: Instance<'tcx>,
fn_abi: &FnAbi<'tcx, Ty<'tcx>>,
llfn: &'ll Value,
mir: &Body<'tcx>
) -> Option<FunctionDebugContext<&'ll DIScope, &'ll DILocation>>
pub fn dbg_scope_fn(
&self,
instance: Instance<'tcx>,
fn_abi: &FnAbi<'tcx, Ty<'tcx>>,
maybe_definition_llfn: Option<&'ll Value>
) -> &'ll DIScope[src]
&self,
instance: Instance<'tcx>,
fn_abi: &FnAbi<'tcx, Ty<'tcx>>,
maybe_definition_llfn: Option<&'ll Value>
) -> &'ll DIScope
pub fn dbg_loc(
&self,
scope: &'ll DIScope,
inlined_at: Option<&'ll DILocation>,
span: Span
) -> &'ll DILocation[src]
&self,
scope: &'ll DIScope,
inlined_at: Option<&'ll DILocation>,
span: Span
) -> &'ll DILocation
pub fn create_vtable_metadata(&self, ty: Ty<'tcx>, vtable: Self::Value)[src]
pub fn extend_scope_to_file(
&self,
scope_metadata: &'ll DIScope,
file: &SourceFile
) -> &'ll DILexicalBlock[src]
&self,
scope_metadata: &'ll DIScope,
file: &SourceFile
) -> &'ll DILexicalBlock
pub fn debuginfo_finalize(&self)[src]
pub fn create_dbg_var(
&self,
variable_name: Symbol,
variable_type: Ty<'tcx>,
scope_metadata: &'ll DIScope,
variable_kind: VariableKind,
span: Span
) -> &'ll DIVariable[src]
&self,
variable_name: Symbol,
variable_type: Ty<'tcx>,
scope_metadata: &'ll DIScope,
variable_kind: VariableKind,
span: Span
) -> &'ll DIVariable
impl<'ll, 'tcx> HasDataLayout for CodegenCx<'ll, 'tcx>[src]
pub fn data_layout(&self) -> &TargetDataLayout[src]
impl<'tcx, 'll> HasParamEnv<'tcx> for CodegenCx<'ll, 'tcx>[src]
impl<'ll, 'tcx> HasTargetSpec for CodegenCx<'ll, 'tcx>[src]
pub fn target_spec(&self) -> &Target[src]
impl<'tcx, 'll> HasTyCtxt<'tcx> for CodegenCx<'ll, 'tcx>[src]
impl<'ll, 'tcx> LayoutOf for CodegenCx<'ll, 'tcx>[src]
type Ty = Ty<'tcx>
type TyAndLayout = TyAndLayout<'tcx>
pub fn layout_of(&self, ty: Ty<'tcx>) -> Self::TyAndLayout[src]
pub fn spanned_layout_of(&self, ty: Ty<'tcx>, span: Span) -> Self::TyAndLayout[src]
impl<'tcx, 'll> LayoutTypeMethods<'tcx> for CodegenCx<'ll, 'tcx>[src]
pub fn backend_type(&self, layout: TyAndLayout<'tcx>) -> &'ll Type[src]
pub fn immediate_backend_type(&self, layout: TyAndLayout<'tcx>) -> &'ll Type[src]
pub fn is_backend_immediate(&self, layout: TyAndLayout<'tcx>) -> bool[src]
pub fn is_backend_scalar_pair(&self, layout: TyAndLayout<'tcx>) -> bool[src]
pub fn backend_field_index(
&self,
layout: TyAndLayout<'tcx>,
index: usize
) -> u64[src]
&self,
layout: TyAndLayout<'tcx>,
index: usize
) -> u64
pub fn scalar_pair_element_backend_type(
&self,
layout: TyAndLayout<'tcx>,
index: usize,
immediate: bool
) -> &'ll Type[src]
&self,
layout: TyAndLayout<'tcx>,
index: usize,
immediate: bool
) -> &'ll Type
pub fn cast_backend_type(&self, ty: &CastTarget) -> &'ll Type[src]
pub fn fn_ptr_backend_type(&self, fn_abi: &FnAbi<'tcx, Ty<'tcx>>) -> &'ll Type[src]
pub fn reg_backend_type(&self, ty: &Reg) -> &'ll Type[src]
impl<'tcx, 'll> MiscMethods<'tcx> for CodegenCx<'ll, 'tcx>[src]
pub fn vtables(
&self
) -> &RefCell<FxHashMap<(Ty<'tcx>, Option<PolyExistentialTraitRef<'tcx>>), &'ll Value>>[src]
&self
) -> &RefCell<FxHashMap<(Ty<'tcx>, Option<PolyExistentialTraitRef<'tcx>>), &'ll Value>>
pub fn get_fn(&self, instance: Instance<'tcx>) -> &'ll Value[src]
pub fn get_fn_addr(&self, instance: Instance<'tcx>) -> &'ll Value[src]
pub fn eh_personality(&self) -> &'ll Value[src]
pub fn sess(&self) -> &Session[src]
pub fn check_overflow(&self) -> bool[src]
pub fn codegen_unit(&self) -> &'tcx CodegenUnit<'tcx>[src]
pub fn used_statics(&self) -> &RefCell<Vec<&'ll Value>>[src]
pub fn set_frame_pointer_elimination(&self, llfn: &'ll Value)[src]
pub fn apply_target_cpu_attr(&self, llfn: &'ll Value)[src]
pub fn create_used_variable(&self)[src]
pub fn declare_c_main(&self, fn_type: Self::Type) -> Option<Self::Function>[src]
impl<'tcx, 'll> PreDefineMethods<'tcx> for CodegenCx<'ll, 'tcx>[src]
pub fn predefine_static(
&self,
def_id: DefId,
linkage: Linkage,
visibility: Visibility,
symbol_name: &str
)[src]
&self,
def_id: DefId,
linkage: Linkage,
visibility: Visibility,
symbol_name: &str
)
pub fn predefine_fn(
&self,
instance: Instance<'tcx>,
linkage: Linkage,
visibility: Visibility,
symbol_name: &str
)[src]
&self,
instance: Instance<'tcx>,
linkage: Linkage,
visibility: Visibility,
symbol_name: &str
)
impl<'ll, 'tcx> StaticMethods for CodegenCx<'ll, 'tcx>[src]
pub fn static_addr_of(
&self,
cv: &'ll Value,
align: Align,
kind: Option<&str>
) -> &'ll Value[src]
&self,
cv: &'ll Value,
align: Align,
kind: Option<&str>
) -> &'ll Value
pub fn codegen_static(&self, def_id: DefId, is_mutable: bool)[src]
pub fn add_used_global(&self, global: &'ll Value)[src]
Add a global value to a list to be stored in the llvm.used variable, an array of i8*.
Auto Trait Implementations
impl<'ll, 'tcx> !RefUnwindSafe for CodegenCx<'ll, 'tcx>
impl<'ll, 'tcx> !Send for CodegenCx<'ll, 'tcx>
impl<'ll, 'tcx> !Sync for CodegenCx<'ll, 'tcx>
impl<'ll, 'tcx> Unpin for CodegenCx<'ll, 'tcx>
impl<'ll, 'tcx> !UnwindSafe for CodegenCx<'ll, 'tcx>
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized, [src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized, [src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized, [src]
T: ?Sized,
pub fn borrow_mut(&mut self) -> &mut T[src]
impl<'tcx, T> DerivedTypeMethods<'tcx> for T where
T: BaseTypeMethods<'tcx> + MiscMethods<'tcx>, [src]
T: BaseTypeMethods<'tcx> + MiscMethods<'tcx>,
pub fn type_i8p(&self) -> Self::Type[src]
pub fn type_i8p_ext(&self, address_space: AddressSpace) -> Self::Type[src]
pub fn type_int(&self) -> Self::Type[src]
pub fn type_from_integer(&self, i: Integer) -> Self::Type[src]
pub fn type_needs_drop(&self, ty: &'tcx TyS<'tcx>) -> bool[src]
pub fn type_is_sized(&self, ty: &'tcx TyS<'tcx>) -> bool[src]
pub fn type_is_freeze(&self, ty: &'tcx TyS<'tcx>) -> bool[src]
pub fn type_has_metadata(&self, ty: &'tcx TyS<'tcx>) -> bool[src]
impl<T> From<T> for T[src]
impl<T, U> Into<U> for T where
U: From<T>, [src]
U: From<T>,
impl<T, U> TryFrom<U> for T where
U: Into<T>, [src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>, [src]
U: TryFrom<T>,