aboutsummaryrefslogtreecommitdiff
path: root/src/link
diff options
context:
space:
mode:
authorJacob Young <jacobly0@users.noreply.github.com>2023-02-23 05:16:23 -0500
committerJacob Young <jacobly0@users.noreply.github.com>2023-02-23 10:54:26 -0500
commita0d7fd162b7568c0291ebcfc561a2852c7077e15 (patch)
tree476a76289e5e5a3b25631d2d15e21a704189ead5 /src/link
parent57f6adf85da58c0c91a036deaa614c30df010b78 (diff)
downloadzig-a0d7fd162b7568c0291ebcfc561a2852c7077e15.tar.gz
zig-a0d7fd162b7568c0291ebcfc561a2852c7077e15.zip
CBE: support call attributes
* Support always_tail and never_tail/never_inline with a comptime callee using clang * Support never_inline using gcc * Support never_inline using msvc Unfortunately, can't enable behavior tests because of the conditional support.
Diffstat (limited to 'src/link')
-rw-r--r--src/link/C.zig35
1 files changed, 14 insertions, 21 deletions
diff --git a/src/link/C.zig b/src/link/C.zig
index 262e4e4923..5663ba71e2 100644
--- a/src/link/C.zig
+++ b/src/link/C.zig
@@ -247,8 +247,8 @@ pub fn flushModule(self: *C, comp: *Compilation, prog_node: *std.Progress.Node)
const abi_define = abiDefine(comp);
- // Covers defines, zig.h, ctypes, asm, lazy fwd, lazy code.
- try f.all_buffers.ensureUnusedCapacity(gpa, 6);
+ // Covers defines, zig.h, ctypes, asm, lazy fwd.
+ try f.all_buffers.ensureUnusedCapacity(gpa, 5);
if (abi_define) |buf| f.appendBufAssumeCapacity(buf);
f.appendBufAssumeCapacity(zig_h);
@@ -263,8 +263,8 @@ pub fn flushModule(self: *C, comp: *Compilation, prog_node: *std.Progress.Node)
f.appendBufAssumeCapacity(asm_buf.items);
}
- const lazy_indices = f.all_buffers.items.len;
- f.all_buffers.items.len += 2;
+ const lazy_index = f.all_buffers.items.len;
+ f.all_buffers.items.len += 1;
try self.flushErrDecls(&f.lazy_db);
@@ -297,6 +297,7 @@ pub fn flushModule(self: *C, comp: *Compilation, prog_node: *std.Progress.Node)
{
// We need to flush lazy ctypes after flushing all decls but before flushing any decl ctypes.
+ // This ensures that every lazy CType.Index exactly matches the global CType.Index.
assert(f.ctypes.count() == 0);
try self.flushCTypes(&f, .none, f.lazy_db.ctypes);
@@ -305,30 +306,22 @@ pub fn flushModule(self: *C, comp: *Compilation, prog_node: *std.Progress.Node)
try self.flushCTypes(&f, entry.key_ptr.toOptional(), entry.value_ptr.ctypes);
}
- {
- f.all_buffers.items[lazy_indices + 0] = .{
- .iov_base = if (f.lazy_db.fwd_decl.items.len > 0) f.lazy_db.fwd_decl.items.ptr else "",
- .iov_len = f.lazy_db.fwd_decl.items.len,
- };
- f.file_size += f.lazy_db.fwd_decl.items.len;
-
- f.all_buffers.items[lazy_indices + 1] = .{
- .iov_base = if (f.lazy_db.code.items.len > 0) f.lazy_db.code.items.ptr else "",
- .iov_len = f.lazy_db.code.items.len,
- };
- f.file_size += f.lazy_db.code.items.len;
- }
-
f.all_buffers.items[ctypes_index] = .{
.iov_base = if (f.ctypes_buf.items.len > 0) f.ctypes_buf.items.ptr else "",
.iov_len = f.ctypes_buf.items.len,
};
f.file_size += f.ctypes_buf.items.len;
+ f.all_buffers.items[lazy_index] = .{
+ .iov_base = if (f.lazy_db.fwd_decl.items.len > 0) f.lazy_db.fwd_decl.items.ptr else "",
+ .iov_len = f.lazy_db.fwd_decl.items.len,
+ };
+ f.file_size += f.lazy_db.fwd_decl.items.len;
+
// Now the code.
- try f.all_buffers.ensureUnusedCapacity(gpa, decl_values.len);
- for (decl_values) |decl|
- f.appendBufAssumeCapacity(decl.code.items);
+ try f.all_buffers.ensureUnusedCapacity(gpa, 1 + decl_values.len);
+ f.appendBufAssumeCapacity(f.lazy_db.code.items);
+ for (decl_values) |decl| f.appendBufAssumeCapacity(decl.code.items);
const file = self.base.file.?;
try file.setEndPos(f.file_size);