diff options
| author | bors <bors@rust-lang.org> | 2013-10-03 04:26:32 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2013-10-03 04:26:32 -0700 |
| commit | e08391c3f1933a290ec38c6d6f6d21befba3f756 (patch) | |
| tree | 0a84e7dcd826f3e20554d1985ac3322492093a69 | |
| parent | 6d598989f62c15b6093cdaf116f2f6318ed1b95c (diff) | |
| parent | f504461a40d0f6fd88983be6d744c8d62b430506 (diff) | |
| download | rust-e08391c3f1933a290ec38c6d6f6d21befba3f756.tar.gz rust-e08391c3f1933a290ec38c6d6f6d21befba3f756.zip | |
auto merge of #9699 : thestinger/rust/immediate, r=huonw,luqmana
struct Foo;
fn foo() -> Foo { Foo }
Before:
; Function Attrs: nounwind readnone uwtable
define void @_ZN3foo18he8ca29755dedebbaf4v0.0E(%struct.Foo* noalias nocapture sret, { i64, %tydesc*, i8*, i8*, i8 }* nocapture) #0 {
"function top level":
ret void
}
After:
; Function Attrs: nounwind readnone uwtable
define %struct.Foo @_ZN3foo18he8ca29755dedebbaf4v0.0E({ i64, %tydesc*, i8*, i8*, i8 }* nocapture readnone) #0 {
"function top level":
ret %struct.Foo undef
}
| -rw-r--r-- | src/librustc/middle/trans/common.rs | 7 | ||||
| -rw-r--r-- | src/librustc/middle/trans/expr.rs | 4 | ||||
| -rw-r--r-- | src/librustc/middle/trans/foreign.rs | 2 | ||||
| -rw-r--r-- | src/librustc/middle/trans/intrinsic.rs | 10 |
4 files changed, 14 insertions, 9 deletions
diff --git a/src/librustc/middle/trans/common.rs b/src/librustc/middle/trans/common.rs index bbed6324543..ddfcd2630fa 100644 --- a/src/librustc/middle/trans/common.rs +++ b/src/librustc/middle/trans/common.rs @@ -69,12 +69,11 @@ pub fn type_is_immediate(ccx: &mut CrateContext, ty: ty::t) -> bool { if simple { return true; } - // FIXME: #9651: C-like enums should also be immediate - if ty::type_is_c_like_enum(ccx.tcx, ty) { - return false; - } match ty::get(ty).sty { // FIXME: #9651: small `ty_struct` should also be immediate + ty::ty_struct(def_id, ref substs) => { + ty::struct_fields(tcx, def_id, substs).is_empty() + } ty::ty_enum(*) | ty::ty_tup(*) => { let llty = sizing_type_of(ccx, ty); llsize_of_alloc(ccx, llty) <= llsize_of_alloc(ccx, ccx.int_type) diff --git a/src/librustc/middle/trans/expr.rs b/src/librustc/middle/trans/expr.rs index 60a2b08758d..098f0e3db7c 100644 --- a/src/librustc/middle/trans/expr.rs +++ b/src/librustc/middle/trans/expr.rs @@ -1727,7 +1727,9 @@ fn trans_imm_cast(bcx: @mut Block, expr: &ast::Expr, (cast_enum, cast_float) => { let bcx = bcx; let repr = adt::represent_type(ccx, t_in); - let lldiscrim_a = adt::trans_get_discr(bcx, repr, llexpr); + let slot = Alloca(bcx, ll_t_in, ""); + Store(bcx, llexpr, slot); + let lldiscrim_a = adt::trans_get_discr(bcx, repr, slot); match k_out { cast_integral => int_cast(bcx, ll_t_out, val_ty(lldiscrim_a), diff --git a/src/librustc/middle/trans/foreign.rs b/src/librustc/middle/trans/foreign.rs index c5f9e8fdee0..4676af3d808 100644 --- a/src/librustc/middle/trans/foreign.rs +++ b/src/librustc/middle/trans/foreign.rs @@ -222,7 +222,7 @@ pub fn trans_native_call(bcx: @mut Block, // Ensure that we always have the Rust value indirectly, // because it makes bitcasting easier. if !rust_indirect { - let scratch = base::alloca(bcx, arg_tys[i].ty, "__arg"); + let scratch = base::alloca(bcx, type_of::type_of(ccx, fn_sig.inputs[i]), "__arg"); Store(bcx, llarg_rust, scratch); llarg_rust = scratch; } diff --git a/src/librustc/middle/trans/intrinsic.rs b/src/librustc/middle/trans/intrinsic.rs index bff05a8720d..f081bef69fa 100644 --- a/src/librustc/middle/trans/intrinsic.rs +++ b/src/librustc/middle/trans/intrinsic.rs @@ -12,7 +12,7 @@ use back::{abi}; use lib::llvm::{SequentiallyConsistent, Acquire, Release, Xchg}; -use lib::llvm::{ValueRef, Pointer}; +use lib::llvm::{ValueRef, Pointer, Array, Struct}; use lib; use middle::trans::base::*; use middle::trans::build::*; @@ -333,8 +333,12 @@ pub fn trans_intrinsic(ccx: @mut CrateContext, (Pointer, other) | (other, Pointer) if other != Pointer => { let tmp = Alloca(bcx, llouttype, ""); Store(bcx, llsrcval, PointerCast(bcx, tmp, llintype.ptr_to())); - let ll_load = Load(bcx, tmp); - Ret(bcx, ll_load); + Ret(bcx, Load(bcx, tmp)); + } + (Array, _) | (_, Array) | (Struct, _) | (_, Struct) => { + let tmp = Alloca(bcx, llouttype, ""); + Store(bcx, llsrcval, PointerCast(bcx, tmp, llintype.ptr_to())); + Ret(bcx, Load(bcx, tmp)); } _ => { let llbitcast = BitCast(bcx, llsrcval, llouttype); |
