@@ -56,6 +56,7 @@ use middle::trans::common::{tydesc_info, type_is_immediate};
56
56
use middle:: trans:: common:: { type_is_zero_size, val_ty} ;
57
57
use middle:: trans:: common;
58
58
use middle:: trans:: consts;
59
+ use middle:: trans:: context:: SharedCrateContext ;
59
60
use middle:: trans:: controlflow;
60
61
use middle:: trans:: datum;
61
62
use middle:: trans:: debuginfo;
@@ -136,7 +137,7 @@ pub fn push_ctxt(s: &'static str) -> _InsnCtxt {
136
137
}
137
138
138
139
pub struct StatRecorder < ' a > {
139
- ccx : & ' a CrateContext ,
140
+ ccx : & ' a CrateContext < ' a > ,
140
141
name : Option < String > ,
141
142
start : u64 ,
142
143
istart : uint ,
@@ -2114,7 +2115,7 @@ fn enum_variant_size_lint(ccx: &CrateContext, enum_def: &ast::EnumDef, sp: Span,
2114
2115
}
2115
2116
2116
2117
pub struct TransItemVisitor < ' a > {
2117
- pub ccx : & ' a CrateContext ,
2118
+ pub ccx : & ' a CrateContext < ' a > ,
2118
2119
}
2119
2120
2120
2121
impl < ' a > Visitor < ( ) > for TransItemVisitor < ' a > {
@@ -2895,80 +2896,81 @@ pub fn trans_crate(krate: ast::Crate,
2895
2896
2896
2897
let link_meta = link:: build_link_meta ( & tcx. sess , & krate, name) ;
2897
2898
2898
- // Append ".rs" to crate name as LLVM module identifier.
2899
- //
2900
- // LLVM code generator emits a ".file filename" directive
2901
- // for ELF backends. Value of the "filename" is set as the
2902
- // LLVM module identifier. Due to a LLVM MC bug[1], LLVM
2903
- // crashes if the module identifier is same as other symbols
2904
- // such as a function name in the module.
2905
- // 1. http://llvm.org/bugs/show_bug.cgi?id=11479
2906
- let mut llmod_id = link_meta. crate_name . clone ( ) ;
2907
- llmod_id. push_str ( ".rs" ) ;
2899
+ // Multiple compilation units won't be supported until a later commit.
2900
+ let codegen_units = 1 ;
2901
+ let shared_ccx = SharedCrateContext :: new ( link_meta. crate_name . as_slice ( ) ,
2902
+ codegen_units,
2903
+ tcx,
2904
+ exp_map2,
2905
+ Sha256 :: new ( ) ,
2906
+ link_meta. clone ( ) ,
2907
+ reachable) ;
2908
2908
2909
- let ccx = CrateContext :: new ( llmod_id . as_slice ( ) , tcx , exp_map2 ,
2910
- Sha256 :: new ( ) , link_meta , reachable ) ;
2909
+ let metadata = {
2910
+ let ccx = shared_ccx . get_ccx ( 0 ) ;
2911
2911
2912
- // First, verify intrinsics.
2913
- intrinsic:: check_intrinsics ( & ccx) ;
2912
+ // First, verify intrinsics.
2913
+ intrinsic:: check_intrinsics ( & ccx) ;
2914
2914
2915
- // Next, translate the module.
2916
- {
2917
- let _icx = push_ctxt ( "text" ) ;
2918
- trans_mod ( & ccx, & krate. module ) ;
2919
- }
2915
+ // Next, translate the module.
2916
+ {
2917
+ let _icx = push_ctxt ( "text" ) ;
2918
+ trans_mod ( & ccx, & krate. module ) ;
2919
+ }
2920
2920
2921
- glue:: emit_tydescs ( & ccx) ;
2922
- if ccx. sess ( ) . opts . debuginfo != NoDebugInfo {
2923
- debuginfo:: finalize ( & ccx) ;
2924
- }
2921
+ glue:: emit_tydescs ( & ccx) ;
2922
+ if ccx. sess ( ) . opts . debuginfo != NoDebugInfo {
2923
+ debuginfo:: finalize ( & ccx) ;
2924
+ }
2925
+
2926
+ // Translate the metadata.
2927
+ write_metadata ( & ccx, & krate)
2928
+ } ;
2925
2929
2926
- // Translate the metadata.
2927
- let metadata = write_metadata ( & ccx, & krate) ;
2928
- if ccx. sess ( ) . trans_stats ( ) {
2930
+ if shared_ccx. sess ( ) . trans_stats ( ) {
2931
+ let stats = shared_ccx. stats ( ) ;
2929
2932
println ! ( "--- trans stats ---" ) ;
2930
- println ! ( "n_static_tydescs: {}" , ccx . stats( ) . n_static_tydescs. get( ) ) ;
2931
- println ! ( "n_glues_created: {}" , ccx . stats( ) . n_glues_created. get( ) ) ;
2932
- println ! ( "n_null_glues: {}" , ccx . stats( ) . n_null_glues. get( ) ) ;
2933
- println ! ( "n_real_glues: {}" , ccx . stats( ) . n_real_glues. get( ) ) ;
2934
-
2935
- println ! ( "n_fns: {}" , ccx . stats( ) . n_fns. get( ) ) ;
2936
- println ! ( "n_monos: {}" , ccx . stats( ) . n_monos. get( ) ) ;
2937
- println ! ( "n_inlines: {}" , ccx . stats( ) . n_inlines. get( ) ) ;
2938
- println ! ( "n_closures: {}" , ccx . stats( ) . n_closures. get( ) ) ;
2933
+ println ! ( "n_static_tydescs: {}" , stats. n_static_tydescs. get( ) ) ;
2934
+ println ! ( "n_glues_created: {}" , stats. n_glues_created. get( ) ) ;
2935
+ println ! ( "n_null_glues: {}" , stats. n_null_glues. get( ) ) ;
2936
+ println ! ( "n_real_glues: {}" , stats. n_real_glues. get( ) ) ;
2937
+
2938
+ println ! ( "n_fns: {}" , stats. n_fns. get( ) ) ;
2939
+ println ! ( "n_monos: {}" , stats. n_monos. get( ) ) ;
2940
+ println ! ( "n_inlines: {}" , stats. n_inlines. get( ) ) ;
2941
+ println ! ( "n_closures: {}" , stats. n_closures. get( ) ) ;
2939
2942
println ! ( "fn stats:" ) ;
2940
- ccx . stats ( ) . fn_stats . borrow_mut ( ) . sort_by ( |& ( _, _, insns_a) , & ( _, _, insns_b) | {
2943
+ stats. fn_stats . borrow_mut ( ) . sort_by ( |& ( _, _, insns_a) , & ( _, _, insns_b) | {
2941
2944
insns_b. cmp ( & insns_a)
2942
2945
} ) ;
2943
- for tuple in ccx . stats ( ) . fn_stats . borrow ( ) . iter ( ) {
2946
+ for tuple in stats. fn_stats . borrow ( ) . iter ( ) {
2944
2947
match * tuple {
2945
2948
( ref name, ms, insns) => {
2946
2949
println ! ( "{} insns, {} ms, {}" , insns, ms, * name) ;
2947
2950
}
2948
2951
}
2949
2952
}
2950
2953
}
2951
- if ccx . sess ( ) . count_llvm_insns ( ) {
2952
- for ( k, v) in ccx . stats ( ) . llvm_insns . borrow ( ) . iter ( ) {
2954
+ if shared_ccx . sess ( ) . count_llvm_insns ( ) {
2955
+ for ( k, v) in shared_ccx . stats ( ) . llvm_insns . borrow ( ) . iter ( ) {
2953
2956
println ! ( "{:7u} {}" , * v, * k) ;
2954
2957
}
2955
2958
}
2956
2959
2957
- let llcx = ccx. llcx ( ) ;
2958
- let link_meta = ccx. link_meta ( ) . clone ( ) ;
2959
- let llmod = ccx. llmod ( ) ;
2960
+ let llcx = shared_ccx. get_ccx ( 0 ) . llcx ( ) ;
2961
+ let llmod = shared_ccx. get_ccx ( 0 ) . llmod ( ) ;
2960
2962
2961
- let mut reachable: Vec < String > = ccx . reachable ( ) . iter ( ) . filter_map ( |id| {
2962
- ccx . item_symbols ( ) . borrow ( ) . find ( id) . map ( |s| s. to_string ( ) )
2963
+ let mut reachable: Vec < String > = shared_ccx . reachable ( ) . iter ( ) . filter_map ( |id| {
2964
+ shared_ccx . item_symbols ( ) . borrow ( ) . find ( id) . map ( |s| s. to_string ( ) )
2963
2965
} ) . collect ( ) ;
2964
2966
2965
2967
// For the purposes of LTO, we add to the reachable set all of the upstream
2966
2968
// reachable extern fns. These functions are all part of the public ABI of
2967
2969
// the final product, so LTO needs to preserve them.
2968
- ccx . sess ( ) . cstore . iter_crate_data ( |cnum, _| {
2969
- let syms = csearch:: get_reachable_extern_fns ( & ccx . sess ( ) . cstore , cnum) ;
2970
+ shared_ccx . sess ( ) . cstore . iter_crate_data ( |cnum, _| {
2971
+ let syms = csearch:: get_reachable_extern_fns ( & shared_ccx . sess ( ) . cstore , cnum) ;
2970
2972
reachable. extend ( syms. move_iter ( ) . map ( |did| {
2971
- csearch:: get_symbol ( & ccx . sess ( ) . cstore , did)
2973
+ csearch:: get_symbol ( & shared_ccx . sess ( ) . cstore , did)
2972
2974
} ) ) ;
2973
2975
} ) ;
2974
2976
@@ -2986,15 +2988,17 @@ pub fn trans_crate(krate: ast::Crate,
2986
2988
// referenced from rt/rust_try.ll
2987
2989
reachable. push ( "rust_eh_personality_catch" . to_string ( ) ) ;
2988
2990
2989
- let metadata_module = ccx. metadata_llmod ( ) ;
2990
- let formats = ccx. tcx ( ) . dependency_formats . borrow ( ) . clone ( ) ;
2991
+ let metadata_module = shared_ccx. metadata_llmod ( ) ;
2992
+ let metadata_context = shared_ccx. metadata_llcx ( ) ;
2993
+ let formats = shared_ccx. tcx ( ) . dependency_formats . borrow ( ) . clone ( ) ;
2991
2994
let no_builtins = attr:: contains_name ( krate. attrs . as_slice ( ) , "no_builtins" ) ;
2992
2995
2993
- ( ccx . take_tcx ( ) , CrateTranslation {
2996
+ ( shared_ccx . take_tcx ( ) , CrateTranslation {
2994
2997
context : llcx,
2995
2998
module : llmod,
2996
2999
link : link_meta,
2997
3000
metadata_module : metadata_module,
3001
+ metadata_context : metadata_context,
2998
3002
metadata : metadata,
2999
3003
reachable : reachable,
3000
3004
crate_formats : formats,
0 commit comments