diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2021-04-19 18:44:59 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-04-19 18:44:59 -0700 |
| commit | 4630e3891c7c833d8a8f42e3755099b478dce3f3 (patch) | |
| tree | 705e6542c481635149a8e1489964a074483a501f /src/Sema.zig | |
| parent | a136c093bf7a48398e36a73e91213f93a4efc503 (diff) | |
| download | zig-4630e3891c7c833d8a8f42e3755099b478dce3f3.tar.gz zig-4630e3891c7c833d8a8f42e3755099b478dce3f3.zip | |
AstGen: implement inline asm output
Diffstat (limited to 'src/Sema.zig')
| -rw-r--r-- | src/Sema.zig | 24 |
1 files changed, 11 insertions, 13 deletions
diff --git a/src/Sema.zig b/src/Sema.zig index dea89ffef7..1d13261458 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -4337,17 +4337,16 @@ fn zirAsm( const asm_source_src: LazySrcLoc = .{ .node_offset_asm_source = inst_data.src_node }; const ret_ty_src: LazySrcLoc = .{ .node_offset_asm_ret_ty = inst_data.src_node }; const extra = sema.code.extraData(Zir.Inst.Asm, inst_data.payload_index); - const return_type = try sema.resolveType(block, ret_ty_src, extra.data.return_type); const asm_source = try sema.resolveConstString(block, asm_source_src, extra.data.asm_source); var extra_i = extra.end; - const Output = struct { name: []const u8, inst: *Inst }; - const output: ?Output = if (extra.data.output != .none) blk: { - const name = sema.code.nullTerminatedString(sema.code.extra[extra_i]); + const Output = struct { constraint: []const u8, ty: Type }; + const output: ?Output = if (extra.data.output_type != .none) blk: { + const constraint = sema.code.nullTerminatedString(sema.code.extra[extra_i]); extra_i += 1; break :blk Output{ - .name = name, - .inst = try sema.resolveInst(extra.data.output), + .constraint = constraint, + .ty = try sema.resolveType(block, ret_ty_src, extra.data.output_type), }; } else null; @@ -4369,23 +4368,22 @@ fn zirAsm( } try sema.requireRuntimeBlock(block, src); - const asm_tzir = try sema.arena.create(Inst.Assembly); - asm_tzir.* = .{ + const asm_air = try sema.arena.create(Inst.Assembly); + asm_air.* = .{ .base = .{ .tag = .assembly, - .ty = return_type, + .ty = if (output) |o| o.ty else Type.initTag(.void), .src = src, }, .asm_source = asm_source, .is_volatile = is_volatile, - .output = if (output) |o| o.inst else null, - .output_name = if (output) |o| o.name else null, + .output_constraint = if (output) |o| o.constraint else null, .inputs = inputs, .clobbers = clobbers, .args = args, }; - try block.instructions.append(sema.gpa, &asm_tzir.base); - return &asm_tzir.base; + try block.instructions.append(sema.gpa, &asm_air.base); + return &asm_air.base; } fn zirCmp( |
