aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-03-31 00:38:19 +0300
committerAndrew Kelley <andrew@ziglang.org>2022-03-31 01:33:28 -0400
commit75c2cff40ef5c758ec18455324a50378684aff85 (patch)
treedbad1cafdd53fcab11e9be52aa27702b9bbb1345 /src/Sema.zig
parent6655c6092efbdc8b1aeb89ff9f7a8b05f736916a (diff)
downloadzig-75c2cff40ef5c758ec18455324a50378684aff85.tar.gz
zig-75c2cff40ef5c758ec18455324a50378684aff85.zip
stage2: handle assembly input names
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig20
1 files changed, 10 insertions, 10 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 112939c995..9f5d6d5f9e 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -10295,15 +10295,12 @@ fn zirAsm(
};
const args = try sema.arena.alloc(Air.Inst.Ref, inputs_len);
- const inputs = try sema.arena.alloc([]const u8, inputs_len);
+ const inputs = try sema.arena.alloc(struct { c: []const u8, n: []const u8 }, inputs_len);
for (args) |*arg, arg_i| {
const input = sema.code.extraData(Zir.Inst.Asm.Input, extra_i);
extra_i = input.end;
- const name = sema.code.nullTerminatedString(input.data.name);
- _ = name; // TODO: use the name
-
const uncasted_arg = sema.resolveInst(input.data.operand);
const uncasted_arg_ty = sema.typeOf(uncasted_arg);
switch (uncasted_arg_ty.zigTypeTag()) {
@@ -10313,8 +10310,9 @@ fn zirAsm(
}
const constraint = sema.code.nullTerminatedString(input.data.constraint);
- needed_capacity += constraint.len / 4 + 1;
- inputs[arg_i] = constraint;
+ const name = sema.code.nullTerminatedString(input.data.name);
+ needed_capacity += (constraint.len + name.len + 1) / 4 + 1;
+ inputs[arg_i] = .{ .c = constraint, .n = name };
}
const clobbers = try sema.arena.alloc([]const u8, clobbers_len);
@@ -10353,11 +10351,13 @@ fn zirAsm(
buffer[o.constraint.len] = 0;
sema.air_extra.items.len += o.constraint.len / 4 + 1;
}
- for (inputs) |constraint| {
+ for (inputs) |input| {
const buffer = mem.sliceAsBytes(sema.air_extra.unusedCapacitySlice());
- mem.copy(u8, buffer, constraint);
- buffer[constraint.len] = 0;
- sema.air_extra.items.len += constraint.len / 4 + 1;
+ mem.copy(u8, buffer, input.c);
+ buffer[input.c.len] = 0;
+ mem.copy(u8, buffer[input.c.len + 1 ..], input.n);
+ buffer[input.c.len + 1 + input.n.len] = 0;
+ sema.air_extra.items.len += (input.c.len + input.n.len + 1) / 4 + 1;
}
for (clobbers) |clobber| {
const buffer = mem.sliceAsBytes(sema.air_extra.unusedCapacitySlice());