[−][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>>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]
fn const_cstr(&self, s: Symbol, null_terminated: bool) -> &'ll Value[src]
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) -> &'a CrateCoverageContext<'tcx>[src]
impl<'b, 'tcx> CodegenCx<'b, 'tcx>[src]
pub(crate) fn get_intrinsic(&self, key: &str) -> &'b Value[src]
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
fn declare_intrinsic(&self, key: &str) -> Option<&'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.
pub fn create_debug_loc(&self, scope: &'ll DIScope, span: Span) -> &'ll Value[src]
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_x86_mmx(&self) -> &'ll Type[src]
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]
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 DIVariable = &'ll DIVariable
impl<'tcx, 'll> BaseTypeMethods<'tcx> for CodegenCx<'ll, 'tcx>[src]
fn type_i1(&self) -> &'ll Type[src]
fn type_i8(&self) -> &'ll Type[src]
fn type_i16(&self) -> &'ll Type[src]
fn type_i32(&self) -> &'ll Type[src]
fn type_i64(&self) -> &'ll Type[src]
fn type_i128(&self) -> &'ll Type[src]
fn type_isize(&self) -> &'ll Type[src]
fn type_f32(&self) -> &'ll Type[src]
fn type_f64(&self) -> &'ll Type[src]
fn type_func(&self, args: &[&'ll Type], ret: &'ll Type) -> &'ll Type[src]
fn type_struct(&self, els: &[&'ll Type], packed: bool) -> &'ll Type[src]
fn type_kind(&self, ty: &'ll Type) -> TypeKind[src]
fn type_ptr_to(&self, ty: &'ll Type) -> &'ll Type[src]
fn type_ptr_to_ext(
&self,
ty: &'ll Type,
address_space: AddressSpace
) -> &'ll Type[src]
&self,
ty: &'ll Type,
address_space: AddressSpace
) -> &'ll Type
fn element_type(&self, ty: &'ll Type) -> &'ll Type[src]
fn vector_length(&self, ty: &'ll Type) -> usize[src]
fn float_width(&self, ty: &'ll Type) -> usize[src]
fn int_width(&self, ty: &'ll Type) -> u64[src]
fn val_ty(&self, v: &'ll Value) -> &'ll Type[src]
impl<'tcx, 'll> ConstMethods<'tcx> for CodegenCx<'ll, 'tcx>[src]
fn const_null(&self, t: &'ll Type) -> &'ll Value[src]
fn const_undef(&self, t: &'ll Type) -> &'ll Value[src]
fn const_int(&self, t: &'ll Type, i: i64) -> &'ll Value[src]
fn const_uint(&self, t: &'ll Type, i: u64) -> &'ll Value[src]
fn const_uint_big(&self, t: &'ll Type, u: u128) -> &'ll Value[src]
fn const_bool(&self, val: bool) -> &'ll Value[src]
fn const_i32(&self, i: i32) -> &'ll Value[src]
fn const_u32(&self, i: u32) -> &'ll Value[src]
fn const_u64(&self, i: u64) -> &'ll Value[src]
fn const_usize(&self, i: u64) -> &'ll Value[src]
fn const_u8(&self, i: u8) -> &'ll Value[src]
fn const_real(&self, t: &'ll Type, val: f64) -> &'ll Value[src]
fn const_str(&self, s: Symbol) -> (&'ll Value, &'ll Value)[src]
fn const_struct(&self, elts: &[&'ll Value], packed: bool) -> &'ll Value[src]
fn const_to_opt_uint(&self, v: &'ll Value) -> Option<u64>[src]
fn const_to_opt_u128(&self, v: &'ll Value, sign_ext: bool) -> Option<u128>[src]
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
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>
fn const_ptrcast(&self, val: &'ll Value, ty: &'ll Type) -> &'ll Value[src]
impl<'ll, 'tcx> CoverageInfoMethods for CodegenCx<'ll, 'tcx>[src]
fn coverageinfo_finalize(&self)[src]
impl<'tcx, 'll> DebugInfoMethods<'tcx> for CodegenCx<'ll, 'tcx>[src]
fn create_function_debug_context(
&self,
instance: Instance<'tcx>,
fn_abi: &FnAbi<'tcx, Ty<'tcx>>,
llfn: &'ll Value,
mir: &Body<'_>
) -> Option<FunctionDebugContext<&'ll DIScope>>[src]
&self,
instance: Instance<'tcx>,
fn_abi: &FnAbi<'tcx, Ty<'tcx>>,
llfn: &'ll Value,
mir: &Body<'_>
) -> Option<FunctionDebugContext<&'ll DIScope>>
fn create_vtable_metadata(&self, ty: Ty<'tcx>, vtable: Self::Value)[src]
fn extend_scope_to_file(
&self,
scope_metadata: &'ll DIScope,
file: &SourceFile,
defining_crate: CrateNum
) -> &'ll DILexicalBlock[src]
&self,
scope_metadata: &'ll DIScope,
file: &SourceFile,
defining_crate: CrateNum
) -> &'ll DILexicalBlock
fn debuginfo_finalize(&self)[src]
fn create_dbg_var(
&self,
dbg_context: &FunctionDebugContext<&'ll DIScope>,
variable_name: Symbol,
variable_type: Ty<'tcx>,
scope_metadata: &'ll DIScope,
variable_kind: VariableKind,
span: Span
) -> &'ll DIVariable[src]
&self,
dbg_context: &FunctionDebugContext<&'ll DIScope>,
variable_name: Symbol,
variable_type: Ty<'tcx>,
scope_metadata: &'ll DIScope,
variable_kind: VariableKind,
span: Span
) -> &'ll DIVariable
impl<'tcx, 'll> DeclareMethods<'tcx> for CodegenCx<'ll, 'tcx>[src]
fn declare_global(&self, name: &str, ty: &'ll Type) -> &'ll Value[src]
fn declare_cfn(&self, name: &str, fn_type: &'ll Type) -> &'ll Value[src]
fn declare_fn(&self, name: &str, fn_abi: &FnAbi<'tcx, Ty<'tcx>>) -> &'ll Value[src]
fn define_global(&self, name: &str, ty: &'ll Type) -> Option<&'ll Value>[src]
fn define_private_global(&self, ty: &'ll Type) -> &'ll Value[src]
fn get_declared_value(&self, name: &str) -> Option<&'ll Value>[src]
fn get_defined_value(&self, name: &str) -> Option<&'ll Value>[src]
impl<'ll, 'tcx> HasDataLayout for CodegenCx<'ll, 'tcx>[src]
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]
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>
fn layout_of(&self, ty: Ty<'tcx>) -> Self::TyAndLayout[src]
fn spanned_layout_of(&self, ty: Ty<'tcx>, span: Span) -> Self::TyAndLayout[src]
impl<'tcx, 'll> LayoutTypeMethods<'tcx> for CodegenCx<'ll, 'tcx>[src]
fn backend_type(&self, layout: TyAndLayout<'tcx>) -> &'ll Type[src]
fn immediate_backend_type(&self, layout: TyAndLayout<'tcx>) -> &'ll Type[src]
fn is_backend_immediate(&self, layout: TyAndLayout<'tcx>) -> bool[src]
fn is_backend_scalar_pair(&self, layout: TyAndLayout<'tcx>) -> bool[src]
fn backend_field_index(&self, layout: TyAndLayout<'tcx>, index: usize) -> u64[src]
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
fn cast_backend_type(&self, ty: &CastTarget) -> &'ll Type[src]
fn fn_ptr_backend_type(&self, fn_abi: &FnAbi<'tcx, Ty<'tcx>>) -> &'ll Type[src]
fn reg_backend_type(&self, ty: &Reg) -> &'ll Type[src]
impl<'tcx, 'll> MiscMethods<'tcx> for CodegenCx<'ll, 'tcx>[src]
fn vtables(
&self
) -> &RefCell<FxHashMap<(Ty<'tcx>, Option<PolyExistentialTraitRef<'tcx>>), &'ll Value>>[src]
&self
) -> &RefCell<FxHashMap<(Ty<'tcx>, Option<PolyExistentialTraitRef<'tcx>>), &'ll Value>>
fn get_fn(&self, instance: Instance<'tcx>) -> &'ll Value[src]
fn get_fn_addr(&self, instance: Instance<'tcx>) -> &'ll Value[src]
fn eh_personality(&self) -> &'ll Value[src]
fn sess(&self) -> &Session[src]
fn check_overflow(&self) -> bool[src]
fn codegen_unit(&self) -> &'tcx CodegenUnit<'tcx>[src]
fn used_statics(&self) -> &RefCell<Vec<&'ll Value>>[src]
fn set_frame_pointer_elimination(&self, llfn: &'ll Value)[src]
fn apply_target_cpu_attr(&self, llfn: &'ll Value)[src]
fn create_used_variable(&self)[src]
impl<'tcx, 'll> PreDefineMethods<'tcx> for CodegenCx<'ll, 'tcx>[src]
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
)
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]
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
fn codegen_static(&self, def_id: DefId, is_mutable: bool)[src]
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,
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>,
fn type_i8p(&self) -> Self::Type[src]
fn type_i8p_ext(&self, address_space: AddressSpace) -> Self::Type[src]
fn type_int(&self) -> Self::Type[src]
fn type_from_integer(&self, i: Integer) -> Self::Type[src]
fn type_needs_drop(&self, ty: &'tcx TyS<'tcx>) -> bool[src]
fn type_is_sized(&self, ty: &'tcx TyS<'tcx>) -> bool[src]
fn type_is_freeze(&self, ty: &'tcx TyS<'tcx>) -> bool[src]
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.
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>,