aboutsummaryrefslogtreecommitdiff
path: root/src/link
diff options
context:
space:
mode:
authorThomas Ives <tom@trives.co.uk>2021-11-02 22:43:51 +0000
committerAndrew Kelley <andrew@ziglang.org>2021-11-10 12:39:47 -0500
commit51efd553ae94fbf958974284a2f30091e4e1a2fa (patch)
tree84f513a2d2cc57ffd0d1b035dac450d25e35a26c /src/link
parent91c3206b45074821749f52043937bf6ed6d9a105 (diff)
downloadzig-51efd553ae94fbf958974284a2f30091e4e1a2fa.tar.gz
zig-51efd553ae94fbf958974284a2f30091e4e1a2fa.zip
C backend: Improve lowering of Zig types to C types
1. Changed Zig pointers to functions to be typedef'd so then we can treat them the same as other types. 2. Distinguished between const slices (zig_L prefix) and mut slices (zig_M prefix). 3. Changed lowering of Zig "const pointers" (e.g. *const u8) to to C "pointers to const" (e.g. const char *) rather than C "const pointers" (e.g. char * const) 4. Ensured that all typedefs are "linked" even if the decl doesn't require any forward declarations 5. Added test that exercises function pointer type rendering 6. Changed .slice_ptr instruction to allocate pointer local rather than a uintptr_t local
Diffstat (limited to 'src/link')
-rw-r--r--src/link/C.zig5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/link/C.zig b/src/link/C.zig
index 611eadb045..5ca389ae62 100644
--- a/src/link/C.zig
+++ b/src/link/C.zig
@@ -362,7 +362,7 @@ fn flushDecl(self: *C, f: *Flush, decl: *const Module.Decl) FlushDeclError!void
const decl_block = self.decl_table.getPtr(decl).?;
const gpa = self.base.allocator;
- if (decl_block.fwd_decl.items.len != 0) {
+ if (decl_block.typedefs.count() != 0) {
try f.typedefs.ensureUnusedCapacity(gpa, @intCast(u32, decl_block.typedefs.count()));
var it = decl_block.typedefs.iterator();
while (it.next()) |new| {
@@ -371,6 +371,9 @@ fn flushDecl(self: *C, f: *Flush, decl: *const Module.Decl) FlushDeclError!void
try f.err_typedef_buf.appendSlice(gpa, new.value_ptr.rendered);
}
}
+ }
+
+ if (decl_block.fwd_decl.items.len != 0) {
const buf = decl_block.fwd_decl.items;
try f.all_buffers.append(gpa, .{
.iov_base = buf.ptr,