aboutsummaryrefslogtreecommitdiff
path: root/src/link
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-07-08 02:04:53 -0400
committerGitHub <noreply@github.com>2021-07-08 02:04:53 -0400
commit62d27fcfb687e3ab1f10c72513e19529d8ffceed (patch)
tree2885da99ca325959e40f417346aca63ddef4fb31 /src/link
parent7935e83b1d5d29cca058597ebdac6dfd012a790a (diff)
parentc2e66d9bab396a69514ec7c3c41fb0404e542f21 (diff)
downloadzig-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.zig10
-rw-r--r--src/link/C/zig.h6
-rw-r--r--src/link/Elf.zig23
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);
},
}