26
26
use core:: prelude:: * ;
27
27
28
28
use back:: link:: { mangle_exported_name} ;
29
- use back:: { link, abi} ;
29
+ use back:: { link, abi, upcall } ;
30
30
use driver:: session;
31
31
use driver:: session:: Session ;
32
32
use lib:: llvm:: { ContextRef , ModuleRef , ValueRef , TypeRef , BasicBlockRef } ;
33
- use lib:: llvm:: { llvm, True , False } ;
33
+ use lib:: llvm:: { True , False } ;
34
+ use lib:: llvm:: { llvm, mk_target_data, mk_type_names} ;
34
35
use lib;
35
36
use metadata:: common:: LinkMeta ;
36
37
use metadata:: { csearch, cstore, encoder} ;
@@ -64,7 +65,7 @@ use util::common::indenter;
64
65
use util:: ppaux:: { Repr , ty_to_str} ;
65
66
66
67
use core:: hash;
67
- use core:: hashmap:: { HashMap } ;
68
+ use core:: hashmap:: { HashMap , HashSet } ;
68
69
use core:: int;
69
70
use core:: io;
70
71
use core:: libc:: c_uint;
@@ -85,8 +86,6 @@ use syntax::visit;
85
86
use syntax:: { ast, ast_util, codemap, ast_map} ;
86
87
use syntax:: abi:: { X86 , X86_64 , Arm , Mips } ;
87
88
88
- pub use middle:: trans:: context:: task_llcx;
89
-
90
89
pub struct icx_popper {
91
90
ccx : @CrateContext ,
92
91
}
@@ -3038,52 +3037,152 @@ pub fn trans_crate(sess: session::Session,
3038
3037
// such as a function name in the module.
3039
3038
// 1. http://llvm.org/bugs/show_bug.cgi?id=11479
3040
3039
let llmod_id = link_meta.name.to_owned() + " . rc";
3041
- let ccx = @CrateContext::new(sess, llmod_id, tcx, emap2, maps,
3042
- symbol_hasher, link_meta, reachable);
3043
- // FIXME(#6511): get LLVM building with --enable-threads so this
3044
- // function can be called
3045
- // if !llvm::LLVMRustStartMultithreading() {
3046
- // sess.bug(" couldn' t enable multi-threaded LLVM ");
3047
- // }
3048
3040
3049
- {
3050
- let _icx = ccx.insn_ctxt(" data");
3051
- trans_constants(ccx, crate);
3052
- }
3041
+ unsafe {
3042
+ // FIXME(#6511): get LLVM building with --enable-threads so this
3043
+ // function can be called
3044
+ // if !llvm::LLVMRustStartMultithreading() {
3045
+ // sess.bug(" couldn' t enable multi-threaded LLVM ");
3046
+ // }
3047
+ let llcx = llvm::LLVMContextCreate();
3048
+ set_task_llcx(llcx);
3049
+ let llmod = str::as_c_str(llmod_id, |buf| {
3050
+ llvm::LLVMModuleCreateWithNameInContext(buf, llcx)
3051
+ });
3052
+ let data_layout: &str = sess.targ_cfg.target_strs.data_layout;
3053
+ let targ_triple: &str = sess.targ_cfg.target_strs.target_triple;
3054
+ let _: () =
3055
+ str::as_c_str(data_layout,
3056
+ |buf| llvm::LLVMSetDataLayout(llmod, buf));
3057
+ let _: () =
3058
+ str::as_c_str(targ_triple,
3059
+ |buf| llvm::LLVMSetTarget(llmod, buf));
3060
+ let targ_cfg = sess.targ_cfg;
3061
+ let td = mk_target_data(sess.targ_cfg.target_strs.data_layout);
3062
+ let tn = mk_type_names();
3063
+ let mut intrinsics = declare_intrinsics(llmod);
3064
+ if sess.opts.extra_debuginfo {
3065
+ declare_dbg_intrinsics(llmod, &mut intrinsics);
3066
+ }
3067
+ let int_type = T_int(targ_cfg);
3068
+ let float_type = T_float(targ_cfg);
3069
+ let tydesc_type = T_tydesc(targ_cfg);
3070
+ lib::llvm::associate_type(tn, @" tydesc", tydesc_type);
3071
+ let crate_map = decl_crate_map(sess, link_meta, llmod);
3072
+ let dbg_cx = if sess.opts.debuginfo {
3073
+ Some(debuginfo::mk_ctxt(copy llmod_id))
3074
+ } else {
3075
+ None
3076
+ };
3053
3077
3054
- {
3055
- let _icx = ccx.insn_ctxt(" text");
3056
- trans_mod(ccx, &crate.node.module);
3057
- }
3058
-
3059
- decl_gc_metadata(ccx, llmod_id);
3060
- fill_crate_map(ccx, ccx.crate_map);
3061
- glue::emit_tydescs(ccx);
3062
- write_abi_version(ccx);
3063
-
3064
- // Translate the metadata.
3065
- write_metadata(ccx, crate);
3066
- if ccx.sess.trans_stats() {
3067
- io::println(" --- trans stats ---");
3068
- io::println(fmt!(" n_static_tydescs: %u",
3069
- ccx.stats.n_static_tydescs));
3070
- io::println(fmt!(" n_glues_created: %u",
3071
- ccx.stats.n_glues_created));
3072
- io::println(fmt!(" n_null_glues: %u", ccx.stats.n_null_glues));
3073
- io::println(fmt!(" n_real_glues: %u", ccx.stats.n_real_glues));
3074
-
3075
- io::println(fmt!(" n_fns: %u", ccx.stats.n_fns));
3076
- io::println(fmt!(" n_monos: %u", ccx.stats.n_monos));
3077
- io::println(fmt!(" n_inlines: %u", ccx.stats.n_inlines));
3078
- io::println(fmt!(" n_closures: %u", ccx.stats.n_closures));
3079
- }
3080
-
3081
- if ccx.sess.count_llvm_insns() {
3082
- for ccx.stats.llvm_insns.each |&k, &v| {
3083
- io::println(fmt!(" %-7 u %s", v, k));
3078
+ let ccx = @CrateContext {
3079
+ sess: sess,
3080
+ llmod: llmod,
3081
+ llcx: llcx,
3082
+ td: td,
3083
+ tn: tn,
3084
+ externs: @mut HashMap::new(),
3085
+ intrinsics: intrinsics,
3086
+ item_vals: @mut HashMap::new(),
3087
+ exp_map2: emap2,
3088
+ reachable: reachable,
3089
+ item_symbols: @mut HashMap::new(),
3090
+ link_meta: link_meta,
3091
+ enum_sizes: @mut HashMap::new(),
3092
+ discrims: @mut HashMap::new(),
3093
+ discrim_symbols: @mut HashMap::new(),
3094
+ tydescs: @mut HashMap::new(),
3095
+ finished_tydescs: @mut false,
3096
+ external: @mut HashMap::new(),
3097
+ monomorphized: @mut HashMap::new(),
3098
+ monomorphizing: @mut HashMap::new(),
3099
+ type_use_cache: @mut HashMap::new(),
3100
+ vtables: @mut HashMap::new(),
3101
+ const_cstr_cache: @mut HashMap::new(),
3102
+ const_globals: @mut HashMap::new(),
3103
+ const_values: @mut HashMap::new(),
3104
+ extern_const_values: @mut HashMap::new(),
3105
+ impl_method_cache: @mut HashMap::new(),
3106
+ module_data: @mut HashMap::new(),
3107
+ lltypes: @mut HashMap::new(),
3108
+ llsizingtypes: @mut HashMap::new(),
3109
+ adt_reprs: @mut HashMap::new(),
3110
+ names: new_namegen(),
3111
+ next_addrspace: new_addrspace_gen(),
3112
+ symbol_hasher: symbol_hasher,
3113
+ type_hashcodes: @mut HashMap::new(),
3114
+ type_short_names: @mut HashMap::new(),
3115
+ all_llvm_symbols: @mut HashSet::new(),
3116
+ tcx: tcx,
3117
+ maps: maps,
3118
+ stats: @mut Stats {
3119
+ n_static_tydescs: 0u,
3120
+ n_glues_created: 0u,
3121
+ n_null_glues: 0u,
3122
+ n_real_glues: 0u,
3123
+ n_fns: 0u,
3124
+ n_monos: 0u,
3125
+ n_inlines: 0u,
3126
+ n_closures: 0u,
3127
+ llvm_insn_ctxt: @mut ~[],
3128
+ llvm_insns: @mut HashMap::new(),
3129
+ fn_times: @mut ~[]
3130
+ },
3131
+ upcalls: upcall::declare_upcalls(targ_cfg, llmod),
3132
+ tydesc_type: tydesc_type,
3133
+ int_type: int_type,
3134
+ float_type: float_type,
3135
+ opaque_vec_type: T_opaque_vec(targ_cfg),
3136
+ builder: BuilderRef_res(unsafe {
3137
+ llvm::LLVMCreateBuilderInContext(llcx)
3138
+ }),
3139
+ shape_cx: mk_ctxt(llmod),
3140
+ crate_map: crate_map,
3141
+ uses_gc: @mut false,
3142
+ dbg_cx: dbg_cx,
3143
+ do_not_commit_warning_issued: @mut false
3144
+ };
3145
+
3146
+ {
3147
+ let _icx = ccx.insn_ctxt(" data");
3148
+ trans_constants(ccx, crate);
3149
+ }
3150
+
3151
+ {
3152
+ let _icx = ccx.insn_ctxt(" text");
3153
+ trans_mod(ccx, &crate.node.module);
3154
+ }
3155
+
3156
+ decl_gc_metadata(ccx, llmod_id);
3157
+ fill_crate_map(ccx, crate_map);
3158
+ glue::emit_tydescs(ccx);
3159
+ write_abi_version(ccx);
3160
+
3161
+ // Translate the metadata.
3162
+ write_metadata(ccx, crate);
3163
+ if ccx.sess.trans_stats() {
3164
+ io::println(" --- trans stats ---");
3165
+ io::println(fmt!(" n_static_tydescs: %u",
3166
+ ccx.stats.n_static_tydescs));
3167
+ io::println(fmt!(" n_glues_created: %u",
3168
+ ccx.stats.n_glues_created));
3169
+ io::println(fmt!(" n_null_glues: %u", ccx.stats.n_null_glues));
3170
+ io::println(fmt!(" n_real_glues: %u", ccx.stats.n_real_glues));
3171
+
3172
+ io::println(fmt!(" n_fns: %u", ccx.stats.n_fns));
3173
+ io::println(fmt!(" n_monos: %u", ccx.stats.n_monos));
3174
+ io::println(fmt!(" n_inlines: %u", ccx.stats.n_inlines));
3175
+ io::println(fmt!(" n_closures: %u", ccx.stats.n_closures));
3176
+ }
3177
+
3178
+ if ccx.sess.count_llvm_insns() {
3179
+ for ccx.stats.llvm_insns.each |&k, &v| {
3180
+ io::println(fmt!(" %-7 u %s", v, k));
3181
+ }
3084
3182
}
3183
+ unset_task_llcx();
3184
+ return (llcx, llmod, link_meta);
3085
3185
}
3086
- return (llmod, link_meta);
3087
3186
}
3088
3187
3089
3188
fn task_local_llcx_key(_v: @ContextRef) {}
0 commit comments