about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJames Miller <james@aatch.net>2013-06-13 14:49:01 +1200
committerJames Miller <bladeon@gmail.com>2013-06-16 09:17:50 +1200
commit01e098aa05e01104d1a09f56bc188f6b53450778 (patch)
tree779573f83f05d40234248b5880a24916dab3ddce
parentb1f39ce40310d9e34dcabef01b761e659bbd5390 (diff)
Make CrateContext::new() fn.
Move construction of a CrateContext into a static method on
CrateContext.
-rw-r--r--src/librustc/middle/trans/base.rs193
-rw-r--r--src/librustc/middle/trans/common.rs19
-rw-r--r--src/librustc/middle/trans/context.rs166
3 files changed, 192 insertions, 186 deletions
diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs
index 1eb5936e314..9e2c4e15c57 100644
--- a/src/librustc/middle/trans/base.rs
+++ b/src/librustc/middle/trans/base.rs
@@ -26,12 +26,11 @@
 use core::prelude::*;
 
 use back::link::{mangle_exported_name};
-use back::{link, abi, upcall};
+use back::{link, abi};
 use driver::session;
 use driver::session::Session;
 use lib::llvm::{ContextRef, ModuleRef, ValueRef, TypeRef, BasicBlockRef};
-use lib::llvm::{True, False};
-use lib::llvm::{llvm, mk_target_data, mk_type_names};
+use lib::llvm::{llvm, True, False};
 use lib;
 use metadata::common::LinkMeta;
 use metadata::{csearch, cstore, encoder};
@@ -65,7 +64,7 @@ use util::common::indenter;
 use util::ppaux::{Repr, ty_to_str};
 
 use core::hash;
-use core::hashmap::{HashMap, HashSet};
+use core::hashmap::{HashMap};
 use core::int;
 use core::io;
 use core::libc::c_uint;
@@ -86,6 +85,8 @@ use syntax::visit;
 use syntax::{ast, ast_util, codemap, ast_map};
 use syntax::abi::{X86, X86_64, Arm, Mips};
 
+pub use middle::trans::context::task_llcx;
+
 pub struct icx_popper {
     ccx: @CrateContext,
 }
@@ -3037,152 +3038,52 @@ pub fn trans_crate(sess: session::Session,
     // such as a function name in the module.
     // 1. http://llvm.org/bugs/show_bug.cgi?id=11479
     let llmod_id = link_meta.name.to_owned() + ".rc";
+    let ccx = @CrateContext::new(sess, llmod_id, tcx, emap2, maps,
+                                 symbol_hasher, link_meta, reachable);
+    // FIXME(#6511): get LLVM building with --enable-threads so this
+    //               function can be called
+    // if !llvm::LLVMRustStartMultithreading() {
+    //     sess.bug("couldn't enable multi-threaded LLVM");
+    // }
 
-    unsafe {
-        // FIXME(#6511): get LLVM building with --enable-threads so this
-        //               function can be called
-        // if !llvm::LLVMRustStartMultithreading() {
-        //     sess.bug("couldn't enable multi-threaded LLVM");
-        // }
-        let llcx = llvm::LLVMContextCreate();
-        set_task_llcx(llcx);
-        let llmod = str::as_c_str(llmod_id, |buf| {
-            llvm::LLVMModuleCreateWithNameInContext(buf, llcx)
-        });
-        let data_layout: &str = sess.targ_cfg.target_strs.data_layout;
-        let targ_triple: &str = sess.targ_cfg.target_strs.target_triple;
-        let _: () =
-            str::as_c_str(data_layout,
-                        |buf| llvm::LLVMSetDataLayout(llmod, buf));
-        let _: () =
-            str::as_c_str(targ_triple,
-                        |buf| llvm::LLVMSetTarget(llmod, buf));
-        let targ_cfg = sess.targ_cfg;
-        let td = mk_target_data(sess.targ_cfg.target_strs.data_layout);
-        let tn = mk_type_names();
-        let mut intrinsics = declare_intrinsics(llmod);
-        if sess.opts.extra_debuginfo {
-            declare_dbg_intrinsics(llmod, &mut intrinsics);
-        }
-        let int_type = T_int(targ_cfg);
-        let float_type = T_float(targ_cfg);
-        let tydesc_type = T_tydesc(targ_cfg);
-        lib::llvm::associate_type(tn, @"tydesc", tydesc_type);
-        let crate_map = decl_crate_map(sess, link_meta, llmod);
-        let dbg_cx = if sess.opts.debuginfo {
-            Some(debuginfo::mk_ctxt(copy llmod_id))
-        } else {
-            None
-        };
-
-        let ccx = @CrateContext {
-              sess: sess,
-              llmod: llmod,
-              llcx: llcx,
-              td: td,
-              tn: tn,
-              externs: @mut HashMap::new(),
-              intrinsics: intrinsics,
-              item_vals: @mut HashMap::new(),
-              exp_map2: emap2,
-              reachable: reachable,
-              item_symbols: @mut HashMap::new(),
-              link_meta: link_meta,
-              enum_sizes: @mut HashMap::new(),
-              discrims: @mut HashMap::new(),
-              discrim_symbols: @mut HashMap::new(),
-              tydescs: @mut HashMap::new(),
-              finished_tydescs: @mut false,
-              external: @mut HashMap::new(),
-              monomorphized: @mut HashMap::new(),
-              monomorphizing: @mut HashMap::new(),
-              type_use_cache: @mut HashMap::new(),
-              vtables: @mut HashMap::new(),
-              const_cstr_cache: @mut HashMap::new(),
-              const_globals: @mut HashMap::new(),
-              const_values: @mut HashMap::new(),
-              extern_const_values: @mut HashMap::new(),
-              impl_method_cache: @mut HashMap::new(),
-              module_data: @mut HashMap::new(),
-              lltypes: @mut HashMap::new(),
-              llsizingtypes: @mut HashMap::new(),
-              adt_reprs: @mut HashMap::new(),
-              names: new_namegen(),
-              next_addrspace: new_addrspace_gen(),
-              symbol_hasher: symbol_hasher,
-              type_hashcodes: @mut HashMap::new(),
-              type_short_names: @mut HashMap::new(),
-              all_llvm_symbols: @mut HashSet::new(),
-              tcx: tcx,
-              maps: maps,
-              stats: @mut Stats {
-                n_static_tydescs: 0u,
-                n_glues_created: 0u,
-                n_null_glues: 0u,
-                n_real_glues: 0u,
-                n_fns: 0u,
-                n_monos: 0u,
-                n_inlines: 0u,
-                n_closures: 0u,
-                llvm_insn_ctxt: @mut ~[],
-                llvm_insns: @mut HashMap::new(),
-                fn_times: @mut ~[]
-              },
-              upcalls: upcall::declare_upcalls(targ_cfg, llmod),
-              tydesc_type: tydesc_type,
-              int_type: int_type,
-              float_type: float_type,
-              opaque_vec_type: T_opaque_vec(targ_cfg),
-              builder: BuilderRef_res(unsafe {
-                  llvm::LLVMCreateBuilderInContext(llcx)
-              }),
-              shape_cx: mk_ctxt(llmod),
-              crate_map: crate_map,
-              uses_gc: @mut false,
-              dbg_cx: dbg_cx,
-              do_not_commit_warning_issued: @mut false
-        };
-
-        {
-            let _icx = ccx.insn_ctxt("data");
-            trans_constants(ccx, crate);
-        }
-
-        {
-            let _icx = ccx.insn_ctxt("text");
-            trans_mod(ccx, &crate.node.module);
-        }
-
-        decl_gc_metadata(ccx, llmod_id);
-        fill_crate_map(ccx, crate_map);
-        glue::emit_tydescs(ccx);
-        write_abi_version(ccx);
-
-        // Translate the metadata.
-        write_metadata(ccx, crate);
-        if ccx.sess.trans_stats() {
-            io::println("--- trans stats ---");
-            io::println(fmt!("n_static_tydescs: %u",
-                             ccx.stats.n_static_tydescs));
-            io::println(fmt!("n_glues_created: %u",
-                             ccx.stats.n_glues_created));
-            io::println(fmt!("n_null_glues: %u", ccx.stats.n_null_glues));
-            io::println(fmt!("n_real_glues: %u", ccx.stats.n_real_glues));
-
-            io::println(fmt!("n_fns: %u", ccx.stats.n_fns));
-            io::println(fmt!("n_monos: %u", ccx.stats.n_monos));
-            io::println(fmt!("n_inlines: %u", ccx.stats.n_inlines));
-            io::println(fmt!("n_closures: %u", ccx.stats.n_closures));
-        }
+    {
+        let _icx = ccx.insn_ctxt("data");
+        trans_constants(ccx, crate);
+    }
 
-        if ccx.sess.count_llvm_insns() {
-            for ccx.stats.llvm_insns.each |&k, &v| {
-                io::println(fmt!("%-7u %s", v, k));
-            }
+    {
+        let _icx = ccx.insn_ctxt("text");
+        trans_mod(ccx, &crate.node.module);
+    }
+
+    decl_gc_metadata(ccx, llmod_id);
+    fill_crate_map(ccx, ccx.crate_map);
+    glue::emit_tydescs(ccx);
+    write_abi_version(ccx);
+
+    // Translate the metadata.
+    write_metadata(ccx, crate);
+    if ccx.sess.trans_stats() {
+        io::println("--- trans stats ---");
+        io::println(fmt!("n_static_tydescs: %u",
+                         ccx.stats.n_static_tydescs));
+        io::println(fmt!("n_glues_created: %u",
+                         ccx.stats.n_glues_created));
+        io::println(fmt!("n_null_glues: %u", ccx.stats.n_null_glues));
+        io::println(fmt!("n_real_glues: %u", ccx.stats.n_real_glues));
+
+        io::println(fmt!("n_fns: %u", ccx.stats.n_fns));
+        io::println(fmt!("n_monos: %u", ccx.stats.n_monos));
+        io::println(fmt!("n_inlines: %u", ccx.stats.n_inlines));
+        io::println(fmt!("n_closures: %u", ccx.stats.n_closures));
+    }
+
+    if ccx.sess.count_llvm_insns() {
+        for ccx.stats.llvm_insns.each |&k, &v| {
+            io::println(fmt!("%-7u %s", v, k));
         }
-        unset_task_llcx();
-        return (llcx, llmod, link_meta);
     }
+    return (llmod, link_meta);
 }
 
 fn task_local_llcx_key(_v: @ContextRef) {}
diff --git a/src/librustc/middle/trans/common.rs b/src/librustc/middle/trans/common.rs
index abfce366007..c3734294476 100644
--- a/src/librustc/middle/trans/common.rs
+++ b/src/librustc/middle/trans/common.rs
@@ -12,26 +12,18 @@
 
 use core::prelude::*;
 
-use back::{abi, upcall};
+use back::{abi};
 use driver::session;
 use driver::session::Session;
-use lib::llvm::{ModuleRef, ValueRef, TypeRef, BasicBlockRef, BuilderRef};
-use lib::llvm::{ContextRef, True, False, Bool};
-use lib::llvm::{llvm, TargetData, TypeNames, associate_type, name_has_type};
+use lib::llvm::{ValueRef, TypeRef, BasicBlockRef, BuilderRef};
+use lib::llvm::{True, False, Bool};
+use lib::llvm::{llvm, TypeNames, associate_type, name_has_type};
 use lib;
-use metadata::common::LinkMeta;
-use middle::astencode;
-use middle::resolve;
-use middle::trans::adt;
 use middle::trans::base;
 use middle::trans::build;
 use middle::trans::datum;
-use middle::trans::debuginfo;
 use middle::trans::glue;
-use middle::trans::reachable;
-use middle::trans::shape;
 use middle::trans::type_of;
-use middle::trans::type_use;
 use middle::trans::write_guard;
 use middle::ty::substs;
 use middle::ty;
@@ -41,8 +33,7 @@ use util::ppaux::{Repr};
 
 use core::cast::transmute;
 use core::cast;
-use core::hash;
-use core::hashmap::{HashMap, HashSet};
+use core::hashmap::{HashMap};
 use core::libc::{c_uint, c_longlong, c_ulonglong};
 use core::str;
 use core::to_bytes;
diff --git a/src/librustc/middle/trans/context.rs b/src/librustc/middle/trans/context.rs
index 6d090e444bf..9e6386f87d7 100644
--- a/src/librustc/middle/trans/context.rs
+++ b/src/librustc/middle/trans/context.rs
@@ -1,49 +1,35 @@
 use core::prelude::*;
 
-use back::{abi, upcall};
+use back::{upcall};
 use driver::session;
-use driver::session::Session;
-use lib::llvm::{ModuleRef, ValueRef, TypeRef, BasicBlockRef, BuilderRef};
-use lib::llvm::{ContextRef, True, False, Bool};
-use lib::llvm::{llvm, TargetData, TypeNames, associate_type, name_has_type};
+use lib::llvm::{ContextRef, ModuleRef, ValueRef, TypeRef};
+use lib::llvm::{llvm, TargetData, TypeNames};
+use lib::llvm::{mk_target_data, mk_type_names};
 use lib;
 use metadata::common::LinkMeta;
 use middle::astencode;
 use middle::resolve;
 use middle::trans::adt;
 use middle::trans::base;
-use middle::trans::build;
-use middle::trans::datum;
 use middle::trans::debuginfo;
-use middle::trans::glue;
 use middle::trans::reachable;
 use middle::trans::shape;
-use middle::trans::type_of;
 use middle::trans::type_use;
-use middle::trans::write_guard;
-use middle::ty::substs;
 use middle::ty;
-use middle::typeck;
-use middle::borrowck::root_map_key;
 
-use core::cast::transmute;
-use core::cast;
 use core::hash;
 use core::hashmap::{HashMap, HashSet};
-use core::libc::{c_uint, c_longlong, c_ulonglong};
 use core::str;
-use core::to_bytes;
-use core::vec::raw::to_ptr;
-use core::vec;
-use syntax::ast::ident;
-use syntax::ast_map::{path, path_elt};
-use syntax::codemap::span;
-use syntax::parse::token;
-use syntax::{ast, ast_map};
-use syntax::abi::{X86, X86_64, Arm, Mips};
+use core::local_data;
+use syntax::ast;
 
 use middle::trans::common::{ExternMap,tydesc_info,BuilderRef_res,Stats,namegen,addrspace_gen};
-use middle::trans::common::{mono_id};
+use middle::trans::common::{mono_id,T_int,T_float,T_tydesc,T_opaque_vec};
+use middle::trans::common::{new_namegen,new_addrspace_gen};
+
+use middle::trans::base::{decl_crate_map};
+
+use middle::trans::shape::{mk_ctxt};
 
 pub struct CrateContext {
      sess: session::Session,
@@ -121,3 +107,131 @@ pub struct CrateContext {
      dbg_cx: Option<debuginfo::DebugContext>,
      do_not_commit_warning_issued: @mut bool
 }
+
+impl CrateContext {
+    pub fn new(sess: session::Session, name: &str, tcx: ty::ctxt,
+               emap2: resolve::ExportMap2, maps: astencode::Maps,
+               symbol_hasher: @mut hash::State, link_meta: LinkMeta,
+               reachable: reachable::map) -> CrateContext {
+        unsafe {
+            let llcx = llvm::LLVMContextCreate();
+            set_task_llcx(llcx);
+            let llmod = str::as_c_str(name, |buf| {
+                llvm::LLVMModuleCreateWithNameInContext(buf, llcx)
+            });
+            let data_layout: &str = sess.targ_cfg.target_strs.data_layout;
+            let targ_triple: &str = sess.targ_cfg.target_strs.target_triple;
+            str::as_c_str(data_layout, |buf| llvm::LLVMSetDataLayout(llmod, buf));
+            str::as_c_str(targ_triple, |buf| llvm::LLVMSetTarget(llmod, buf));
+            let targ_cfg = sess.targ_cfg;
+            let td = mk_target_data(sess.targ_cfg.target_strs.data_layout);
+            let tn = mk_type_names();
+            let mut intrinsics = base::declare_intrinsics(llmod);
+            if sess.opts.extra_debuginfo {
+                base::declare_dbg_intrinsics(llmod, &mut intrinsics);
+            }
+            let int_type = T_int(targ_cfg);
+            let float_type = T_float(targ_cfg);
+            let tydesc_type = T_tydesc(targ_cfg);
+            lib::llvm::associate_type(tn, @"tydesc", tydesc_type);
+            let crate_map = decl_crate_map(sess, link_meta, llmod);
+            let dbg_cx = if sess.opts.debuginfo {
+                Some(debuginfo::mk_ctxt(name.to_owned()))
+            } else {
+                None
+            };
+
+            CrateContext {
+                  sess: sess,
+                  llmod: llmod,
+                  llcx: llcx,
+                  td: td,
+                  tn: tn,
+                  externs: @mut HashMap::new(),
+                  intrinsics: intrinsics,
+                  item_vals: @mut HashMap::new(),
+                  exp_map2: emap2,
+                  reachable: reachable,
+                  item_symbols: @mut HashMap::new(),
+                  link_meta: link_meta,
+                  enum_sizes: @mut HashMap::new(),
+                  discrims: @mut HashMap::new(),
+                  discrim_symbols: @mut HashMap::new(),
+                  tydescs: @mut HashMap::new(),
+                  finished_tydescs: @mut false,
+                  external: @mut HashMap::new(),
+                  monomorphized: @mut HashMap::new(),
+                  monomorphizing: @mut HashMap::new(),
+                  type_use_cache: @mut HashMap::new(),
+                  vtables: @mut HashMap::new(),
+                  const_cstr_cache: @mut HashMap::new(),
+                  const_globals: @mut HashMap::new(),
+                  const_values: @mut HashMap::new(),
+                  extern_const_values: @mut HashMap::new(),
+                  module_data: @mut HashMap::new(),
+                  lltypes: @mut HashMap::new(),
+                  llsizingtypes: @mut HashMap::new(),
+                  adt_reprs: @mut HashMap::new(),
+                  names: new_namegen(),
+                  next_addrspace: new_addrspace_gen(),
+                  symbol_hasher: symbol_hasher,
+                  type_hashcodes: @mut HashMap::new(),
+                  type_short_names: @mut HashMap::new(),
+                  all_llvm_symbols: @mut HashSet::new(),
+                  tcx: tcx,
+                  maps: maps,
+                  stats: @mut Stats {
+                    n_static_tydescs: 0u,
+                    n_glues_created: 0u,
+                    n_null_glues: 0u,
+                    n_real_glues: 0u,
+                    n_fns: 0u,
+                    n_monos: 0u,
+                    n_inlines: 0u,
+                    n_closures: 0u,
+                    llvm_insn_ctxt: @mut ~[],
+                    llvm_insns: @mut HashMap::new(),
+                    fn_times: @mut ~[]
+                  },
+                  upcalls: upcall::declare_upcalls(targ_cfg, llmod),
+                  tydesc_type: tydesc_type,
+                  int_type: int_type,
+                  float_type: float_type,
+                  opaque_vec_type: T_opaque_vec(targ_cfg),
+                  builder: BuilderRef_res(unsafe {
+                      llvm::LLVMCreateBuilderInContext(llcx)
+                  }),
+                  shape_cx: mk_ctxt(llmod),
+                  crate_map: crate_map,
+                  uses_gc: @mut false,
+                  dbg_cx: dbg_cx,
+                  do_not_commit_warning_issued: @mut false
+            }
+        }
+    }
+}
+
+#[unsafe_destructor]
+impl Drop for CrateContext {
+    fn finalize(&self) {
+        unsafe {
+            unset_task_llcx();
+        }
+    }
+}
+
+fn task_local_llcx_key(_v: @ContextRef) {}
+
+pub fn task_llcx() -> ContextRef {
+    let opt = unsafe { local_data::local_data_get(task_local_llcx_key) };
+    *opt.expect("task-local LLVMContextRef wasn't ever set!")
+}
+
+unsafe fn set_task_llcx(c: ContextRef) {
+    local_data::local_data_set(task_local_llcx_key, @c);
+}
+
+unsafe fn unset_task_llcx() {
+    local_data::local_data_pop(task_local_llcx_key);
+}
+