@@ -50,12 +50,12 @@ fn emit_direct_ptr_va_arg(
5050
5151 let aligned_size = size. align_to ( slot_size) . bytes ( ) as i32 ;
5252 let full_direct_size = bx. cx ( ) . const_i32 ( aligned_size) ;
53- let next = bx. inbounds_gep ( addr, & [ full_direct_size] ) ;
53+ let next = bx. inbounds_gep ( bx . type_i8 ( ) , addr, & [ full_direct_size] ) ;
5454 bx. store ( next, va_list_addr, bx. tcx ( ) . data_layout . pointer_align . abi ) ;
5555
5656 if size. bytes ( ) < slot_size. bytes ( ) && bx. tcx ( ) . sess . target . endian == Endian :: Big {
5757 let adjusted_size = bx. cx ( ) . const_i32 ( ( slot_size. bytes ( ) - size. bytes ( ) ) as i32 ) ;
58- let adjusted = bx. inbounds_gep ( addr, & [ adjusted_size] ) ;
58+ let adjusted = bx. inbounds_gep ( bx . type_i8 ( ) , addr, & [ adjusted_size] ) ;
5959 ( bx. bitcast ( adjusted, bx. cx ( ) . type_ptr_to ( llty) ) , addr_align)
6060 } else {
6161 ( bx. bitcast ( addr, bx. cx ( ) . type_ptr_to ( llty) ) , addr_align)
@@ -98,6 +98,7 @@ fn emit_aapcs_va_arg(
9898 // Implementation of the AAPCS64 calling convention for va_args see
9999 // https://github.com/ARM-software/abi-aa/blob/master/aapcs64/aapcs64.rst
100100 let va_list_addr = list. immediate ( ) ;
101+ let va_list_ty = list. deref ( bx. cx ) . layout . llvm_type ( bx) ;
101102 let layout = bx. cx . layout_of ( target_ty) ;
102103
103104 let mut maybe_reg = bx. build_sibling_block ( "va_arg.maybe_reg" ) ;
@@ -109,11 +110,11 @@ fn emit_aapcs_va_arg(
109110
110111 let gr_type = target_ty. is_any_ptr ( ) || target_ty. is_integral ( ) ;
111112 let ( reg_off, reg_top_index, slot_size) = if gr_type {
112- let gr_offs = bx. struct_gep ( va_list_addr, 7 ) ;
113+ let gr_offs = bx. struct_gep ( va_list_ty , va_list_addr, 7 ) ;
113114 let nreg = ( layout. size . bytes ( ) + 7 ) / 8 ;
114115 ( gr_offs, 3 , nreg * 8 )
115116 } else {
116- let vr_off = bx. struct_gep ( va_list_addr, 9 ) ;
117+ let vr_off = bx. struct_gep ( va_list_ty , va_list_addr, 9 ) ;
117118 let nreg = ( layout. size . bytes ( ) + 15 ) / 16 ;
118119 ( vr_off, 5 , nreg * 16 )
119120 } ;
@@ -141,15 +142,15 @@ fn emit_aapcs_va_arg(
141142 maybe_reg. cond_br ( use_stack, & on_stack. llbb ( ) , & in_reg. llbb ( ) ) ;
142143
143144 let top_type = bx. type_i8p ( ) ;
144- let top = in_reg. struct_gep ( va_list_addr, reg_top_index) ;
145+ let top = in_reg. struct_gep ( va_list_ty , va_list_addr, reg_top_index) ;
145146 let top = in_reg. load ( top_type, top, bx. tcx ( ) . data_layout . pointer_align . abi ) ;
146147
147148 // reg_value = *(@top + reg_off_v);
148- let mut reg_addr = in_reg. gep ( top, & [ reg_off_v] ) ;
149+ let mut reg_addr = in_reg. gep ( bx . type_i8 ( ) , top, & [ reg_off_v] ) ;
149150 if bx. tcx ( ) . sess . target . endian == Endian :: Big && layout. size . bytes ( ) != slot_size {
150151 // On big-endian systems the value is right-aligned in its slot.
151152 let offset = bx. const_i32 ( ( slot_size - layout. size . bytes ( ) ) as i32 ) ;
152- reg_addr = in_reg. gep ( reg_addr, & [ offset] ) ;
153+ reg_addr = in_reg. gep ( bx . type_i8 ( ) , reg_addr, & [ offset] ) ;
153154 }
154155 let reg_type = layout. llvm_type ( bx) ;
155156 let reg_addr = in_reg. bitcast ( reg_addr, bx. cx . type_ptr_to ( reg_type) ) ;
0 commit comments