diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2021-07-08 02:04:53 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-07-08 02:04:53 -0400 |
| commit | 62d27fcfb687e3ab1f10c72513e19529d8ffceed (patch) | |
| tree | 2885da99ca325959e40f417346aca63ddef4fb31 /src/link | |
| parent | 7935e83b1d5d29cca058597ebdac6dfd012a790a (diff) | |
| parent | c2e66d9bab396a69514ec7c3c41fb0404e542f21 (diff) | |
| download | zig-62d27fcfb687e3ab1f10c72513e19529d8ffceed.tar.gz zig-62d27fcfb687e3ab1f10c72513e19529d8ffceed.zip | |
Merge pull request #9325 from ziglang/stage2-inferred-error-sets
Stage2 inferred error sets and `@panic`
Diffstat (limited to 'src/link')
| -rw-r--r-- | src/link/C.zig | 10 | ||||
| -rw-r--r-- | src/link/C/zig.h | 6 | ||||
| -rw-r--r-- | src/link/Elf.zig | 23 |
3 files changed, 27 insertions, 12 deletions
diff --git a/src/link/C.zig b/src/link/C.zig index 1793b95210..875fd2e964 100644 --- a/src/link/C.zig +++ b/src/link/C.zig @@ -207,7 +207,7 @@ pub fn flushModule(self: *C, comp: *Compilation) !void { } var fn_count: usize = 0; - var typedefs = std.HashMap(Type, []const u8, Type.HashContext, std.hash_map.default_max_load_percentage).init(comp.gpa); + var typedefs = std.HashMap(Type, void, Type.HashContext, std.hash_map.default_max_load_percentage).init(comp.gpa); defer typedefs.deinit(); // Typedefs, forward decls and non-functions first. @@ -217,14 +217,12 @@ pub fn flushModule(self: *C, comp: *Compilation) !void { if (!decl.has_tv) continue; const buf = buf: { if (decl.val.castTag(.function)) |_| { + try typedefs.ensureUnusedCapacity(decl.fn_link.c.typedefs.count()); var it = decl.fn_link.c.typedefs.iterator(); while (it.next()) |new| { - if (typedefs.get(new.key_ptr.*)) |previous| { - try err_typedef_writer.print("typedef {s} {s};\n", .{ previous, new.value_ptr.name }); - } else { - try typedefs.ensureCapacity(typedefs.capacity() + 1); + const gop = typedefs.getOrPutAssumeCapacity(new.key_ptr.*); + if (!gop.found_existing) { try err_typedef_writer.writeAll(new.value_ptr.rendered); - typedefs.putAssumeCapacityNoClobber(new.key_ptr.*, new.value_ptr.name); } } fn_count += 1; diff --git a/src/link/C/zig.h b/src/link/C/zig.h index ad2b5d4498..a3e571d245 100644 --- a/src/link/C/zig.h +++ b/src/link/C/zig.h @@ -12,6 +12,12 @@ #define zig_threadlocal zig_threadlocal_unavailable #endif +#if __GNUC__ +#define ZIG_COLD __attribute__ ((cold)) +#else +#define ZIG_COLD +#endif + #if __STDC_VERSION__ >= 199901L #define ZIG_RESTRICT restrict #elif defined(__GNUC__) diff --git a/src/link/Elf.zig b/src/link/Elf.zig index 722077b8b8..d754b478b9 100644 --- a/src/link/Elf.zig +++ b/src/link/Elf.zig @@ -2505,11 +2505,7 @@ fn addDbgInfoType(self: *Elf, ty: Type, dbg_info_buffer: *std.ArrayList(u8)) !vo abbrev_base_type, DW.ATE_boolean, // DW.AT_encoding , DW.FORM_data1 1, // DW.AT_byte_size, DW.FORM_data1 - 'b', - 'o', - 'o', - 'l', - 0, // DW.AT_name, DW.FORM_string + 'b', 'o', 'o', 'l', 0, // DW.AT_name, DW.FORM_string }); }, .Int => { @@ -2526,8 +2522,23 @@ fn addDbgInfoType(self: *Elf, ty: Type, dbg_info_buffer: *std.ArrayList(u8)) !vo // DW.AT_name, DW.FORM_string try dbg_info_buffer.writer().print("{}\x00", .{ty}); }, + .Optional => { + if (ty.isPtrLikeOptional()) { + try dbg_info_buffer.ensureCapacity(dbg_info_buffer.items.len + 12); + dbg_info_buffer.appendAssumeCapacity(abbrev_base_type); + // DW.AT_encoding, DW.FORM_data1 + dbg_info_buffer.appendAssumeCapacity(DW.ATE_address); + // DW.AT_byte_size, DW.FORM_data1 + dbg_info_buffer.appendAssumeCapacity(@intCast(u8, ty.abiSize(self.base.options.target))); + // DW.AT_name, DW.FORM_string + try dbg_info_buffer.writer().print("{}\x00", .{ty}); + } else { + log.err("TODO implement .debug_info for type '{}'", .{ty}); + try dbg_info_buffer.append(abbrev_pad1); + } + }, else => { - std.log.scoped(.compiler).err("TODO implement .debug_info for type '{}'", .{ty}); + log.err("TODO implement .debug_info for type '{}'", .{ty}); try dbg_info_buffer.append(abbrev_pad1); }, } |
