@@ -22,14 +22,16 @@ use rustc_middle::middle::exported_symbols::{SymbolExportInfo, SymbolExportLevel
2222use rustc_session:: config:: { self , CrateType , Lto } ;
2323use tracing:: { debug, info} ;
2424
25+ use llvm:: Linkage :: * ;
26+
2527use crate :: back:: write:: {
2628 self , CodegenDiagnosticsStage , DiagnosticHandlers , bitcode_section_name, save_temp_bitcode,
2729} ;
2830use crate :: errors:: {
2931 DynamicLinkingWithLTO , LlvmError , LtoBitcodeFromRlib , LtoDisallowed , LtoDylib , LtoProcMacro ,
3032} ;
3133use crate :: llvm:: AttributePlace :: Function ;
32- use crate :: llvm:: { self , build_string} ;
34+ use crate :: llvm:: { self , build_string, Linkage } ;
3335use crate :: { LlvmCodegenBackend , ModuleLlvm , SimpleCx , attributes} ;
3436
3537/// We keep track of the computed LTO cache keys from the previous
@@ -701,28 +703,31 @@ pub(crate) fn run_pass_manager(
701703 continue ;
702704 }
703705
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 {
705707 let ti64 = cx. type_i64 ( ) ;
706708 let size_ty = cx. type_array ( ti64, vals. len ( ) as u64 ) ;
707709 let mut size_val = Vec :: with_capacity ( vals. len ( ) ) ;
708710 for & val in vals {
709711 size_val. push ( cx. get_const_i64 ( val) ) ;
710712 }
711713 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+ }
718716
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
719725 }
720726
721727 // We add a pair of sizes and maptypes per offloadable function.
722728 // @.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 ] ) ;
726731 // TODO: We should add another pair per call to offloadable functions
727732 // @.offload_sizes.5 = private unnamed_addr constant [2 x i64] [i64 16384, i64 16384]
728733 // @.offload_maptypes.6 = private unnamed_addr constant [2 x i64] [i64 1, i64 3]
@@ -732,32 +737,19 @@ pub(crate) fn run_pass_manager(
732737
733738 // @.__omp_offloading_86fafab6_c40006a1__Z3fooPSt7complexIdES1_S0_m_l7.region_id = weak constant i8 0
734739 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 ) ;
744742
745743 let entry_name = format ! ( "kernel_{num}" ) ;
746744 let c_entry_name = CString :: new ( entry_name) . unwrap ( ) ;
747745 let c_val = c_entry_name. as_bytes_with_nul ( ) ;
748746 let foo = format ! ( ".offloading.entry_name.{num}" ) ;
749- let c_foo = CString :: new ( foo) . unwrap ( ) ;
750747
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 ) ;
754750 llvm:: set_alignment ( llglobal, rustc_abi:: Align :: ONE ) ;
751+ let c_section_name = CString :: new ( ".llvm.rodata.offloading" ) . unwrap ( ) ;
755752 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);
761753 // @.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
762754 // @.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
763755
0 commit comments