@@ -1049,60 +1049,20 @@ pub const Object = struct {
1049
1049
const aggregate = builder .buildInsertValue (partial , len_param , 1 , "" );
1050
1050
try args .append (aggregate );
1051
1051
},
1052
- .multiple_llvm_ints = > {
1052
+ .multiple_llvm_types = > {
1053
1053
assert (! it .byval_attr );
1054
- const llvm_ints = it .llvm_types_buffer [0.. it .llvm_types_len ];
1054
+ const field_types = it .llvm_types_buffer [0.. it .llvm_types_len ];
1055
1055
const param_ty = fn_info .param_types [it .zig_index - 1 ];
1056
1056
const param_llvm_ty = try dg .lowerType (param_ty );
1057
1057
const param_alignment = param_ty .abiAlignment (target );
1058
1058
const arg_ptr = buildAllocaInner (builder , llvm_func , false , param_llvm_ty , param_alignment , target );
1059
- var field_types_buf : [8 ]* llvm.Type = undefined ;
1060
- const field_types = field_types_buf [0.. llvm_ints .len ];
1061
- for (llvm_ints ) | int_bits , i | {
1062
- field_types [i ] = dg .context .intType (int_bits );
1063
- }
1064
- const ints_llvm_ty = dg .context .structType (field_types .ptr , @intCast (c_uint , field_types .len ), .False );
1065
- const casted_ptr = builder .buildBitCast (arg_ptr , ints_llvm_ty .pointerType (0 ), "" );
1066
- for (llvm_ints ) | _ , field_i_usize | {
1059
+ const llvm_ty = dg .context .structType (field_types .ptr , @intCast (c_uint , field_types .len ), .False );
1060
+ const casted_ptr = builder .buildBitCast (arg_ptr , llvm_ty .pointerType (0 ), "" );
1061
+ for (field_types ) | _ , field_i_usize | {
1067
1062
const field_i = @intCast (c_uint , field_i_usize );
1068
1063
const param = llvm_func .getParam (llvm_arg_i );
1069
1064
llvm_arg_i += 1 ;
1070
- const field_ptr = builder .buildStructGEP (ints_llvm_ty , casted_ptr , field_i , "" );
1071
- const store_inst = builder .buildStore (param , field_ptr );
1072
- store_inst .setAlignment (target .cpu .arch .ptrBitWidth () / 8 );
1073
- }
1074
-
1075
- const is_by_ref = isByRef (param_ty );
1076
- const loaded = if (is_by_ref ) arg_ptr else l : {
1077
- const load_inst = builder .buildLoad (param_llvm_ty , arg_ptr , "" );
1078
- load_inst .setAlignment (param_alignment );
1079
- break :l load_inst ;
1080
- };
1081
- try args .append (loaded );
1082
- },
1083
- .multiple_llvm_float = > {
1084
- assert (! it .byval_attr );
1085
- const llvm_floats = it .llvm_types_buffer [0.. it .llvm_types_len ];
1086
- const param_ty = fn_info .param_types [it .zig_index - 1 ];
1087
- const param_llvm_ty = try dg .lowerType (param_ty );
1088
- const param_alignment = param_ty .abiAlignment (target );
1089
- const arg_ptr = buildAllocaInner (builder , llvm_func , false , param_llvm_ty , param_alignment , target );
1090
- var field_types_buf : [8 ]* llvm.Type = undefined ;
1091
- const field_types = field_types_buf [0.. llvm_floats .len ];
1092
- for (llvm_floats ) | float_bits , i | {
1093
- switch (float_bits ) {
1094
- 64 = > field_types [i ] = dg .context .doubleType (),
1095
- 80 = > field_types [i ] = dg .context .x86FP80Type (),
1096
- else = > {},
1097
- }
1098
- }
1099
- const floats_llvm_ty = dg .context .structType (field_types .ptr , @intCast (c_uint , field_types .len ), .False );
1100
- const casted_ptr = builder .buildBitCast (arg_ptr , floats_llvm_ty .pointerType (0 ), "" );
1101
- for (llvm_floats ) | _ , field_i_usize | {
1102
- const field_i = @intCast (c_uint , field_i_usize );
1103
- const param = llvm_func .getParam (llvm_arg_i );
1104
- llvm_arg_i += 1 ;
1105
- const field_ptr = builder .buildStructGEP (floats_llvm_ty , casted_ptr , field_i , "" );
1065
+ const field_ptr = builder .buildStructGEP (llvm_ty , casted_ptr , field_i , "" );
1106
1066
const store_inst = builder .buildStore (param , field_ptr );
1107
1067
store_inst .setAlignment (target .cpu .arch .ptrBitWidth () / 8 );
1108
1068
}
@@ -2626,8 +2586,7 @@ pub const DeclGen = struct {
2626
2586
// No attributes needed for these.
2627
2587
.no_bits ,
2628
2588
.abi_sized_int ,
2629
- .multiple_llvm_ints ,
2630
- .multiple_llvm_float ,
2589
+ .multiple_llvm_types ,
2631
2590
.as_u16 ,
2632
2591
.float_array ,
2633
2592
.i32_array ,
@@ -3167,25 +3126,8 @@ pub const DeclGen = struct {
3167
3126
llvm_params .appendAssumeCapacity (ptr_llvm_ty );
3168
3127
llvm_params .appendAssumeCapacity (len_llvm_ty );
3169
3128
},
3170
- .multiple_llvm_ints = > {
3171
- const llvm_ints = it .llvm_types_buffer [0.. it .llvm_types_len ];
3172
- try llvm_params .ensureUnusedCapacity (it .llvm_types_len );
3173
- for (llvm_ints ) | int_bits | {
3174
- const big_int_ty = dg .context .intType (int_bits );
3175
- llvm_params .appendAssumeCapacity (big_int_ty );
3176
- }
3177
- },
3178
- .multiple_llvm_float = > {
3179
- const llvm_ints = it .llvm_types_buffer [0.. it .llvm_types_len ];
3180
- try llvm_params .ensureUnusedCapacity (it .llvm_types_len );
3181
- for (llvm_ints ) | float_bits | {
3182
- const float_ty = switch (float_bits ) {
3183
- 64 = > dg .context .doubleType (),
3184
- 80 = > dg .context .x86FP80Type (),
3185
- else = > unreachable ,
3186
- };
3187
- llvm_params .appendAssumeCapacity (float_ty );
3188
- }
3129
+ .multiple_llvm_types = > {
3130
+ try llvm_params .appendSlice (it .llvm_types_buffer [0.. it .llvm_types_len ]);
3189
3131
},
3190
3132
.as_u16 = > {
3191
3133
try llvm_params .append (dg .context .intType (16 ));
@@ -4824,10 +4766,10 @@ pub const FuncGen = struct {
4824
4766
llvm_args .appendAssumeCapacity (ptr );
4825
4767
llvm_args .appendAssumeCapacity (len );
4826
4768
},
4827
- .multiple_llvm_ints = > {
4769
+ .multiple_llvm_types = > {
4828
4770
const arg = args [it .zig_index - 1 ];
4829
4771
const param_ty = self .air .typeOf (arg );
4830
- const llvm_ints = it .llvm_types_buffer [0.. it .llvm_types_len ];
4772
+ const llvm_types = it .llvm_types_buffer [0.. it .llvm_types_len ];
4831
4773
const llvm_arg = try self .resolveInst (arg );
4832
4774
const is_by_ref = isByRef (param_ty );
4833
4775
const arg_ptr = if (is_by_ref ) llvm_arg else p : {
@@ -4837,51 +4779,13 @@ pub const FuncGen = struct {
4837
4779
break :p p ;
4838
4780
};
4839
4781
4840
- var field_types_buf : [8 ]* llvm.Type = undefined ;
4841
- const field_types = field_types_buf [0.. llvm_ints .len ];
4842
- for (llvm_ints ) | int_bits , i | {
4843
- field_types [i ] = self .dg .context .intType (int_bits );
4844
- }
4845
- const ints_llvm_ty = self .dg .context .structType (field_types .ptr , @intCast (c_uint , field_types .len ), .False );
4846
- const casted_ptr = self .builder .buildBitCast (arg_ptr , ints_llvm_ty .pointerType (0 ), "" );
4782
+ const llvm_ty = self .dg .context .structType (llvm_types .ptr , @intCast (c_uint , llvm_types .len ), .False );
4783
+ const casted_ptr = self .builder .buildBitCast (arg_ptr , llvm_ty .pointerType (0 ), "" );
4847
4784
try llvm_args .ensureUnusedCapacity (it .llvm_types_len );
4848
- for (llvm_ints ) | _ , i_usize | {
4785
+ for (llvm_types ) | field_ty , i_usize | {
4849
4786
const i = @intCast (c_uint , i_usize );
4850
- const field_ptr = self .builder .buildStructGEP (ints_llvm_ty , casted_ptr , i , "" );
4851
- const load_inst = self .builder .buildLoad (field_types [i ], field_ptr , "" );
4852
- load_inst .setAlignment (target .cpu .arch .ptrBitWidth () / 8 );
4853
- llvm_args .appendAssumeCapacity (load_inst );
4854
- }
4855
- },
4856
- .multiple_llvm_float = > {
4857
- const arg = args [it .zig_index - 1 ];
4858
- const param_ty = self .air .typeOf (arg );
4859
- const llvm_floats = it .llvm_types_buffer [0.. it .llvm_types_len ];
4860
- const llvm_arg = try self .resolveInst (arg );
4861
- const is_by_ref = isByRef (param_ty );
4862
- const arg_ptr = if (is_by_ref ) llvm_arg else p : {
4863
- const p = self .buildAlloca (llvm_arg .typeOf (), null );
4864
- const store_inst = self .builder .buildStore (llvm_arg , p );
4865
- store_inst .setAlignment (param_ty .abiAlignment (target ));
4866
- break :p p ;
4867
- };
4868
-
4869
- var field_types_buf : [8 ]* llvm.Type = undefined ;
4870
- const field_types = field_types_buf [0.. llvm_floats .len ];
4871
- for (llvm_floats ) | float_bits , i | {
4872
- switch (float_bits ) {
4873
- 64 = > field_types [i ] = self .dg .context .doubleType (),
4874
- 80 = > field_types [i ] = self .dg .context .x86FP80Type (),
4875
- else = > {},
4876
- }
4877
- }
4878
- const floats_llvm_ty = self .dg .context .structType (field_types .ptr , @intCast (c_uint , field_types .len ), .False );
4879
- const casted_ptr = self .builder .buildBitCast (arg_ptr , floats_llvm_ty .pointerType (0 ), "" );
4880
- try llvm_args .ensureUnusedCapacity (it .llvm_types_len );
4881
- for (llvm_floats ) | _ , i_usize | {
4882
- const i = @intCast (c_uint , i_usize );
4883
- const field_ptr = self .builder .buildStructGEP (floats_llvm_ty , casted_ptr , i , "" );
4884
- const load_inst = self .builder .buildLoad (field_types [i ], field_ptr , "" );
4787
+ const field_ptr = self .builder .buildStructGEP (llvm_ty , casted_ptr , i , "" );
4788
+ const load_inst = self .builder .buildLoad (field_ty , field_ptr , "" );
4885
4789
load_inst .setAlignment (target .cpu .arch .ptrBitWidth () / 8 );
4886
4790
llvm_args .appendAssumeCapacity (load_inst );
4887
4791
}
@@ -10473,16 +10377,15 @@ const ParamTypeIterator = struct {
10473
10377
llvm_index : u32 ,
10474
10378
target : std.Target ,
10475
10379
llvm_types_len : u32 ,
10476
- llvm_types_buffer : [8 ]u16 ,
10380
+ llvm_types_buffer : [8 ]* llvm.Type ,
10477
10381
byval_attr : bool ,
10478
10382
10479
10383
const Lowering = union (enum ) {
10480
10384
no_bits ,
10481
10385
byval ,
10482
10386
byref ,
10483
10387
abi_sized_int ,
10484
- multiple_llvm_ints ,
10485
- multiple_llvm_float ,
10388
+ multiple_llvm_types ,
10486
10389
slice ,
10487
10390
as_u16 ,
10488
10391
float_array : u8 ,
@@ -10515,7 +10418,7 @@ const ParamTypeIterator = struct {
10515
10418
it .zig_index += 1 ;
10516
10419
return .no_bits ;
10517
10420
}
10518
-
10421
+ const dg = it . dg ;
10519
10422
switch (it .fn_info .cc ) {
10520
10423
.Unspecified , .Inline = > {
10521
10424
it .zig_index += 1 ;
@@ -10584,28 +10487,28 @@ const ParamTypeIterator = struct {
10584
10487
it .llvm_index += 1 ;
10585
10488
return .byval ;
10586
10489
}
10587
- var llvm_types_buffer : [8 ]u16 = undefined ;
10490
+ var llvm_types_buffer : [8 ]* llvm.Type = undefined ;
10588
10491
var llvm_types_index : u32 = 0 ;
10589
10492
for (classes ) | class | {
10590
10493
switch (class ) {
10591
10494
.integer = > {
10592
- llvm_types_buffer [llvm_types_index ] = 64 ;
10495
+ llvm_types_buffer [llvm_types_index ] = dg . context . intType ( 64 ) ;
10593
10496
llvm_types_index += 1 ;
10594
10497
},
10595
10498
.sse = > {
10596
- llvm_types_buffer [llvm_types_index ] = 64 ;
10499
+ llvm_types_buffer [llvm_types_index ] = dg . context . doubleType () ;
10597
10500
llvm_types_index += 1 ;
10598
10501
},
10599
10502
.sseup = > {
10600
- llvm_types_buffer [llvm_types_index ] = 64 ;
10503
+ llvm_types_buffer [llvm_types_index ] = dg . context . doubleType () ;
10601
10504
llvm_types_index += 1 ;
10602
10505
},
10603
10506
.x87 = > {
10604
- llvm_types_buffer [llvm_types_index ] = 80 ;
10507
+ llvm_types_buffer [llvm_types_index ] = dg . context . x86FP80Type () ;
10605
10508
llvm_types_index += 1 ;
10606
10509
},
10607
10510
.x87up = > {
10608
- llvm_types_buffer [llvm_types_index ] = 80 ;
10511
+ llvm_types_buffer [llvm_types_index ] = dg . context . x86FP80Type () ;
10609
10512
llvm_types_index += 1 ;
10610
10513
},
10611
10514
.complex_x87 = > {
@@ -10625,7 +10528,7 @@ const ParamTypeIterator = struct {
10625
10528
it .llvm_types_len = llvm_types_index ;
10626
10529
it .llvm_index += llvm_types_index ;
10627
10530
it .zig_index += 1 ;
10628
- return if ( classes [ 0 ] == .integer ) .multiple_llvm_ints else .multiple_llvm_float ;
10531
+ return .multiple_llvm_types ;
10629
10532
},
10630
10533
},
10631
10534
.wasm32 = > {
@@ -10649,8 +10552,8 @@ const ParamTypeIterator = struct {
10649
10552
.byval = > return .byval ,
10650
10553
.integer = > {
10651
10554
it .llvm_types_len = 1 ;
10652
- it .llvm_types_buffer [0 ] = 64 ;
10653
- return .multiple_llvm_ints ;
10555
+ it .llvm_types_buffer [0 ] = dg . context . intType ( 64 ) ;
10556
+ return .multiple_llvm_types ;
10654
10557
},
10655
10558
.double_integer = > return Lowering { .i64_array = 2 },
10656
10559
}
0 commit comments