auto merge of #8185 : alexcrichton/rust/issue-8179, r=pcwalton
* All globals marked as `pub` won't have the `internal` linkage type set * All global references across crates are forced to use the address of the global in the other crate via an external reference. r? @graydon Closes #8179
This commit is contained in:
commit
ecefeb03cc
4 changed files with 58 additions and 17 deletions
|
@ -2458,7 +2458,7 @@ pub fn get_item_val(ccx: @mut CrateContext, id: ast::NodeId) -> ValueRef {
|
|||
// LLVM type is not fully determined by the Rust type.
|
||||
let v = consts::const_expr(ccx, expr);
|
||||
ccx.const_values.insert(id, v);
|
||||
exprt = m == ast::m_mutbl;
|
||||
exprt = (m == ast::m_mutbl || i.vis == ast::public);
|
||||
|
||||
unsafe {
|
||||
let llty = llvm::LLVMTypeOf(v);
|
||||
|
|
|
@ -115,7 +115,7 @@ return type, such as `while` loops or assignments (`a = b`).
|
|||
|
||||
|
||||
use back::abi;
|
||||
use lib::llvm::{ValueRef, llvm};
|
||||
use lib::llvm::{ValueRef, llvm, SetLinkage, ExternalLinkage};
|
||||
use lib;
|
||||
use metadata::csearch;
|
||||
use middle::trans::_match;
|
||||
|
@ -132,7 +132,6 @@ use middle::trans::consts;
|
|||
use middle::trans::controlflow;
|
||||
use middle::trans::datum::*;
|
||||
use middle::trans::debuginfo;
|
||||
use middle::trans::inline;
|
||||
use middle::trans::machine;
|
||||
use middle::trans::meth;
|
||||
use middle::trans::tvec;
|
||||
|
@ -148,7 +147,6 @@ use middle::trans::machine::llsize_of;
|
|||
|
||||
use middle::trans::type_::Type;
|
||||
|
||||
use std::cast::transmute;
|
||||
use std::hashmap::HashMap;
|
||||
use std::vec;
|
||||
use syntax::print::pprust::{expr_to_str};
|
||||
|
@ -936,20 +934,10 @@ fn trans_lvalue_unadjusted(bcx: @mut Block, expr: @ast::expr) -> DatumBlock {
|
|||
//! Translates a reference to a path.
|
||||
|
||||
let _icx = push_ctxt("trans_def_lvalue");
|
||||
let ccx = bcx.ccx();
|
||||
match def {
|
||||
ast::def_static(did, _) => {
|
||||
let const_ty = expr_ty(bcx, ref_expr);
|
||||
|
||||
fn get_did(ccx: @mut CrateContext, did: ast::def_id)
|
||||
-> ast::def_id {
|
||||
if did.crate != ast::LOCAL_CRATE {
|
||||
inline::maybe_instantiate_inline(ccx, did)
|
||||
} else {
|
||||
did
|
||||
}
|
||||
}
|
||||
|
||||
fn get_val(bcx: @mut Block, did: ast::def_id, const_ty: ty::t)
|
||||
-> ValueRef {
|
||||
// For external constants, we don't inline.
|
||||
|
@ -976,8 +964,12 @@ fn trans_lvalue_unadjusted(bcx: @mut Block, expr: @ast::expr) -> DatumBlock {
|
|||
let symbol = csearch::get_symbol(
|
||||
bcx.ccx().sess.cstore,
|
||||
did);
|
||||
let llval = llvm::LLVMAddGlobal( bcx.ccx().llmod, llty.to_ref(),
|
||||
transmute::<&u8,*i8>(&symbol[0]));
|
||||
let llval = do symbol.as_c_str |buf| {
|
||||
llvm::LLVMAddGlobal(bcx.ccx().llmod,
|
||||
llty.to_ref(),
|
||||
buf)
|
||||
};
|
||||
SetLinkage(llval, ExternalLinkage);
|
||||
let extern_const_values = &mut bcx.ccx().extern_const_values;
|
||||
extern_const_values.insert(did, llval);
|
||||
llval
|
||||
|
@ -985,7 +977,6 @@ fn trans_lvalue_unadjusted(bcx: @mut Block, expr: @ast::expr) -> DatumBlock {
|
|||
}
|
||||
}
|
||||
|
||||
let did = get_did(ccx, did);
|
||||
let val = get_val(bcx, did, const_ty);
|
||||
DatumBlock {
|
||||
bcx: bcx,
|
||||
|
|
23
src/test/auxiliary/xcrate_static_addresses.rs
Normal file
23
src/test/auxiliary/xcrate_static_addresses.rs
Normal file
|
@ -0,0 +1,23 @@
|
|||
// Copyright 2013 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 static global: int = 3;
|
||||
|
||||
pub fn verify_same(a: &'static int) {
|
||||
let a = a as *int as uint;
|
||||
let b = &global as *int as uint;
|
||||
assert_eq!(a, b);
|
||||
}
|
||||
|
||||
condition!{ pub test: int -> (); }
|
||||
|
||||
pub fn raise() {
|
||||
test::cond.raise(3);
|
||||
}
|
27
src/test/run-pass/xcrate-static-addresses.rs
Normal file
27
src/test/run-pass/xcrate-static-addresses.rs
Normal file
|
@ -0,0 +1,27 @@
|
|||
// Copyright 2013 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.
|
||||
|
||||
// xfail-fast
|
||||
// aux-build:xcrate_static_addresses.rs
|
||||
|
||||
extern mod xcrate_static_addresses;
|
||||
|
||||
use other = xcrate_static_addresses;
|
||||
|
||||
pub fn main() {
|
||||
other::verify_same(&other::global);
|
||||
|
||||
// Previously this fail'd because there were two addresses that were being
|
||||
// used when declaring constants.
|
||||
do other::test::cond.trap(|_| {
|
||||
}).inside {
|
||||
other::raise();
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue