Struct rustc_codegen_llvm::context::CodegenCx [−][src]
pub struct CodegenCx<'ll, 'tcx> {Show 26 fields
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 compiler_used_statics: RefCell<Vec<&'ll Value>>,
pub type_lowering: RefCell<FxHashMap<(Ty<'tcx>, Option<VariantIdx>), TypeLowering<'ll>>>,
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<'ll, '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 Type, &'ll Value)>>,
intrinsics: RefCell<FxHashMap<&'static str, (&'ll Type, &'ll Value)>>,
local_gen_sym_counter: Cell<usize>,
}
Expand description
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: bool
use_dll_storage_attrs: bool
tls_model: ThreadLocalMode
llmod: &'ll Module
llcx: &'ll Context
codegen_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 https://llvm.org/docs/LangRef.html#the-llvm-used-global-variable for details
compiler_used_statics: RefCell<Vec<&'ll Value>>
Statics that will be placed in the llvm.compiler.used variable See https://llvm.org/docs/LangRef.html#the-llvm-compiler-used-global-variable for details
type_lowering: RefCell<FxHashMap<(Ty<'tcx>, Option<VariantIdx>), TypeLowering<'ll>>>
Mapping of non-scalar types to llvm types and field remapping if needed.
scalar_lltypes: RefCell<FxHashMap<Ty<'tcx>, &'ll Type>>
Mapping of scalar types to llvm types.
pointee_infos: RefCell<FxHashMap<(Ty<'tcx>, Size), Option<PointeeInfo>>>
isize_ty: &'ll Type
coverage_cx: Option<CrateCoverageContext<'ll, '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 Type, &'ll Value)>>
intrinsics: RefCell<FxHashMap<&'static str, (&'ll Type, &'ll Value)>>
local_gen_sym_counter: Cell<usize>
A counter that is used for generating local symbol names
Implementations
pub(crate) fn new(
tcx: TyCtxt<'tcx>,
codegen_unit: &'tcx CodegenUnit<'tcx>,
llvm_module: &'ll ModuleLlvm
) -> Self
Generates a new symbol name with the given prefix. This symbol name must
only be used for definitions with internal
or private
linkage.
Looks up debug source information about a BytePos
.
Declare a global value.
If there’s a value with the same name already declared, the function will return its Value instead.
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.
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.
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).
Declare a private global
Use this function when you intend to define a global without a name.
Gets declared value by name.
Gets defined or externally defined (AvailableExternally linkage) value by name.
pub(crate) unsafe fn should_assume_dso_local(
&self,
llval: &Value,
is_declaration: bool
) -> bool
pub(crate) unsafe fn should_assume_dso_local(
&self,
llval: &Value,
is_declaration: bool
) -> bool
Whether a definition or declaration can be assumed to be local to a group of libraries that form a single DSO or executable.
x Creates an integer type with the given number of bits, e.g., i24
Return a LLVM type that has at most the required alignment, and exactly the required size, as a best-effort padding array.
Trait Implementations
fn codegen_global_asm(
&self,
template: &[InlineAsmTemplatePiece],
operands: &[GlobalAsmOperandRef],
options: InlineAsmOptions,
_line_spans: &[Span]
)
Returns the number of elements in self
if it is a LLVM vector type.
fn from_const_alloc(
&self,
layout: TyAndLayout<'tcx>,
alloc: &Allocation,
offset: Size
) -> PlaceRef<'tcx, &'ll Value>
Functions with MIR-based coverage are normally codegenned only if
called. LLVM coverage tools typically expect every function to be
defined (even if unused), with at least one call to LLVM intrinsic
instrprof.increment
.
Codegen a small function that will never be called, with one counter that will never be incremented.
For used/called functions, the coverageinfo was already added to the
function_coverage_map
(keyed by function Instance
) during codegen.
But in this case, since the unused function was not previously
codegenned, collect the coverage CodeRegion
s from the MIR and add
them. The first CodeRegion
is used to add a single counter, with the
same counter ID used in the injected instrprof.increment
intrinsic
call. Since the function is never called, all other CodeRegion
s can be
added as unreachable_region
s.
For LLVM codegen, returns a function-specific Value
for a global
string, to hold the function name passed to LLVM intrinsic
instrprof.increment()
. The Value
is only created once per instance.
Multiple invocations with the same instance return the same Value
. Read more
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>>
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>>
Creates the function-specific debug context. Read more
fn dbg_scope_fn(
&self,
instance: Instance<'tcx>,
fn_abi: &FnAbi<'tcx, Ty<'tcx>>,
maybe_definition_llfn: Option<&'ll Value>
) -> &'ll DIScope
fn dbg_loc(
&self,
scope: &'ll DIScope,
inlined_at: Option<&'ll DILocation>,
span: Span
) -> &'ll DILocation
fn create_vtable_metadata(
&self,
ty: Ty<'tcx>,
trait_ref: Option<PolyExistentialTraitRef<'tcx>>,
vtable: Self::Value
)
fn extend_scope_to_file(
&self,
scope_metadata: &'ll DIScope,
file: &SourceFile
) -> &'ll DILexicalBlock
fn create_dbg_var(
&self,
variable_name: Symbol,
variable_type: Ty<'tcx>,
scope_metadata: &'ll DIScope,
variable_kind: VariableKind,
span: Span
) -> &'ll DIVariable
type FnAbiOfResult = &'tcx FnAbi<'tcx, Ty<'tcx>>
type FnAbiOfResult = &'tcx FnAbi<'tcx, Ty<'tcx>>
The &FnAbi
-wrapping type (or &FnAbi
itself), which will be
returned from fn_abi_of_*
(see also handle_fn_abi_err
). Read more
fn handle_fn_abi_err(
&self,
err: FnAbiError<'tcx>,
span: Span,
fn_abi_request: FnAbiRequest<'tcx>
) -> !
fn handle_fn_abi_err(
&self,
err: FnAbiError<'tcx>,
span: Span,
fn_abi_request: FnAbiRequest<'tcx>
) -> !
Helper used for fn_abi_of_*
, to adapt tcx.fn_abi_of_*(...)
into a
Self::FnAbiOfResult
(which does not need to be a Result<...>
). Read more
type LayoutOfResult = TyAndLayout<'tcx>
type LayoutOfResult = TyAndLayout<'tcx>
The TyAndLayout
-wrapping type (or TyAndLayout
itself), which will be
returned from layout_of
(see also handle_layout_err
). Read more
Helper used for layout_of
, to adapt tcx.layout_of(...)
into a
Self::LayoutOfResult
(which does not need to be a Result<...>
). Read more
Span
to use for tcx.at(span)
, from layout_of
.
fn scalar_pair_element_backend_type(
&self,
layout: TyAndLayout<'tcx>,
index: usize,
immediate: bool
) -> &'ll Type
fn predefine_static(
&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
)
Add a global value to a list to be stored in the llvm.used
variable, an array of i8*.
Add a global value to a list to be stored in the llvm.compiler.used
variable,
an array of i8*.
Auto Trait Implementations
impl<'ll, 'tcx> !RefUnwindSafe for CodegenCx<'ll, 'tcx>
impl<'ll, 'tcx> !UnwindSafe for CodegenCx<'ll, 'tcx>
Blanket Implementations
Mutably borrows from an owned value. Read more
impl<'tcx, T> DerivedTypeMethods<'tcx> for T where
T: BaseTypeMethods<'tcx> + MiscMethods<'tcx>,
impl<'tcx, T> DerivedTypeMethods<'tcx> for T where
T: BaseTypeMethods<'tcx> + MiscMethods<'tcx>,
fn fn_abi_of_fn_ptr(
&self,
sig: Binder<'tcx, FnSig<'tcx>>,
extra_args: &'tcx List<&'tcx TyS<'tcx>>
) -> Self::FnAbiOfResult
fn fn_abi_of_fn_ptr(
&self,
sig: Binder<'tcx, FnSig<'tcx>>,
extra_args: &'tcx List<&'tcx TyS<'tcx>>
) -> Self::FnAbiOfResult
Compute a FnAbi
suitable for indirect calls, i.e. to fn
pointers. Read more
fn fn_abi_of_instance(
&self,
instance: Instance<'tcx>,
extra_args: &'tcx List<&'tcx TyS<'tcx>>
) -> Self::FnAbiOfResult
fn fn_abi_of_instance(
&self,
instance: Instance<'tcx>,
extra_args: &'tcx List<&'tcx TyS<'tcx>>
) -> Self::FnAbiOfResult
Compute a FnAbi
suitable for declaring/defining an fn
instance, and for
direct calls to an fn
. Read more
Layout
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...)
attributes. Please see the Rust Reference’s “Type Layout” chapter for details on type layout guarantees.
Size: 1024 bytes