From 70b56fa5e9730d0678dff38809363043147c3093 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Wed, 27 Mar 2013 13:53:03 -0700 Subject: [PATCH 1/2] librustc: Allow expr_repeat to be used with any vstore --- src/libcore/rt/context.rs | 2 +- src/librustc/middle/typeck/check/mod.rs | 14 +++++++++----- src/libsyntax/parse/parser.rs | 16 ++++++++-------- src/test/run-pass/expr-repeat-vstore.rs | 23 +++++++++++++++++++++++ 4 files changed, 41 insertions(+), 14 deletions(-) create mode 100644 src/test/run-pass/expr-repeat-vstore.rs diff --git a/src/libcore/rt/context.rs b/src/libcore/rt/context.rs index 7237fe118d8..1a5d99c3404 100644 --- a/src/libcore/rt/context.rs +++ b/src/libcore/rt/context.rs @@ -126,7 +126,7 @@ fn initialize_call_frame(regs: &mut Registers, fptr: *c_void, arg: *c_void, sp: type Registers = [uint, ..22]; #[cfg(target_arch = "x86_64")] -fn new_regs() -> ~Registers { ~[0, .. 22] } +fn new_regs() -> ~Registers { ~([0, .. 22]) } #[cfg(target_arch = "x86_64")] fn initialize_call_frame(regs: &mut Registers, fptr: *c_void, arg: *c_void, sp: *mut uint) { diff --git a/src/librustc/middle/typeck/check/mod.rs b/src/librustc/middle/typeck/check/mod.rs index 90e6b6c88a5..efa11d33f5c 100644 --- a/src/librustc/middle/typeck/check/mod.rs +++ b/src/librustc/middle/typeck/check/mod.rs @@ -2187,17 +2187,21 @@ fn check_loop_body(fcx: @mut FnCtxt, let count = ty::eval_repeat_count(tcx, count_expr); check_expr_with_hint(fcx, count_expr, ty::mk_uint(tcx)); let tt = ast_expr_vstore_to_vstore(fcx, ev, count, vst); + let mutability = match vst { + ast::expr_vstore_mut_box | ast::expr_vstore_mut_slice => { + ast::m_mutbl + } + _ => mutbl + }; let t: ty::t = fcx.infcx().next_ty_var(); check_expr_has_type(fcx, element, t); let arg_t = fcx.expr_ty(element); if ty::type_is_error(arg_t) { ty::mk_err(tcx) - } - else if ty::type_is_bot(arg_t) { + } else if ty::type_is_bot(arg_t) { ty::mk_bot(tcx) - } - else { - ty::mk_evec(tcx, ty::mt {ty: t, mutbl: mutbl}, tt) + } else { + ty::mk_evec(tcx, ty::mt {ty: t, mutbl: mutability}, tt) } } _ => diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index c82151bb4a9..9733cb71d13 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -232,7 +232,7 @@ pub fn Parser(sess: @mut ParseSess, token: @mut copy tok0.tok, span: @mut copy tok0.sp, last_span: @mut copy tok0.sp, - buffer: @mut [copy tok0, .. 4], + buffer: @mut ([copy tok0, .. 4]), buffer_start: @mut 0, buffer_end: @mut 0, tokens_consumed: @mut 0, @@ -1661,12 +1661,11 @@ fn parse_prefix_expr(&self) -> @expr { hi = e.span.hi; // HACK: turn @[...] into a @-evec ex = match e.node { - expr_vec(*) if m == m_mutbl => + expr_vec(*) | expr_repeat(*) if m == m_mutbl => expr_vstore(e, expr_vstore_mut_box), - expr_vec(*) if m == m_imm => expr_vstore(e, expr_vstore_box), - expr_lit(@codemap::spanned { - node: lit_str(_), span: _}) if m == m_imm => - expr_vstore(e, expr_vstore_box), + expr_vec(*) | + expr_lit(@codemap::spanned { node: lit_str(_), span: _}) | + expr_repeat(*) if m == m_imm => expr_vstore(e, expr_vstore_box), _ => expr_unary(box(m), e) }; } @@ -1681,8 +1680,9 @@ fn parse_prefix_expr(&self) -> @expr { hi = e.span.hi; // HACK: turn ~[...] into a ~-evec ex = match e.node { - expr_vec(*) | expr_lit(@codemap::spanned { - node: lit_str(_), span: _}) + expr_vec(*) | + expr_lit(@codemap::spanned { node: lit_str(_), span: _}) | + expr_repeat(*) if m == m_imm => expr_vstore(e, expr_vstore_uniq), _ => expr_unary(uniq(m), e) }; diff --git a/src/test/run-pass/expr-repeat-vstore.rs b/src/test/run-pass/expr-repeat-vstore.rs new file mode 100644 index 00000000000..972b2763b1b --- /dev/null +++ b/src/test/run-pass/expr-repeat-vstore.rs @@ -0,0 +1,23 @@ +use core::io::println; + +fn main() { + let v: ~[int] = ~[ 1, ..5 ]; + println(v[0].to_str()); + println(v[1].to_str()); + println(v[2].to_str()); + println(v[3].to_str()); + println(v[4].to_str()); + let v: @[int] = @[ 2, ..5 ]; + println(v[0].to_str()); + println(v[1].to_str()); + println(v[2].to_str()); + println(v[3].to_str()); + println(v[4].to_str()); + let v: @mut [int] = @mut [ 3, ..5 ]; + println((copy v[0]).to_str()); + println((copy v[1]).to_str()); + println((copy v[2]).to_str()); + println((copy v[3]).to_str()); + println((copy v[4]).to_str()); +} + From 58338dd3d00075301ef2d43aeb0998f53776eebe Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Wed, 27 Mar 2013 15:41:43 -0700 Subject: [PATCH 2/2] librustc: Fix ICE with cross-crate extern statics. rs=bugfix --- src/librustc/middle/trans/base.rs | 6 +++-- src/librustc/middle/trans/common.rs | 4 ++++ src/librustc/middle/trans/expr.rs | 36 +++++++++++++++++++++++++---- 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs index fb05cf0b739..cfbd59073fe 100644 --- a/src/librustc/middle/trans/base.rs +++ b/src/librustc/middle/trans/base.rs @@ -2540,8 +2540,9 @@ pub fn get_item_val(ccx: @CrateContext, id: ast::node_id) -> ValueRef { } } - _ => { - ccx.sess.bug(~"get_item_val(): unexpected variant") + ref variant => { + ccx.sess.bug(fmt!("get_item_val(): unexpected variant: %?", + variant)) } }; if !(exprt || ccx.reachable.contains(&id)) { @@ -3085,6 +3086,7 @@ pub fn trans_crate(sess: session::Session, const_cstr_cache: @mut LinearMap::new(), const_globals: @mut LinearMap::new(), const_values: @mut LinearMap::new(), + extern_const_values: @mut LinearMap::new(), module_data: @mut LinearMap::new(), lltypes: @mut LinearMap::new(), llsizingtypes: @mut LinearMap::new(), diff --git a/src/librustc/middle/trans/common.rs b/src/librustc/middle/trans/common.rs index 5805f7fbe3a..541a950fb55 100644 --- a/src/librustc/middle/trans/common.rs +++ b/src/librustc/middle/trans/common.rs @@ -201,6 +201,10 @@ pub struct CrateContext { // Cache of emitted const values const_values: @mut LinearMap, + + // Cache of external const values + extern_const_values: @mut LinearMap, + module_data: @mut LinearMap<~str, ValueRef>, lltypes: @mut LinearMap, llsizingtypes: @mut LinearMap, diff --git a/src/librustc/middle/trans/expr.rs b/src/librustc/middle/trans/expr.rs index 33576a682a7..80d096da30a 100644 --- a/src/librustc/middle/trans/expr.rs +++ b/src/librustc/middle/trans/expr.rs @@ -124,6 +124,7 @@ use back::abi; use lib; use lib::llvm::{ValueRef, TypeRef, llvm, True}; +use metadata::csearch; use middle::borrowck::root_map_key; use middle::trans::_match; use middle::trans::adt; @@ -150,6 +151,7 @@ use util::common::indenter; use util::ppaux::ty_to_str; +use core::cast::transmute; use core::hashmap::linear::LinearMap; use syntax::print::pprust::{expr_to_str}; use syntax::ast; @@ -1096,11 +1098,35 @@ fn get_did(ccx: @CrateContext, did: ast::def_id) fn get_val(bcx: block, did: ast::def_id, const_ty: ty::t) -> ValueRef { - // The LLVM global has the type of its initializer, - // which may not be equal to the enum's type for - // non-C-like enums. - PointerCast(bcx, base::get_item_val(bcx.ccx(), did.node), - T_ptr(type_of(bcx.ccx(), const_ty))) + if did.crate == ast::local_crate { + // The LLVM global has the type of its initializer, + // which may not be equal to the enum's type for + // non-C-like enums. + PointerCast(bcx, + base::get_item_val(bcx.ccx(), did.node), + T_ptr(type_of(bcx.ccx(), const_ty))) + } else { + // For external constants, we don't inline. + match bcx.ccx().extern_const_values.find(&did) { + None => { + unsafe { + let llty = type_of(bcx.ccx(), const_ty); + let symbol = csearch::get_symbol( + bcx.ccx().sess.cstore, + did); + let llval = llvm::LLVMAddGlobal( + bcx.ccx().llmod, + llty, + transmute::<&u8,*i8>(&symbol[0])); + bcx.ccx().extern_const_values.insert( + did, + llval); + llval + } + } + Some(llval) => *llval + } + } } let did = get_did(ccx, did);