@@ -94,6 +94,9 @@ fn classify_ty(ty: TypeRef) -> ~[x86_64_reg_class] {
94
94
fn struct_tys ( ty : TypeRef ) -> ~[ TypeRef ] {
95
95
unsafe {
96
96
let n = llvm:: LLVMCountStructElementTypes ( ty) ;
97
+ if ( n == 0 ) {
98
+ return ~[ ] ;
99
+ }
97
100
let mut elts = vec:: from_elem ( n as uint , ptr:: null ( ) ) ;
98
101
llvm:: LLVMGetStructElementTypes ( ty,
99
102
ptr:: to_mut_unsafe_ptr ( & mut elts[ 0 ] ) ) ;
@@ -111,7 +114,7 @@ fn classify_ty(ty: TypeRef) -> ~[x86_64_reg_class] {
111
114
Float => 4 ,
112
115
Double => 8 ,
113
116
Struct => {
114
- do vec:: foldl ( 0 , struct_tys ( ty) ) |a, t| {
117
+ do vec:: foldl ( 1 , struct_tys ( ty) ) |a, t| {
115
118
uint:: max ( a, ty_align ( * t) )
116
119
}
117
120
}
@@ -184,15 +187,11 @@ fn classify_ty(ty: TypeRef) -> ~[x86_64_reg_class] {
184
187
fn classify_struct ( tys : & [ TypeRef ] ,
185
188
cls : & [ mut x86_64_reg_class ] , i : uint ,
186
189
off : uint ) {
187
- if vec:: is_empty ( tys) {
188
- classify ( T_i64 ( ) , cls, i, off) ;
189
- } else {
190
- let mut field_off = off;
191
- for vec:: each( tys) |ty| {
192
- field_off = align ( field_off, * ty) ;
193
- classify ( * ty, cls, i, field_off) ;
194
- field_off += ty_size ( * ty) ;
195
- }
190
+ let mut field_off = off;
191
+ for vec:: each( tys) |ty| {
192
+ field_off = align ( field_off, * ty) ;
193
+ classify ( * ty, cls, i, field_off) ;
194
+ field_off += ty_size ( * ty) ;
196
195
}
197
196
}
198
197
@@ -378,13 +377,14 @@ fn x86_64_tys(atys: &[TypeRef],
378
377
}
379
378
380
379
fn is_pass_byval ( cls : & [ x86_64_reg_class ] ) -> bool {
381
- return cls[ 0 ] == memory_class ||
382
- cls[ 0 ] == x87_class ||
383
- cls[ 0 ] == complex_x87_class;
380
+ return cls. len ( ) > 0 &&
381
+ ( cls[ 0 ] == memory_class ||
382
+ cls[ 0 ] == x87_class ||
383
+ cls[ 0 ] == complex_x87_class) ;
384
384
}
385
385
386
386
fn is_ret_bysret ( cls : & [ x86_64_reg_class ] ) -> bool {
387
- return cls[ 0 ] == memory_class;
387
+ return cls. len ( ) > 0 && cls [ 0 ] == memory_class;
388
388
}
389
389
390
390
fn x86_64_ty ( ty : TypeRef ,
0 commit comments