Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions src/librustc_trans/callee.rs
Original file line number Diff line number Diff line change
Expand Up @@ -582,15 +582,19 @@ fn get_fn<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>,
debug!("get_fn: not casting pointer!");

attributes::from_fn_attrs(ccx, attrs, llfn);
if let Some(id) = local_item {
if local_item.is_some() {
// FIXME(eddyb) Doubt all extern fn should allow unwinding.
attributes::unwind(llfn, true);
ccx.item_symbols().borrow_mut().insert(id, sym);
}

llfn
};

// Always insert into item_symbols, in case this item is exported.
if let Some(id) = local_item {
ccx.item_symbols().borrow_mut().insert(id, sym);
}

ccx.instances().borrow_mut().insert(instance, llfn);

immediate_rvalue(llfn, fn_ptr_ty)
Expand Down
27 changes: 27 additions & 0 deletions src/test/auxiliary/foreign_lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
// except according to those terms.

#![crate_name="foreign_lib"]

#![feature(libc)]

pub mod rustrt {
Expand All @@ -19,3 +20,29 @@ pub mod rustrt {
pub fn rust_get_test_int() -> libc::intptr_t;
}
}

pub mod rustrt2 {
extern crate libc;

extern {
pub fn rust_get_test_int() -> libc::intptr_t;
}
}

pub mod rustrt3 {
// Different type, but same ABI (on all supported platforms).
// Ensures that we don't ICE or trigger LLVM asserts when
// importing the same symbol under different types.
// See https://github.com/rust-lang/rust/issues/32740.
extern {
pub fn rust_get_test_int() -> *const u8;
}
}

pub fn local_uses() {
unsafe {
let x = rustrt::rust_get_test_int();
assert_eq!(x, rustrt2::rust_get_test_int());
assert_eq!(x as *const _, rustrt3::rust_get_test_int());
}
}
37 changes: 7 additions & 30 deletions src/test/run-pass/foreign-dupe.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,41 +8,18 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

// calling pin_thread and that's having weird side-effects.
// aux-build:foreign_lib.rs

#![feature(libc)]
// Check that we can still call duplicated extern (imported) functions
// which were declared in another crate. See issues #32740 and #32783.

mod rustrt1 {
extern crate libc;

#[link(name = "rust_test_helpers")]
extern {
pub fn rust_get_test_int() -> libc::intptr_t;
}
}

mod rustrt2 {
extern crate libc;

extern {
pub fn rust_get_test_int() -> libc::intptr_t;
}
}

mod rustrt3 {
// Different type, but same ABI (on all supported platforms).
// Ensures that we don't ICE or trigger LLVM asserts when
// importing the same symbol under different types.
// See https://github.com/rust-lang/rust/issues/32740.
extern {
pub fn rust_get_test_int() -> *const u8;
}
}
extern crate foreign_lib;

pub fn main() {
unsafe {
let x = rustrt1::rust_get_test_int();
assert_eq!(x, rustrt2::rust_get_test_int());
assert_eq!(x as *const _, rustrt3::rust_get_test_int());
let x = foreign_lib::rustrt::rust_get_test_int();
assert_eq!(x, foreign_lib::rustrt2::rust_get_test_int());
assert_eq!(x as *const _, foreign_lib::rustrt3::rust_get_test_int());
}
}