diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs index 42221cb08b6..fd875451b22 100644 --- a/src/librustc/middle/trans/base.rs +++ b/src/librustc/middle/trans/base.rs @@ -2460,7 +2460,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); diff --git a/src/librustc/middle/trans/expr.rs b/src/librustc/middle/trans/expr.rs index b657f162cc3..8e832d9ff3d 100644 --- a/src/librustc/middle/trans/expr.rs +++ b/src/librustc/middle/trans/expr.rs @@ -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, diff --git a/src/test/auxiliary/xcrate_static_addresses.rs b/src/test/auxiliary/xcrate_static_addresses.rs new file mode 100644 index 00000000000..3a05462d856 --- /dev/null +++ b/src/test/auxiliary/xcrate_static_addresses.rs @@ -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 or the MIT license +// , 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); +} diff --git a/src/test/run-pass/xcrate-static-addresses.rs b/src/test/run-pass/xcrate-static-addresses.rs new file mode 100644 index 00000000000..059a6f75ac8 --- /dev/null +++ b/src/test/run-pass/xcrate-static-addresses.rs @@ -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 or the MIT license +// , 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(); + } +}