Cache the TLS model in the crate context
This commit is contained in:
parent
b233a6e096
commit
ad1bb2e465
2 changed files with 12 additions and 5 deletions
|
@ -23,7 +23,6 @@ use monomorphize::Instance;
|
||||||
use type_::Type;
|
use type_::Type;
|
||||||
use type_of;
|
use type_of;
|
||||||
use rustc::ty;
|
use rustc::ty;
|
||||||
use context::get_tls_model;
|
|
||||||
|
|
||||||
use rustc::hir;
|
use rustc::hir;
|
||||||
|
|
||||||
|
@ -197,7 +196,7 @@ pub fn get_static(ccx: &CrateContext, def_id: DefId) -> ValueRef {
|
||||||
|
|
||||||
for attr in attrs {
|
for attr in attrs {
|
||||||
if attr.check_name("thread_local") {
|
if attr.check_name("thread_local") {
|
||||||
llvm::set_thread_local_mode(g, get_tls_model(ccx.sess()));
|
llvm::set_thread_local_mode(g, ccx.tls_model());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -216,7 +215,7 @@ pub fn get_static(ccx: &CrateContext, def_id: DefId) -> ValueRef {
|
||||||
// symbol and another one doesn't.
|
// symbol and another one doesn't.
|
||||||
for attr in ccx.tcx().get_attrs(def_id).iter() {
|
for attr in ccx.tcx().get_attrs(def_id).iter() {
|
||||||
if attr.check_name("thread_local") {
|
if attr.check_name("thread_local") {
|
||||||
llvm::set_thread_local_mode(g, get_tls_model(ccx.sess()));
|
llvm::set_thread_local_mode(g, ccx.tls_model());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ccx.use_dll_storage_attrs() && !ccx.tcx().is_foreign_item(def_id) {
|
if ccx.use_dll_storage_attrs() && !ccx.tcx().is_foreign_item(def_id) {
|
||||||
|
@ -307,7 +306,7 @@ pub fn trans_static<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>,
|
||||||
debuginfo::create_global_var_metadata(ccx, id, g);
|
debuginfo::create_global_var_metadata(ccx, id, g);
|
||||||
|
|
||||||
if attr::contains_name(attrs, "thread_local") {
|
if attr::contains_name(attrs, "thread_local") {
|
||||||
llvm::set_thread_local_mode(g, get_tls_model(ccx.sess()));
|
llvm::set_thread_local_mode(g, ccx.tls_model());
|
||||||
}
|
}
|
||||||
|
|
||||||
base::set_link_section(ccx, g, attrs);
|
base::set_link_section(ccx, g, attrs);
|
||||||
|
|
|
@ -52,6 +52,7 @@ pub struct SharedCrateContext<'a, 'tcx: 'a> {
|
||||||
tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||||
check_overflow: bool,
|
check_overflow: bool,
|
||||||
use_dll_storage_attrs: bool,
|
use_dll_storage_attrs: bool,
|
||||||
|
tls_model: llvm::ThreadLocalMode,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The local portion of a `CrateContext`. There is one `LocalCrateContext`
|
/// The local portion of a `CrateContext`. There is one `LocalCrateContext`
|
||||||
|
@ -166,7 +167,7 @@ pub fn get_reloc_model(sess: &Session) -> llvm::RelocMode {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_tls_model(sess: &Session) -> llvm::ThreadLocalMode {
|
fn get_tls_model(sess: &Session) -> llvm::ThreadLocalMode {
|
||||||
let tls_model_arg = match sess.opts.cg.tls_model {
|
let tls_model_arg = match sess.opts.cg.tls_model {
|
||||||
Some(ref s) => &s[..],
|
Some(ref s) => &s[..],
|
||||||
None => &sess.target.target.options.tls_model[..],
|
None => &sess.target.target.options.tls_model[..],
|
||||||
|
@ -299,10 +300,13 @@ impl<'b, 'tcx> SharedCrateContext<'b, 'tcx> {
|
||||||
|
|
||||||
let check_overflow = tcx.sess.overflow_checks();
|
let check_overflow = tcx.sess.overflow_checks();
|
||||||
|
|
||||||
|
let tls_model = get_tls_model(&tcx.sess);
|
||||||
|
|
||||||
SharedCrateContext {
|
SharedCrateContext {
|
||||||
tcx,
|
tcx,
|
||||||
check_overflow,
|
check_overflow,
|
||||||
use_dll_storage_attrs,
|
use_dll_storage_attrs,
|
||||||
|
tls_model,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -544,6 +548,10 @@ impl<'b, 'tcx> CrateContext<'b, 'tcx> {
|
||||||
self.shared.use_dll_storage_attrs()
|
self.shared.use_dll_storage_attrs()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn tls_model(&self) -> llvm::ThreadLocalMode {
|
||||||
|
self.shared.tls_model
|
||||||
|
}
|
||||||
|
|
||||||
/// Generate a new symbol name with the given prefix. This symbol name must
|
/// Generate a new symbol name with the given prefix. This symbol name must
|
||||||
/// only be used for definitions with `internal` or `private` linkage.
|
/// only be used for definitions with `internal` or `private` linkage.
|
||||||
pub fn generate_local_symbol_name(&self, prefix: &str) -> String {
|
pub fn generate_local_symbol_name(&self, prefix: &str) -> String {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue