Skip to content

Commit

Permalink
Recognize #[thread_local] on extern static. Fixes #30795.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
mneumann committed Jan 12, 2016
1 parent 7cffc9b commit d485a51
Showing 1 changed file with 12 additions and 2 deletions.
14 changes: 12 additions & 2 deletions src/librustc_trans/trans/foreign.rs
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit d485a51

Please sign in to comment.