@@ -94,6 +94,9 @@ fn classify_ty(ty: TypeRef) -> ~[x86_64_reg_class] {
9494 fn struct_tys ( ty : TypeRef ) -> ~[ TypeRef ] {
9595 unsafe {
9696 let n = llvm:: LLVMCountStructElementTypes ( ty) ;
97+ if ( n == 0 ) {
98+ return ~[ ] ;
99+ }
97100 let mut elts = vec:: from_elem ( n as uint , ptr:: null ( ) ) ;
98101 llvm:: LLVMGetStructElementTypes ( ty,
99102 ptr:: to_mut_unsafe_ptr ( & mut elts[ 0 ] ) ) ;
@@ -111,7 +114,7 @@ fn classify_ty(ty: TypeRef) -> ~[x86_64_reg_class] {
111114 Float => 4 ,
112115 Double => 8 ,
113116 Struct => {
114- do vec:: foldl ( 0 , struct_tys ( ty) ) |a, t| {
117+ do vec:: foldl ( 1 , struct_tys ( ty) ) |a, t| {
115118 uint:: max ( a, ty_align ( * t) )
116119 }
117120 }
@@ -184,15 +187,11 @@ fn classify_ty(ty: TypeRef) -> ~[x86_64_reg_class] {
184187 fn classify_struct ( tys : & [ TypeRef ] ,
185188 cls : & [ mut x86_64_reg_class ] , i : uint ,
186189 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) ;
196195 }
197196 }
198197
@@ -378,13 +377,14 @@ fn x86_64_tys(atys: &[TypeRef],
378377 }
379378
380379 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) ;
384384 }
385385
386386 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;
388388 }
389389
390390 fn x86_64_ty ( ty : TypeRef ,
0 commit comments