Skip to content

Commit

Permalink
rustc: Crawl static initializers for reachability
Browse files Browse the repository at this point in the history
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
  • Loading branch information
alexcrichton committed May 2, 2014
1 parent b5d6b07 commit 18ac265
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 1 deletion.
3 changes: 2 additions & 1 deletion src/librustc/middle/reachable.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
19 changes: 19 additions & 0 deletions src/test/auxiliary/issue-13620-1.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 13 additions & 0 deletions src/test/auxiliary/issue-13620-2.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 18 additions & 0 deletions src/test/run-pass/issue-13620.rs
Original file line number Diff line number Diff line change
@@ -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)();
}

5 comments on commit 18ac265

@bors
Copy link
Contributor

@bors bors commented on 18ac265 May 3, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

saw approval from luqmana
at alexcrichton@18ac265

@bors
Copy link
Contributor

@bors bors commented on 18ac265 May 3, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

merging alexcrichton/rust/issue-13620 = 18ac265 into auto

@bors
Copy link
Contributor

@bors bors commented on 18ac265 May 3, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

alexcrichton/rust/issue-13620 = 18ac265 merged ok, testing candidate = afed55b

@bors
Copy link
Contributor

@bors bors commented on 18ac265 May 4, 2014

@bors
Copy link
Contributor

@bors bors commented on 18ac265 May 4, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fast-forwarding master to auto = afed55b

Please sign in to comment.