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 {
54335433 const llvm_params_len = inputs.len + outputs.len - return_count;
54345434 const llvm_param_types = try arena.alloc(*const llvm.Type, llvm_params_len);
54355435 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);
54365437 const target = self.dg.module.getTarget();
54375438
54385439 var llvm_param_i: usize = 0;
......@@ -5461,6 +5462,7 @@ pub const FuncGen = struct {
54615462 const output_inst = try self.resolveInst(output);
54625463 llvm_param_values[llvm_param_i] = output_inst;
54635464 llvm_param_types[llvm_param_i] = output_inst.typeOf();
5465 llvm_param_attrs[llvm_param_i] = true;
54645466 llvm_param_i += 1;
54655467 }
54665468
......@@ -5530,6 +5532,11 @@ pub const FuncGen = struct {
55305532 if (!std.mem.eql(u8, name, "_")) {
55315533 name_map.putAssumeCapacityNoClobber(name, {});
55325534 }
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
55335540 llvm_param_i += 1;
55345541 total_i += 1;
55355542 }
......@@ -5622,7 +5629,7 @@ pub const FuncGen = struct {
56225629 .ATT,
56235630 .False,
56245631 );
5625 return self.builder.buildCall(
5632 const call = self.builder.buildCall(
56265633 asm_fn,
56275634 llvm_param_values.ptr,
56285635 @intCast(c_uint, llvm_param_values.len),
......@@ -5630,6 +5637,13 @@ pub const FuncGen = struct {
56305637 .Auto,
56315638 "",
56325639 );
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;
56335647 }
56345648
56355649 fn airIsNonNull(
src/codegen/llvm/bindings.zig+3
......@@ -1320,6 +1320,9 @@ extern fn ZigLLVMWriteImportLibrary(
13201320 kill_at: bool,
13211321) bool;
13221322
1323pub const setCallElemTypeAttr = ZigLLVMSetCallElemTypeAttr;
1324extern fn ZigLLVMSetCallElemTypeAttr(Call: *const Value, arg_index: usize, return_type: *const Type) void;
1325
13231326pub const Linkage = enum(c_uint) {
13241327 External,
13251328 AvailableExternally,