@@ -32,7 +32,7 @@ use assert_module_sources;
32
32
use back:: link;
33
33
use back:: linker:: LinkerInfo ;
34
34
use back:: symbol_export:: { self , ExportedSymbols } ;
35
- use llvm:: { Linkage , ValueRef , Vector , get_param} ;
35
+ use llvm:: { ContextRef , Linkage , ModuleRef , ValueRef , Vector , get_param} ;
36
36
use llvm;
37
37
use rustc:: hir:: def_id:: LOCAL_CRATE ;
38
38
use middle:: lang_items:: StartFnLangItem ;
@@ -56,7 +56,7 @@ use common::CrateContext;
56
56
use common:: { type_is_zero_size, val_ty} ;
57
57
use common;
58
58
use consts;
59
- use context:: { SharedCrateContext , CrateContextList } ;
59
+ use context:: { self , SharedCrateContext , CrateContextList } ;
60
60
use debuginfo;
61
61
use declare;
62
62
use machine;
@@ -726,9 +726,13 @@ fn contains_null(s: &str) -> bool {
726
726
727
727
fn write_metadata ( cx : & SharedCrateContext ,
728
728
exported_symbols : & NodeSet )
729
- -> EncodedMetadata {
729
+ -> ( ContextRef , ModuleRef , EncodedMetadata ) {
730
730
use flate;
731
731
732
+ let ( metadata_llcx, metadata_llmod) = unsafe {
733
+ context:: create_context_and_module ( cx. sess ( ) , "metadata" )
734
+ } ;
735
+
732
736
#[ derive( PartialEq , Eq , PartialOrd , Ord ) ]
733
737
enum MetadataKind {
734
738
None ,
@@ -750,30 +754,30 @@ fn write_metadata(cx: &SharedCrateContext,
750
754
} ) . max ( ) . unwrap ( ) ;
751
755
752
756
if kind == MetadataKind :: None {
753
- return EncodedMetadata {
757
+ return ( metadata_llcx , metadata_llmod , EncodedMetadata {
754
758
raw_data : vec ! [ ] ,
755
759
hashes : vec ! [ ] ,
756
- } ;
760
+ } ) ;
757
761
}
758
762
759
763
let cstore = & cx. tcx ( ) . sess . cstore ;
760
764
let metadata = cstore. encode_metadata ( cx. tcx ( ) ,
761
765
cx. link_meta ( ) ,
762
766
exported_symbols) ;
763
767
if kind == MetadataKind :: Uncompressed {
764
- return metadata;
768
+ return ( metadata_llcx , metadata_llmod , metadata) ;
765
769
}
766
770
767
771
assert ! ( kind == MetadataKind :: Compressed ) ;
768
772
let mut compressed = cstore. metadata_encoding_version ( ) . to_vec ( ) ;
769
773
compressed. extend_from_slice ( & flate:: deflate_bytes ( & metadata. raw_data ) ) ;
770
774
771
- let llmeta = C_bytes_in_context ( cx . metadata_llcx ( ) , & compressed) ;
772
- let llconst = C_struct_in_context ( cx . metadata_llcx ( ) , & [ llmeta] , false ) ;
775
+ let llmeta = C_bytes_in_context ( metadata_llcx, & compressed) ;
776
+ let llconst = C_struct_in_context ( metadata_llcx, & [ llmeta] , false ) ;
773
777
let name = cx. metadata_symbol_name ( ) ;
774
778
let buf = CString :: new ( name) . unwrap ( ) ;
775
779
let llglobal = unsafe {
776
- llvm:: LLVMAddGlobal ( cx . metadata_llmod ( ) , val_ty ( llconst) . to_ref ( ) , buf. as_ptr ( ) )
780
+ llvm:: LLVMAddGlobal ( metadata_llmod, val_ty ( llconst) . to_ref ( ) , buf. as_ptr ( ) )
777
781
} ;
778
782
unsafe {
779
783
llvm:: LLVMSetInitializer ( llglobal, llconst) ;
@@ -787,9 +791,9 @@ fn write_metadata(cx: &SharedCrateContext,
787
791
// metadata doesn't get loaded into memory.
788
792
let directive = format ! ( ".section {}" , section_name) ;
789
793
let directive = CString :: new ( directive) . unwrap ( ) ;
790
- llvm:: LLVMSetModuleInlineAsm ( cx . metadata_llmod ( ) , directive. as_ptr ( ) )
794
+ llvm:: LLVMSetModuleInlineAsm ( metadata_llmod, directive. as_ptr ( ) )
791
795
}
792
- return metadata;
796
+ return ( metadata_llcx , metadata_llmod , metadata) ;
793
797
}
794
798
795
799
/// Find any symbols that are defined in one compilation unit, but not declared
@@ -1070,16 +1074,17 @@ pub fn trans_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
1070
1074
exported_symbols,
1071
1075
check_overflow) ;
1072
1076
// Translate the metadata.
1073
- let metadata = time ( tcx. sess . time_passes ( ) , "write metadata" , || {
1074
- write_metadata ( & shared_ccx, shared_ccx. exported_symbols ( ) )
1075
- } ) ;
1077
+ let ( metadata_llcx, metadata_llmod, metadata) =
1078
+ time ( tcx. sess . time_passes ( ) , "write metadata" , || {
1079
+ write_metadata ( & shared_ccx, shared_ccx. exported_symbols ( ) )
1080
+ } ) ;
1076
1081
1077
1082
let metadata_module = ModuleTranslation {
1078
1083
name : link:: METADATA_MODULE_NAME . to_string ( ) ,
1079
1084
symbol_name_hash : 0 , // we always rebuild metadata, at least for now
1080
1085
source : ModuleSource :: Translated ( ModuleLlvm {
1081
- llcx : shared_ccx . metadata_llcx ( ) ,
1082
- llmod : shared_ccx . metadata_llmod ( ) ,
1086
+ llcx : metadata_llcx,
1087
+ llmod : metadata_llmod,
1083
1088
} ) ,
1084
1089
} ;
1085
1090
let no_builtins = attr:: contains_name ( & krate. attrs , "no_builtins" ) ;
0 commit comments