rustc: Crawl static initializers for reachability
This ensures that private functions exported through static initializers will actually end up being public in the object file (so other objects can continue to reference the function). Closes #13620
This commit is contained in:
parent
b5d6b07370
commit
18ac26565f
4 changed files with 52 additions and 1 deletions
|
@ -270,11 +270,12 @@ impl<'a> ReachableContext<'a> {
|
|||
|
||||
// Statics with insignificant addresses are not reachable
|
||||
// because they're inlined specially into all other crates.
|
||||
ast::ItemStatic(..) => {
|
||||
ast::ItemStatic(_, _, init) => {
|
||||
if attr::contains_name(item.attrs.as_slice(),
|
||||
"address_insignificant") {
|
||||
self.reachable_symbols.remove(&search_item);
|
||||
}
|
||||
visit::walk_expr(self, init, ());
|
||||
}
|
||||
|
||||
// These are normal, nothing reachable about these
|
||||
|
|
19
src/test/auxiliary/issue-13620-1.rs
Normal file
19
src/test/auxiliary/issue-13620-1.rs
Normal file
|
@ -0,0 +1,19 @@
|
|||
// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
pub struct Foo {
|
||||
pub foo: extern fn()
|
||||
}
|
||||
|
||||
extern fn the_foo() {}
|
||||
|
||||
pub static FOO: Foo = Foo {
|
||||
foo: the_foo
|
||||
};
|
13
src/test/auxiliary/issue-13620-2.rs
Normal file
13
src/test/auxiliary/issue-13620-2.rs
Normal file
|
@ -0,0 +1,13 @@
|
|||
// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
extern crate crate1 = "issue-13620-1";
|
||||
|
||||
pub static FOO2: crate1::Foo = crate1::FOO;
|
18
src/test/run-pass/issue-13620.rs
Normal file
18
src/test/run-pass/issue-13620.rs
Normal file
|
@ -0,0 +1,18 @@
|
|||
// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// aux-build:issue-13620-1.rs
|
||||
// aux-build:issue-13620-2.rs
|
||||
|
||||
extern crate crate2 = "issue-13620-2";
|
||||
|
||||
fn main() {
|
||||
(crate2::FOO2.foo)();
|
||||
}
|
Loading…
Add table
Reference in a new issue