Add comments about address spaces
This commit is contained in:
parent
436e4fb647
commit
b06e840d9e
4 changed files with 26 additions and 1 deletions
|
@ -1226,7 +1226,7 @@ impl<'ll> StaticBuilderMethods for Builder<'_, 'll, '_> {
|
|||
fn get_static(&mut self, def_id: DefId) -> &'ll Value {
|
||||
// Forward to the `get_static` method of `CodegenCx`
|
||||
let s = self.cx().get_static(def_id);
|
||||
// Cast to default address space if statics are in a different addrspace
|
||||
// Cast to default address space if globals are in a different addrspace
|
||||
self.cx().const_pointercast(s, self.type_ptr())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -221,6 +221,7 @@ impl<'ll, 'tcx> ConstCodegenMethods<'tcx> for CodegenCx<'ll, 'tcx> {
|
|||
llvm::LLVMSetUnnamedAddress(g, llvm::UnnamedAddr::Global);
|
||||
}
|
||||
llvm::set_linkage(g, llvm::Linkage::InternalLinkage);
|
||||
// Cast to default address space if globals are in a different addrspace
|
||||
let g = self.const_pointercast(g, self.type_ptr());
|
||||
(s.to_owned(), g)
|
||||
})
|
||||
|
@ -324,6 +325,7 @@ impl<'ll, 'tcx> ConstCodegenMethods<'tcx> for CodegenCx<'ll, 'tcx> {
|
|||
let llval = unsafe {
|
||||
llvm::LLVMConstInBoundsGEP2(
|
||||
self.type_i8(),
|
||||
// Cast to the required address space if necessary
|
||||
self.const_pointercast(base_addr, self.type_ptr_ext(base_addr_space)),
|
||||
&self.const_usize(offset.bytes()),
|
||||
1,
|
||||
|
|
|
@ -214,6 +214,10 @@ impl<'ll> CodegenCx<'ll, '_> {
|
|||
unsafe { llvm::LLVMConstPointerCast(val, ty) }
|
||||
}
|
||||
|
||||
/// Create a global variable.
|
||||
///
|
||||
/// The returned global variable is a pointer in the default address space for globals.
|
||||
/// Fails if a symbol with the given name already exists.
|
||||
pub(crate) fn static_addr_of_mut(
|
||||
&self,
|
||||
cv: &'ll Value,
|
||||
|
@ -237,6 +241,9 @@ impl<'ll> CodegenCx<'ll, '_> {
|
|||
gv
|
||||
}
|
||||
|
||||
/// Create a global constant.
|
||||
///
|
||||
/// The returned global variable is a pointer in the default address space for globals.
|
||||
pub(crate) fn static_addr_of_impl(
|
||||
&self,
|
||||
cv: &'ll Value,
|
||||
|
@ -534,8 +541,14 @@ impl<'ll> CodegenCx<'ll, '_> {
|
|||
}
|
||||
|
||||
impl<'ll> StaticCodegenMethods for CodegenCx<'ll, '_> {
|
||||
/// Get a pointer to a global variable.
|
||||
///
|
||||
/// The pointer will always be in the default address space. If global variables default to a
|
||||
/// different address space, an addrspacecast is inserted.
|
||||
fn static_addr_of(&self, cv: &'ll Value, align: Align, kind: Option<&str>) -> &'ll Value {
|
||||
let gv = self.static_addr_of_impl(cv, align, kind);
|
||||
// static_addr_of_impl returns the bare global variable, which might not be in the default
|
||||
// address space. Cast to the default address space if necessary.
|
||||
self.const_pointercast(gv, self.type_ptr())
|
||||
}
|
||||
|
||||
|
|
|
@ -1500,6 +1500,14 @@ fn build_vtable_type_di_node<'ll, 'tcx>(
|
|||
.di_node
|
||||
}
|
||||
|
||||
/// Get the global variable for the vtable.
|
||||
///
|
||||
/// When using global variables, we may have created an addrspacecast to get a pointer to the
|
||||
/// default address space if global variables are created in a different address space.
|
||||
/// For modifying the vtable, we need the real global variable. This function accepts either a
|
||||
/// global variable (which is simply returned), or an addrspacecast constant expression.
|
||||
/// If the given value is an addrspacecast, the cast is removed and the global variable behind
|
||||
/// the cast is returned.
|
||||
fn find_vtable_behind_cast<'ll>(vtable: &'ll Value) -> &'ll Value {
|
||||
// The vtable is a global variable, which may be behind an addrspacecast.
|
||||
unsafe {
|
||||
|
@ -1532,6 +1540,7 @@ pub(crate) fn apply_vcall_visibility_metadata<'ll, 'tcx>(
|
|||
|
||||
let Some(trait_ref) = trait_ref else { return };
|
||||
|
||||
// Unwrap potential addrspacecast
|
||||
let vtable = find_vtable_behind_cast(vtable);
|
||||
let trait_ref_self = trait_ref.with_self_ty(cx.tcx, ty);
|
||||
let trait_ref_self = cx.tcx.erase_regions(trait_ref_self);
|
||||
|
@ -1606,6 +1615,7 @@ pub(crate) fn create_vtable_di_node<'ll, 'tcx>(
|
|||
return;
|
||||
}
|
||||
|
||||
// Unwrap potential addrspacecast
|
||||
let vtable = find_vtable_behind_cast(vtable);
|
||||
|
||||
// When full debuginfo is enabled, we want to try and prevent vtables from being
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue