@@ -22,14 +22,16 @@ use rustc_middle::middle::exported_symbols::{SymbolExportInfo, SymbolExportLevel
22
22
use rustc_session:: config:: { self , CrateType , Lto } ;
23
23
use tracing:: { debug, info} ;
24
24
25
+ use llvm:: Linkage :: * ;
26
+
25
27
use crate :: back:: write:: {
26
28
self , CodegenDiagnosticsStage , DiagnosticHandlers , bitcode_section_name, save_temp_bitcode,
27
29
} ;
28
30
use crate :: errors:: {
29
31
DynamicLinkingWithLTO , LlvmError , LtoBitcodeFromRlib , LtoDisallowed , LtoDylib , LtoProcMacro ,
30
32
} ;
31
33
use crate :: llvm:: AttributePlace :: Function ;
32
- use crate :: llvm:: { self , build_string} ;
34
+ use crate :: llvm:: { self , build_string, Linkage } ;
33
35
use crate :: { LlvmCodegenBackend , ModuleLlvm , SimpleCx , attributes} ;
34
36
35
37
/// We keep track of the computed LTO cache keys from the previous
@@ -701,28 +703,31 @@ pub(crate) fn run_pass_manager(
701
703
continue ;
702
704
}
703
705
704
- fn add_priv_unnamed_arr ( cx : & SimpleCx < ' _ > , name : & str , vals : & [ u64 ] ) {
706
+ fn add_priv_unnamed_arr < ' ll > ( cx : & SimpleCx < ' ll > , name : & str , vals : & [ u64 ] ) -> & ' ll llvm :: Value {
705
707
let ti64 = cx. type_i64 ( ) ;
706
708
let size_ty = cx. type_array ( ti64, vals. len ( ) as u64 ) ;
707
709
let mut size_val = Vec :: with_capacity ( vals. len ( ) ) ;
708
710
for & val in vals {
709
711
size_val. push ( cx. get_const_i64 ( val) ) ;
710
712
}
711
713
let initializer = cx. const_array ( ti64, & size_val) ;
712
- let c_name = CString :: new ( name) . unwrap ( ) ;
713
- let array = llvm:: add_global ( cx. llmod , cx. val_ty ( initializer) , & c_name ) ;
714
- llvm:: set_global_constant ( array, true ) ;
715
- unsafe { llvm:: LLVMSetUnnamedAddress ( array, llvm:: UnnamedAddr :: Global ) } ;
716
- llvm:: set_linkage ( array, llvm:: Linkage :: PrivateLinkage ) ;
717
- llvm:: set_initializer ( array, initializer) ;
714
+ add_global ( cx, name, initializer, PrivateLinkage )
715
+ }
718
716
717
+ fn add_global < ' ll > ( cx : & SimpleCx < ' ll > , name : & str , initializer : & ' ll llvm:: Value , l : Linkage ) -> & ' ll llvm:: Value {
718
+ let c_name = CString :: new ( name) . unwrap ( ) ;
719
+ let llglobal: & ' ll llvm:: Value = llvm:: add_global ( cx. llmod , cx. val_ty ( initializer) , & c_name) ;
720
+ llvm:: set_global_constant ( llglobal, true ) ;
721
+ unsafe { llvm:: LLVMSetUnnamedAddress ( llglobal, llvm:: UnnamedAddr :: Global ) } ;
722
+ llvm:: set_linkage ( llglobal, l) ;
723
+ llvm:: set_initializer ( llglobal, initializer) ;
724
+ llglobal
719
725
}
720
726
721
727
// We add a pair of sizes and maptypes per offloadable function.
722
728
// @.offload_maptypes = private unnamed_addr constant [4 x i64] [i64 800, i64 544, i64 547, i64 544]
723
- let array = add_priv_unnamed_arr ( & cx, & format ! ( ".offload_sizes.{num}" ) , & vec ! [ 8u64 , 0 , 16 , 0 ] ) ;
724
- let maptypes = add_priv_unnamed_arr ( & cx, & format ! ( ".offload_maptypes.{num}" ) , & vec ! [ 800u64 , 544 , 547 , 544 ] ) ;
725
- dbg ! ( & array) ;
729
+ let o_sizes = add_priv_unnamed_arr ( & cx, & format ! ( ".offload_sizes.{num}" ) , & vec ! [ 8u64 , 0 , 16 , 0 ] ) ;
730
+ let o_types = add_priv_unnamed_arr ( & cx, & format ! ( ".offload_maptypes.{num}" ) , & vec ! [ 800u64 , 544 , 547 , 544 ] ) ;
726
731
// TODO: We should add another pair per call to offloadable functions
727
732
// @.offload_sizes.5 = private unnamed_addr constant [2 x i64] [i64 16384, i64 16384]
728
733
// @.offload_maptypes.6 = private unnamed_addr constant [2 x i64] [i64 1, i64 3]
@@ -732,32 +737,19 @@ pub(crate) fn run_pass_manager(
732
737
733
738
// @.__omp_offloading_86fafab6_c40006a1__Z3fooPSt7complexIdES1_S0_m_l7.region_id = weak constant i8 0
734
739
let name = format ! ( ".kernel_{num}.region_id" ) ;
735
- let name = CString :: new ( name) . unwrap ( ) ;
736
- let entry = llvm:: add_global ( cx. llmod , cx. type_i8 ( ) , & name) ;
737
- llvm:: set_global_constant ( entry, true ) ;
738
- llvm:: set_linkage ( entry, llvm:: Linkage :: WeakAnyLinkage ) ;
739
- llvm:: set_initializer ( entry, cx. get_const_i8 ( 0 ) ) ;
740
-
741
-
742
- let section_name = format ! ( ".llvm.rodata.offloading" ) ;
743
- let c_section_name = CString :: new ( section_name) . unwrap ( ) ;
740
+ let initializer = cx. get_const_i8 ( 0 ) ;
741
+ add_global ( & cx, & name, initializer, WeakAnyLinkage ) ;
744
742
745
743
let entry_name = format ! ( "kernel_{num}" ) ;
746
744
let c_entry_name = CString :: new ( entry_name) . unwrap ( ) ;
747
745
let c_val = c_entry_name. as_bytes_with_nul ( ) ;
748
746
let foo = format ! ( ".offloading.entry_name.{num}" ) ;
749
- let c_foo = CString :: new ( foo) . unwrap ( ) ;
750
747
751
- let llconst = crate :: common:: bytes_in_context ( cx. llcx , c_val) ;
752
- let llglobal =
753
- llvm:: add_global ( cx. llmod , crate :: common:: val_ty ( llconst) , & c_foo) ;
748
+ let initializer = crate :: common:: bytes_in_context ( cx. llcx , c_val) ;
749
+ let llglobal = add_global ( & cx, & foo, initializer, InternalLinkage ) ;
754
750
llvm:: set_alignment ( llglobal, rustc_abi:: Align :: ONE ) ;
751
+ let c_section_name = CString :: new ( ".llvm.rodata.offloading" ) . unwrap ( ) ;
755
752
llvm:: set_section ( llglobal, & c_section_name) ;
756
- llvm:: set_global_constant ( llglobal, true ) ;
757
- llvm:: set_linkage ( llglobal, llvm:: Linkage :: InternalLinkage ) ;
758
- unsafe { llvm:: LLVMSetUnnamedAddress ( llglobal, llvm:: UnnamedAddr :: Global ) } ;
759
- llvm:: set_initializer ( llglobal, llconst) ;
760
- //dbg!(&foo);
761
753
// @.offloading.entry_name = internal unnamed_addr constant [66 x i8] c"__omp_offloading_86fafab6_c40006a1__Z3fooPSt7complexIdES1_S0_m_l7\00", section ".llvm.rodata.offloading", align 1
762
754
// @.offloading.entry.__omp_offloading_86fafab6_c40006a1__Z3fooPSt7complexIdES1_S0_m_l7 = weak constant %struct.__tgt_offload_entry { i64 0, i16 1, i16 1, i32 0, ptr @.__omp_offloading_86fafab6_c40006a1__Z3fooPSt7complexIdES1_S0_m_l7.region_id, ptr @.offloading.entry_name, i64 0, i64 0, ptr null }, section "omp_offloading_entries", align 1
763
755
0 commit comments