@@ -255,21 +255,34 @@ impl<'ll, 'tcx> ConstMethods<'tcx> for CodegenCx<'ll, 'tcx> {
255
255
let ( prov, offset) = ptr. into_parts ( ) ;
256
256
let ( base_addr, base_addr_space) = match self . tcx . global_alloc ( prov. alloc_id ( ) ) {
257
257
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 )
271
285
}
272
- ( value, AddressSpace :: DATA )
273
286
}
274
287
GlobalAlloc :: Function ( fn_instance) => (
275
288
self . get_fn_addr ( fn_instance. polymorphize ( self . tcx ) ) ,
0 commit comments