From 8fcc28d30275bf76313765616a2d2bdcaeb4faf2 Mon Sep 17 00:00:00 2001 From: Jacob Young Date: Mon, 19 Jun 2023 01:18:40 -0400 Subject: [PATCH] Module: add support for multiple global asm blocks per decl Closes #16076 --- src/Module.zig | 14 ++++++++------ test/behavior/asm.zig | 3 +++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/Module.zig b/src/Module.zig index 8d9f9593dd..563e122ebc 100644 --- a/src/Module.zig +++ b/src/Module.zig @@ -6636,12 +6636,14 @@ fn markDeclIndexAlive(mod: *Module, decl_index: Decl.Index) Allocator.Error!void } pub fn addGlobalAssembly(mod: *Module, decl_index: Decl.Index, source: []const u8) !void { - try mod.global_assembly.ensureUnusedCapacity(mod.gpa, 1); - - const duped_source = try mod.gpa.dupe(u8, source); - errdefer mod.gpa.free(duped_source); - - mod.global_assembly.putAssumeCapacityNoClobber(decl_index, duped_source); + const gop = try mod.global_assembly.getOrPut(mod.gpa, decl_index); + if (gop.found_existing) { + const new_value = try std.fmt.allocPrint(mod.gpa, "{s}\n{s}", .{ gop.value_ptr.*, source }); + mod.gpa.free(gop.value_ptr.*); + gop.value_ptr.* = new_value; + } else { + gop.value_ptr.* = try mod.gpa.dupe(u8, source); + } } pub fn wantDllExports(mod: Module) bool { diff --git a/test/behavior/asm.zig b/test/behavior/asm.zig index e365936798..28a011dbd5 100644 --- a/test/behavior/asm.zig +++ b/test/behavior/asm.zig @@ -12,6 +12,9 @@ comptime { { asm ( \\.globl this_is_my_alias; + ); + // test multiple asm per comptime block + asm ( \\.type this_is_my_alias, @function; \\.set this_is_my_alias, derp; );