@@ -50,12 +50,12 @@ fn emit_direct_ptr_va_arg(
50
50
51
51
let aligned_size = size. align_to ( slot_size) . bytes ( ) as i32 ;
52
52
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] ) ;
54
54
bx. store ( next, va_list_addr, bx. tcx ( ) . data_layout . pointer_align . abi ) ;
55
55
56
56
if size. bytes ( ) < slot_size. bytes ( ) && bx. tcx ( ) . sess . target . endian == Endian :: Big {
57
57
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] ) ;
59
59
( bx. bitcast ( adjusted, bx. cx ( ) . type_ptr_to ( llty) ) , addr_align)
60
60
} else {
61
61
( bx. bitcast ( addr, bx. cx ( ) . type_ptr_to ( llty) ) , addr_align)
@@ -98,6 +98,7 @@ fn emit_aapcs_va_arg(
98
98
// Implementation of the AAPCS64 calling convention for va_args see
99
99
// https://github.com/ARM-software/abi-aa/blob/master/aapcs64/aapcs64.rst
100
100
let va_list_addr = list. immediate ( ) ;
101
+ let va_list_ty = list. deref ( bx. cx ) . layout . llvm_type ( bx) ;
101
102
let layout = bx. cx . layout_of ( target_ty) ;
102
103
103
104
let mut maybe_reg = bx. build_sibling_block ( "va_arg.maybe_reg" ) ;
@@ -109,11 +110,11 @@ fn emit_aapcs_va_arg(
109
110
110
111
let gr_type = target_ty. is_any_ptr ( ) || target_ty. is_integral ( ) ;
111
112
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 ) ;
113
114
let nreg = ( layout. size . bytes ( ) + 7 ) / 8 ;
114
115
( gr_offs, 3 , nreg * 8 )
115
116
} 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 ) ;
117
118
let nreg = ( layout. size . bytes ( ) + 15 ) / 16 ;
118
119
( vr_off, 5 , nreg * 16 )
119
120
} ;
@@ -141,15 +142,15 @@ fn emit_aapcs_va_arg(
141
142
maybe_reg. cond_br ( use_stack, & on_stack. llbb ( ) , & in_reg. llbb ( ) ) ;
142
143
143
144
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) ;
145
146
let top = in_reg. load ( top_type, top, bx. tcx ( ) . data_layout . pointer_align . abi ) ;
146
147
147
148
// 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] ) ;
149
150
if bx. tcx ( ) . sess . target . endian == Endian :: Big && layout. size . bytes ( ) != slot_size {
150
151
// On big-endian systems the value is right-aligned in its slot.
151
152
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] ) ;
153
154
}
154
155
let reg_type = layout. llvm_type ( bx) ;
155
156
let reg_addr = in_reg. bitcast ( reg_addr, bx. cx . type_ptr_to ( reg_type) ) ;
0 commit comments