Skip to content

Commit 9616b3d

Browse files
committed
auto merge of #5089 : sanxiyn/rust/llvm-struct, r=pcwalton
Note on `struct_elt`: the comment is wrong, it actually dereferences the nth element of LLVM struct type if it is a pointer. That's why `T_ptr` is removed in `callee.rs`.
2 parents 580df4d + ad414de commit 9616b3d

File tree

5 files changed

+11
-47
lines changed

5 files changed

+11
-47
lines changed

src/librustc/lib/llvm.rs

+9-15
Original file line numberDiff line numberDiff line change
@@ -1379,12 +1379,7 @@ pub fn type_to_str_inner(names: @TypeNames, +outer0: &[TypeRef], ty: TypeRef)
13791379
type_to_str_inner(names, outer, out_ty)).to_managed();
13801380
}
13811381
Struct => {
1382-
let n_elts = llvm::LLVMCountStructElementTypes(ty) as uint;
1383-
let mut elts = vec::from_elem(n_elts, 0 as TypeRef);
1384-
if !elts.is_empty() {
1385-
llvm::LLVMGetStructElementTypes(
1386-
ty, ptr::to_mut_unsafe_ptr(&mut elts[0]));
1387-
}
1382+
let elts = struct_tys(ty);
13881383
// See [Note at-str]
13891384
return fmt!("{%s}", tys_str(names, outer, elts)).to_managed();
13901385
}
@@ -1445,17 +1440,16 @@ pub fn fn_ty_param_tys(fn_ty: TypeRef) -> ~[TypeRef] {
14451440
}
14461441
}
14471442

1448-
pub fn struct_element_types(struct_ty: TypeRef) -> ~[TypeRef] {
1443+
pub fn struct_tys(struct_ty: TypeRef) -> ~[TypeRef] {
14491444
unsafe {
1450-
let count = llvm::LLVMCountStructElementTypes(struct_ty);
1451-
let mut buf: ~[TypeRef] =
1452-
vec::from_elem(count as uint,
1453-
cast::transmute::<uint,TypeRef>(0));
1454-
if buf.len() > 0 {
1455-
llvm::LLVMGetStructElementTypes(
1456-
struct_ty, ptr::to_mut_unsafe_ptr(&mut buf[0]));
1445+
let n_elts = llvm::LLVMCountStructElementTypes(struct_ty) as uint;
1446+
if n_elts == 0 {
1447+
return ~[];
14571448
}
1458-
return buf;
1449+
let mut elts = vec::from_elem(n_elts, ptr::null());
1450+
llvm::LLVMGetStructElementTypes(
1451+
struct_ty, ptr::to_mut_unsafe_ptr(&mut elts[0]));
1452+
return elts;
14591453
}
14601454
}
14611455

src/librustc/middle/trans/base.rs

-5
Original file line numberDiff line numberDiff line change
@@ -2171,11 +2171,6 @@ pub fn trans_mod(ccx: @CrateContext, m: ast::_mod) {
21712171
}
21722172
}
21732173
2174-
pub fn get_pair_fn_ty(llpairty: TypeRef) -> TypeRef {
2175-
// Bit of a kludge: pick the fn typeref out of the pair.
2176-
return struct_elt(llpairty, 0u);
2177-
}
2178-
21792174
pub fn register_fn(ccx: @CrateContext,
21802175
sp: span,
21812176
+path: path,

src/librustc/middle/trans/cabi_x86_64.rs

+1-13
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use lib::llvm::{llvm, TypeRef, ValueRef, Integer, Pointer, Float, Double};
1515
use lib::llvm::{Struct, Array, Attribute};
1616
use lib::llvm::{StructRetAttribute, ByValAttribute};
17+
use lib::llvm::struct_tys;
1718
use middle::trans::common::*;
1819
use middle::trans::cabi::*;
1920

@@ -65,19 +66,6 @@ fn classify_ty(ty: TypeRef) -> ~[x86_64_reg_class] {
6566
return (off + a - 1u) / a * a;
6667
}
6768

68-
fn struct_tys(ty: TypeRef) -> ~[TypeRef] {
69-
unsafe {
70-
let n = llvm::LLVMCountStructElementTypes(ty);
71-
if (n == 0) {
72-
return ~[];
73-
}
74-
let mut elts = vec::from_elem(n as uint, ptr::null());
75-
llvm::LLVMGetStructElementTypes(ty,
76-
ptr::to_mut_unsafe_ptr(&mut elts[0]));
77-
return elts;
78-
}
79-
}
80-
8169
fn ty_align(ty: TypeRef) -> uint {
8270
unsafe {
8371
return match llvm::LLVMGetTypeKind(ty) {

src/librustc/middle/trans/callee.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ pub fn trans_rtcall_or_lang_call_with_type_params(bcx: block,
380380
fty);
381381
let mut llfnty = type_of::type_of(callee.bcx.ccx(),
382382
substituted);
383-
llfnty = T_ptr(struct_elt(llfnty, 0));
383+
llfnty = lib::llvm::struct_tys(llfnty)[0];
384384
new_llval = PointerCast(callee.bcx, fn_data.llfn, llfnty);
385385
}
386386
_ => fail!()

src/librustc/middle/trans/common.rs

-13
Original file line numberDiff line numberDiff line change
@@ -647,19 +647,6 @@ pub fn val_str(tn: @TypeNames, v: ValueRef) -> @str {
647647
return ty_str(tn, val_ty(v));
648648
}
649649

650-
// Returns the nth element of the given LLVM structure type.
651-
pub fn struct_elt(llstructty: TypeRef, n: uint) -> TypeRef {
652-
unsafe {
653-
let elt_count = llvm::LLVMCountStructElementTypes(llstructty) as uint;
654-
assert (n < elt_count);
655-
let mut elt_tys = vec::from_elem(elt_count, T_nil());
656-
llvm::LLVMGetStructElementTypes(
657-
llstructty,
658-
ptr::to_mut_unsafe_ptr(&mut elt_tys[0]));
659-
return llvm::LLVMGetElementType(elt_tys[n]);
660-
}
661-
}
662-
663650
pub fn in_scope_cx(cx: block, f: &fn(&mut scope_info)) {
664651
let mut cur = cx;
665652
loop {

0 commit comments

Comments
 (0)