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 {
|
fn get_static(&mut self, def_id: DefId) -> &'ll Value {
|
||||||
// Forward to the `get_static` method of `CodegenCx`
|
// Forward to the `get_static` method of `CodegenCx`
|
||||||
let s = self.cx().get_static(def_id);
|
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())
|
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::LLVMSetUnnamedAddress(g, llvm::UnnamedAddr::Global);
|
||||||
}
|
}
|
||||||
llvm::set_linkage(g, llvm::Linkage::InternalLinkage);
|
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());
|
let g = self.const_pointercast(g, self.type_ptr());
|
||||||
(s.to_owned(), g)
|
(s.to_owned(), g)
|
||||||
})
|
})
|
||||||
|
@ -324,6 +325,7 @@ impl<'ll, 'tcx> ConstCodegenMethods<'tcx> for CodegenCx<'ll, 'tcx> {
|
||||||
let llval = unsafe {
|
let llval = unsafe {
|
||||||
llvm::LLVMConstInBoundsGEP2(
|
llvm::LLVMConstInBoundsGEP2(
|
||||||
self.type_i8(),
|
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_pointercast(base_addr, self.type_ptr_ext(base_addr_space)),
|
||||||
&self.const_usize(offset.bytes()),
|
&self.const_usize(offset.bytes()),
|
||||||
1,
|
1,
|
||||||
|
|
|
@ -214,6 +214,10 @@ impl<'ll> CodegenCx<'ll, '_> {
|
||||||
unsafe { llvm::LLVMConstPointerCast(val, ty) }
|
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(
|
pub(crate) fn static_addr_of_mut(
|
||||||
&self,
|
&self,
|
||||||
cv: &'ll Value,
|
cv: &'ll Value,
|
||||||
|
@ -237,6 +241,9 @@ impl<'ll> CodegenCx<'ll, '_> {
|
||||||
gv
|
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(
|
pub(crate) fn static_addr_of_impl(
|
||||||
&self,
|
&self,
|
||||||
cv: &'ll Value,
|
cv: &'ll Value,
|
||||||
|
@ -534,8 +541,14 @@ impl<'ll> CodegenCx<'ll, '_> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'ll> StaticCodegenMethods for 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 {
|
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);
|
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())
|
self.const_pointercast(gv, self.type_ptr())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1500,6 +1500,14 @@ fn build_vtable_type_di_node<'ll, 'tcx>(
|
||||||
.di_node
|
.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 {
|
fn find_vtable_behind_cast<'ll>(vtable: &'ll Value) -> &'ll Value {
|
||||||
// The vtable is a global variable, which may be behind an addrspacecast.
|
// The vtable is a global variable, which may be behind an addrspacecast.
|
||||||
unsafe {
|
unsafe {
|
||||||
|
@ -1532,6 +1540,7 @@ pub(crate) fn apply_vcall_visibility_metadata<'ll, 'tcx>(
|
||||||
|
|
||||||
let Some(trait_ref) = trait_ref else { return };
|
let Some(trait_ref) = trait_ref else { return };
|
||||||
|
|
||||||
|
// Unwrap potential addrspacecast
|
||||||
let vtable = find_vtable_behind_cast(vtable);
|
let vtable = find_vtable_behind_cast(vtable);
|
||||||
let trait_ref_self = trait_ref.with_self_ty(cx.tcx, ty);
|
let trait_ref_self = trait_ref.with_self_ty(cx.tcx, ty);
|
||||||
let trait_ref_self = cx.tcx.erase_regions(trait_ref_self);
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Unwrap potential addrspacecast
|
||||||
let vtable = find_vtable_behind_cast(vtable);
|
let vtable = find_vtable_behind_cast(vtable);
|
||||||
|
|
||||||
// When full debuginfo is enabled, we want to try and prevent vtables from being
|
// 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