authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-07-03 11:37:31-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-07-03 11:37:31-07:00
logb1873f20744dfa9b5402b936ccc0858d7ef01529
treeff063b27f92cdd455406ea092c2e70dd847c9ed1
parentfcf77e06eab5e8b63a9778500c3f08a9ba8631f4

LLVM: update inline asm to LLVM14 semantics

This is the equivalent of d19290e603833a197bc8bfc8315561ec77291225 applied to stage2 instead of stage1.

2 files changed, 18 insertions(+), 1 deletions(-)

src/codegen/llvm.zig+15-1
...@@ -5433,6 +5433,7 @@ pub const FuncGen = struct {...@@ -5433,6 +5433,7 @@ pub const FuncGen = struct {
5433 const llvm_params_len = inputs.len + outputs.len - return_count;5433 const llvm_params_len = inputs.len + outputs.len - return_count;
5434 const llvm_param_types = try arena.alloc(*const llvm.Type, llvm_params_len);5434 const llvm_param_types = try arena.alloc(*const llvm.Type, llvm_params_len);
5435 const llvm_param_values = try arena.alloc(*const llvm.Value, llvm_params_len);5435 const llvm_param_values = try arena.alloc(*const llvm.Value, llvm_params_len);
5436 const llvm_param_attrs = try arena.alloc(bool, llvm_params_len);
5436 const target = self.dg.module.getTarget();5437 const target = self.dg.module.getTarget();
54375438
5438 var llvm_param_i: usize = 0;5439 var llvm_param_i: usize = 0;
...@@ -5461,6 +5462,7 @@ pub const FuncGen = struct {...@@ -5461,6 +5462,7 @@ pub const FuncGen = struct {
5461 const output_inst = try self.resolveInst(output);5462 const output_inst = try self.resolveInst(output);
5462 llvm_param_values[llvm_param_i] = output_inst;5463 llvm_param_values[llvm_param_i] = output_inst;
5463 llvm_param_types[llvm_param_i] = output_inst.typeOf();5464 llvm_param_types[llvm_param_i] = output_inst.typeOf();
5465 llvm_param_attrs[llvm_param_i] = true;
5464 llvm_param_i += 1;5466 llvm_param_i += 1;
5465 }5467 }
54665468
...@@ -5530,6 +5532,11 @@ pub const FuncGen = struct {...@@ -5530,6 +5532,11 @@ pub const FuncGen = struct {
5530 if (!std.mem.eql(u8, name, "_")) {5532 if (!std.mem.eql(u8, name, "_")) {
5531 name_map.putAssumeCapacityNoClobber(name, {});5533 name_map.putAssumeCapacityNoClobber(name, {});
5532 }5534 }
5535
5536 // In the case of indirect inputs, LLVM requires the callsite to have
5537 // an elementtype(<ty>) attribute.
5538 llvm_param_attrs[llvm_param_i] = constraint[0] == '*';
5539
5533 llvm_param_i += 1;5540 llvm_param_i += 1;
5534 total_i += 1;5541 total_i += 1;
5535 }5542 }
...@@ -5622,7 +5629,7 @@ pub const FuncGen = struct {...@@ -5622,7 +5629,7 @@ pub const FuncGen = struct {
5622 .ATT,5629 .ATT,
5623 .False,5630 .False,
5624 );5631 );
5625 return self.builder.buildCall(5632 const call = self.builder.buildCall(
5626 asm_fn,5633 asm_fn,
5627 llvm_param_values.ptr,5634 llvm_param_values.ptr,
5628 @intCast(c_uint, llvm_param_values.len),5635 @intCast(c_uint, llvm_param_values.len),
...@@ -5630,6 +5637,13 @@ pub const FuncGen = struct {...@@ -5630,6 +5637,13 @@ pub const FuncGen = struct {
5630 .Auto,5637 .Auto,
5631 "",5638 "",
5632 );5639 );
5640 for (llvm_param_attrs) |need_elem_ty, i| {
5641 if (need_elem_ty) {
5642 const elem_ty = llvm_param_types[i].getElementType();
5643 llvm.setCallElemTypeAttr(call, i, elem_ty);
5644 }
5645 }
5646 return call;
5633 }5647 }
56345648
5635 fn airIsNonNull(5649 fn airIsNonNull(
src/codegen/llvm/bindings.zig+3
...@@ -1320,6 +1320,9 @@ extern fn ZigLLVMWriteImportLibrary(...@@ -1320,6 +1320,9 @@ extern fn ZigLLVMWriteImportLibrary(
1320 kill_at: bool,1320 kill_at: bool,
1321) bool;1321) bool;
13221322
1323pub const setCallElemTypeAttr = ZigLLVMSetCallElemTypeAttr;
1324extern fn ZigLLVMSetCallElemTypeAttr(Call: *const Value, arg_index: usize, return_type: *const Type) void;
1325
1323pub const Linkage = enum(c_uint) {1326pub const Linkage = enum(c_uint) {
1324 External,1327 External,
1325 AvailableExternally,1328 AvailableExternally,