Add opaque TypeId handles for CTFE
This commit is contained in:
@@ -3,9 +3,8 @@
|
||||
use std::borrow::Borrow;
|
||||
|
||||
use libc::{c_char, c_uint};
|
||||
use rustc_abi as abi;
|
||||
use rustc_abi::HasDataLayout;
|
||||
use rustc_abi::Primitive::Pointer;
|
||||
use rustc_abi::{self as abi, HasDataLayout as _};
|
||||
use rustc_ast::Mutability;
|
||||
use rustc_codegen_ssa::common::TypeKind;
|
||||
use rustc_codegen_ssa::traits::*;
|
||||
@@ -284,7 +283,8 @@ impl<'ll, 'tcx> ConstCodegenMethods for CodegenCx<'ll, 'tcx> {
|
||||
self.const_bitcast(llval, llty)
|
||||
};
|
||||
} else {
|
||||
let init = const_alloc_to_llvm(self, alloc, /*static*/ false);
|
||||
let init =
|
||||
const_alloc_to_llvm(self, alloc.inner(), /*static*/ false);
|
||||
let alloc = alloc.inner();
|
||||
let value = match alloc.mutability {
|
||||
Mutability::Mut => self.static_addr_of_mut(init, alloc.align, None),
|
||||
@@ -316,15 +316,19 @@ impl<'ll, 'tcx> ConstCodegenMethods for CodegenCx<'ll, 'tcx> {
|
||||
}),
|
||||
)))
|
||||
.unwrap_memory();
|
||||
let init = const_alloc_to_llvm(self, alloc, /*static*/ false);
|
||||
let value = self.static_addr_of_impl(init, alloc.inner().align, None);
|
||||
value
|
||||
let init = const_alloc_to_llvm(self, alloc.inner(), /*static*/ false);
|
||||
self.static_addr_of_impl(init, alloc.inner().align, None)
|
||||
}
|
||||
GlobalAlloc::Static(def_id) => {
|
||||
assert!(self.tcx.is_static(def_id));
|
||||
assert!(!self.tcx.is_thread_local_static(def_id));
|
||||
self.get_static(def_id)
|
||||
}
|
||||
GlobalAlloc::TypeId { .. } => {
|
||||
// Drop the provenance, the offset contains the bytes of the hash
|
||||
let llval = self.const_usize(offset.bytes());
|
||||
return unsafe { llvm::LLVMConstIntToPtr(llval, llty) };
|
||||
}
|
||||
};
|
||||
let base_addr_space = global_alloc.address_space(self);
|
||||
let llval = unsafe {
|
||||
@@ -346,7 +350,7 @@ impl<'ll, 'tcx> ConstCodegenMethods for CodegenCx<'ll, 'tcx> {
|
||||
}
|
||||
|
||||
fn const_data_from_alloc(&self, alloc: ConstAllocation<'_>) -> Self::Value {
|
||||
const_alloc_to_llvm(self, alloc, /*static*/ false)
|
||||
const_alloc_to_llvm(self, alloc.inner(), /*static*/ false)
|
||||
}
|
||||
|
||||
fn const_ptr_byte_offset(&self, base_addr: Self::Value, offset: abi::Size) -> Self::Value {
|
||||
|
||||
Reference in New Issue
Block a user