[−][src]Struct rustc_codegen_llvm::context::CodegenCx

pub struct CodegenCx<'ll, 'tcx> {
    pub tcx: TyCtxt<'tcx>,
    pub check_overflow: bool,
    pub use_dll_storage_attrs: bool,
    pub tls_model: ThreadLocalMode,
    pub llmod: &'ll Module,
    pub llcx: &'ll Context,
    pub codegen_unit: &'tcx CodegenUnit<'tcx>,
    pub instances: RefCell<FxHashMap<Instance<'tcx>, &'ll Value>>,
    pub vtables: RefCell<FxHashMap<(Ty<'tcx>, Option<PolyExistentialTraitRef<'tcx>>), &'ll Value>>,
    pub const_cstr_cache: RefCell<FxHashMap<Symbol, &'ll Value>>,
    pub const_unsized: RefCell<FxHashMap<&'ll Value, &'ll Value>>,
    pub const_globals: RefCell<FxHashMap<&'ll Value, &'ll Value>>,
    pub statics_to_rauw: RefCell<Vec<(&'ll Value, &'ll Value)>>,
    pub used_statics: RefCell<Vec<&'ll Value>>,
    pub lltypes: RefCell<FxHashMap<(Ty<'tcx>, Option<VariantIdx>), &'ll Type>>,
    pub scalar_lltypes: RefCell<FxHashMap<Ty<'tcx>, &'ll Type>>,
    pub pointee_infos: RefCell<FxHashMap<(Ty<'tcx>, Size), Option<PointeeInfo>>>,
    pub isize_ty: &'ll Type,
    pub coverage_cx: Option<CrateCoverageContext<'tcx>>,
    pub dbg_cx: Option<CrateDebugContext<'ll, 'tcx>>,
    eh_personality: Cell<Option<&'ll Value>>,
    eh_catch_typeinfo: Cell<Option<&'ll Value>>,
    pub rust_try_fn: Cell<Option<&'ll Value>>,
    intrinsics: RefCell<FxHashMap<&'static str, &'ll Value>>,
    local_gen_sym_counter: Cell<usize>,
}

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]

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]

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]

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]

pub(in context) fn declare_intrinsic(
    &self,
    key: &str
) -> Option<&'b Value>
[src]

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]

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]

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]

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]

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]

impl<'tcx, 'll> ConstMethods<'tcx> for CodegenCx<'ll, 'tcx>[src]

impl<'ll, 'tcx> CoverageInfoMethods for CodegenCx<'ll, 'tcx>[src]

impl<'tcx, 'll> DebugInfoMethods<'tcx> for CodegenCx<'ll, 'tcx>[src]

impl<'ll, 'tcx> HasDataLayout for CodegenCx<'ll, 'tcx>[src]

impl<'tcx, 'll> HasParamEnv<'tcx> for CodegenCx<'ll, 'tcx>[src]

impl<'ll, 'tcx> HasTargetSpec for CodegenCx<'ll, 'tcx>[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>

impl<'tcx, 'll> LayoutTypeMethods<'tcx> for CodegenCx<'ll, 'tcx>[src]

impl<'tcx, 'll> MiscMethods<'tcx> for CodegenCx<'ll, 'tcx>[src]

impl<'tcx, 'll> PreDefineMethods<'tcx> for CodegenCx<'ll, 'tcx>[src]

impl<'ll, 'tcx> StaticMethods for CodegenCx<'ll, 'tcx>[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]

impl<T> Borrow<T> for T where
    T: ?Sized, 
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized, 
[src]

impl<'tcx, T> DerivedTypeMethods<'tcx> for T where
    T: BaseTypeMethods<'tcx> + MiscMethods<'tcx>, 
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.