Recognize #[thread_local] on extern static. Fixes #30795.
This will correctly add the thread_local attribute to the external static
variable "errno":
extern {
#[thread_local]
static errno: c_int;
}
Before this commit, the thread_local attribute is ignored.
This commit is contained in:
parent
7cffc9b195
commit
d485a511d0
1 changed files with 12 additions and 2 deletions
|
|
@ -40,6 +40,7 @@ use syntax::attr;
|
|||
use syntax::codemap::Span;
|
||||
use syntax::parse::token::{InternedString, special_idents};
|
||||
use syntax::ast;
|
||||
use syntax::attr::AttrMetaMethods;
|
||||
|
||||
use rustc_front::print::pprust;
|
||||
use rustc_front::hir;
|
||||
|
|
@ -119,8 +120,8 @@ pub fn register_static(ccx: &CrateContext,
|
|||
let llty = type_of::type_of(ccx, ty);
|
||||
|
||||
let ident = link_name(foreign_item);
|
||||
match attr::first_attr_value_str_by_name(&foreign_item.attrs,
|
||||
"linkage") {
|
||||
let c = match attr::first_attr_value_str_by_name(&foreign_item.attrs,
|
||||
"linkage") {
|
||||
// If this is a static with a linkage specified, then we need to handle
|
||||
// it a little specially. The typesystem prevents things like &T and
|
||||
// extern "C" fn() from being non-null, so we can't just declare a
|
||||
|
|
@ -165,7 +166,16 @@ pub fn register_static(ccx: &CrateContext,
|
|||
}
|
||||
None => // Generate an external declaration.
|
||||
declare::declare_global(ccx, &ident[..], llty),
|
||||
};
|
||||
|
||||
// Handle thread-local external statics.
|
||||
for attr in foreign_item.attrs.iter() {
|
||||
if attr.check_name("thread_local") {
|
||||
llvm::set_thread_local(c, true);
|
||||
}
|
||||
}
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
// only use this for foreign function ABIs and glue, use `get_extern_rust_fn` for Rust functions
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue