@@ -255,21 +255,34 @@ impl<'ll, 'tcx> ConstMethods<'tcx> for CodegenCx<'ll, 'tcx> {
255255 let ( prov, offset) = ptr. into_parts ( ) ;
256256 let ( base_addr, base_addr_space) = match self . tcx . global_alloc ( prov. alloc_id ( ) ) {
257257 GlobalAlloc :: Memory ( alloc) => {
258- let init = const_alloc_to_llvm ( self , alloc) ;
259- let alloc = alloc. inner ( ) ;
260- let value = match alloc. mutability {
261- Mutability :: Mut => self . static_addr_of_mut ( init, alloc. align , None ) ,
262- _ => self . static_addr_of ( init, alloc. align , None ) ,
263- } ;
264- if !self . sess ( ) . fewer_names ( ) && llvm:: get_value_name ( value) . is_empty ( ) {
265- let hash = self . tcx . with_stable_hashing_context ( |mut hcx| {
266- let mut hasher = StableHasher :: new ( ) ;
267- alloc. hash_stable ( & mut hcx, & mut hasher) ;
268- hasher. finish :: < Hash128 > ( )
269- } ) ;
270- llvm:: set_value_name ( value, format ! ( "alloc_{hash:032x}" ) . as_bytes ( ) ) ;
258+ // For ZSTs directly codegen an aligned pointer.
259+ // This avoids generating a zero-sized constant value and actually needing a
260+ // real address at runtime.
261+ if alloc. inner ( ) . len ( ) == 0 {
262+ let llval = self . const_usize ( alloc. inner ( ) . align . bytes ( ) ) ;
263+ let llval = unsafe { llvm:: LLVMConstIntToPtr ( llval, llty) } ;
264+ ( llval, AddressSpace :: DATA )
265+ } else {
266+ let init = const_alloc_to_llvm ( self , alloc) ;
267+ let alloc = alloc. inner ( ) ;
268+ let value = match alloc. mutability {
269+ Mutability :: Mut => self . static_addr_of_mut ( init, alloc. align , None ) ,
270+ _ => self . static_addr_of ( init, alloc. align , None ) ,
271+ } ;
272+ if !self . sess ( ) . fewer_names ( ) && llvm:: get_value_name ( value) . is_empty ( )
273+ {
274+ let hash = self . tcx . with_stable_hashing_context ( |mut hcx| {
275+ let mut hasher = StableHasher :: new ( ) ;
276+ alloc. hash_stable ( & mut hcx, & mut hasher) ;
277+ hasher. finish :: < Hash128 > ( )
278+ } ) ;
279+ llvm:: set_value_name (
280+ value,
281+ format ! ( "alloc_{hash:032x}" ) . as_bytes ( ) ,
282+ ) ;
283+ }
284+ ( value, AddressSpace :: DATA )
271285 }
272- ( value, AddressSpace :: DATA )
273286 }
274287 GlobalAlloc :: Function ( fn_instance) => (
275288 self . get_fn_addr ( fn_instance. polymorphize ( self . tcx ) ) ,
0 commit comments