@@ -266,16 +266,7 @@ fn data_id_for_static(
266
266
def_id : DefId ,
267
267
definition : bool ,
268
268
) -> DataId {
269
- let rlinkage = tcx. codegen_fn_attrs ( def_id) . linkage ;
270
- let linkage = if definition {
271
- crate :: linkage:: get_static_linkage ( tcx, def_id)
272
- } else if rlinkage == Some ( rustc_middle:: mir:: mono:: Linkage :: ExternalWeak )
273
- || rlinkage == Some ( rustc_middle:: mir:: mono:: Linkage :: WeakAny )
274
- {
275
- Linkage :: Preemptible
276
- } else {
277
- Linkage :: Import
278
- } ;
269
+ let attrs = tcx. codegen_fn_attrs ( def_id) ;
279
270
280
271
let instance = Instance :: mono ( tcx, def_id) . polymorphize ( tcx) ;
281
272
let symbol_name = tcx. symbol_name ( instance) . name ;
@@ -287,22 +278,30 @@ fn data_id_for_static(
287
278
} ;
288
279
let align = tcx. layout_of ( ParamEnv :: reveal_all ( ) . and ( ty) ) . unwrap ( ) . align . pref . bytes ( ) ;
289
280
290
- let attrs = tcx. codegen_fn_attrs ( def_id) ;
281
+ if let Some ( import_linkage) = attrs. import_linkage {
282
+ assert ! ( !definition) ;
291
283
292
- let data_id = match module. declare_data (
293
- & * symbol_name,
294
- linkage,
295
- is_mutable,
296
- attrs. flags . contains ( CodegenFnAttrFlags :: THREAD_LOCAL ) ,
297
- ) {
298
- Ok ( data_id) => data_id,
299
- Err ( ModuleError :: IncompatibleDeclaration ( _) ) => tcx. sess . fatal ( & format ! (
300
- "attempt to declare `{symbol_name}` as static, but it was already declared as function"
301
- ) ) ,
302
- Err ( err) => Err :: < _ , _ > ( err) . unwrap ( ) ,
303
- } ;
284
+ let linkage = if import_linkage == rustc_middle:: mir:: mono:: Linkage :: ExternalWeak
285
+ || import_linkage == rustc_middle:: mir:: mono:: Linkage :: WeakAny
286
+ {
287
+ Linkage :: Preemptible
288
+ } else {
289
+ Linkage :: Import
290
+ } ;
291
+
292
+ let data_id = match module. declare_data (
293
+ & * symbol_name,
294
+ linkage,
295
+ is_mutable,
296
+ attrs. flags . contains ( CodegenFnAttrFlags :: THREAD_LOCAL ) ,
297
+ ) {
298
+ Ok ( data_id) => data_id,
299
+ Err ( ModuleError :: IncompatibleDeclaration ( _) ) => tcx. sess . fatal ( & format ! (
300
+ "attempt to declare `{symbol_name}` as static, but it was already declared as function"
301
+ ) ) ,
302
+ Err ( err) => Err :: < _ , _ > ( err) . unwrap ( ) ,
303
+ } ;
304
304
305
- if rlinkage. is_some ( ) {
306
305
// Comment copied from https://github.com/rust-lang/rust/blob/45060c2a66dfd667f88bd8b94261b28a58d85bd5/src/librustc_codegen_llvm/consts.rs#L141
307
306
// Declare an internal global `extern_with_linkage_foo` which
308
307
// is initialized with the address of `foo`. If `foo` is
@@ -324,10 +323,34 @@ fn data_id_for_static(
324
323
Err ( ModuleError :: DuplicateDefinition ( _) ) => { }
325
324
res => res. unwrap ( ) ,
326
325
}
327
- ref_data_id
328
- } else {
329
- data_id
326
+
327
+ return ref_data_id;
330
328
}
329
+
330
+ let linkage = if definition {
331
+ crate :: linkage:: get_static_linkage ( tcx, def_id)
332
+ } else if attrs. linkage == Some ( rustc_middle:: mir:: mono:: Linkage :: ExternalWeak )
333
+ || attrs. linkage == Some ( rustc_middle:: mir:: mono:: Linkage :: WeakAny )
334
+ {
335
+ Linkage :: Preemptible
336
+ } else {
337
+ Linkage :: Import
338
+ } ;
339
+
340
+ let data_id = match module. declare_data (
341
+ & * symbol_name,
342
+ linkage,
343
+ is_mutable,
344
+ attrs. flags . contains ( CodegenFnAttrFlags :: THREAD_LOCAL ) ,
345
+ ) {
346
+ Ok ( data_id) => data_id,
347
+ Err ( ModuleError :: IncompatibleDeclaration ( _) ) => tcx. sess . fatal ( & format ! (
348
+ "attempt to declare `{symbol_name}` as static, but it was already declared as function"
349
+ ) ) ,
350
+ Err ( err) => Err :: < _ , _ > ( err) . unwrap ( ) ,
351
+ } ;
352
+
353
+ data_id
331
354
}
332
355
333
356
fn define_all_allocs ( tcx : TyCtxt < ' _ > , module : & mut dyn Module , cx : & mut ConstantCx ) {
0 commit comments