aboutsummaryrefslogtreecommitdiff
path: root/src/codegen/llvm.zig
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-09-02 20:26:33 +0300
committerVeikka Tuominen <git@vexu.eu>2022-09-03 01:04:46 +0300
commitb83c037f9ffd7a4285de41c95827615fcbdbbf2f (patch)
tree25b6f3ce249c9b77603a47647fc9d658980da08a /src/codegen/llvm.zig
parent6aee07c1446f3ce98d326998c887fbca3b7fd945 (diff)
downloadzig-b83c037f9ffd7a4285de41c95827615fcbdbbf2f.tar.gz
zig-b83c037f9ffd7a4285de41c95827615fcbdbbf2f.zip
Sema: only ABI sized packed structs are extern compatible
Diffstat (limited to 'src/codegen/llvm.zig')
-rw-r--r--src/codegen/llvm.zig57
1 files changed, 23 insertions, 34 deletions
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig
index 5f8d1539a6..e7f4e123e3 100644
--- a/src/codegen/llvm.zig
+++ b/src/codegen/llvm.zig
@@ -9674,22 +9674,7 @@ fn lowerFnRetTy(dg: *DeclGen, fn_info: Type.Payload.Function.Data) !*const llvm.
}
},
.C => {
- const is_scalar = switch (fn_info.return_type.zigTypeTag()) {
- .Void,
- .Bool,
- .NoReturn,
- .Int,
- .Float,
- .Pointer,
- .Optional,
- .ErrorSet,
- .Enum,
- .AnyFrame,
- .Vector,
- => true,
-
- else => false,
- };
+ const is_scalar = isScalar(fn_info.return_type);
switch (target.cpu.arch) {
.mips, .mipsel => return dg.lowerType(fn_info.return_type),
.x86_64 => switch (target.os.tag) {
@@ -9837,24 +9822,7 @@ const ParamTypeIterator = struct {
@panic("TODO implement async function lowering in the LLVM backend");
},
.C => {
- const is_scalar = switch (ty.zigTypeTag()) {
- .Void,
- .Bool,
- .NoReturn,
- .Int,
- .Float,
- .Pointer,
- .Optional,
- .ErrorSet,
- .Enum,
- .AnyFrame,
- .Vector,
- => true,
- .Struct => ty.containerLayout() == .Packed,
- .Union => ty.containerLayout() == .Packed,
-
- else => false,
- };
+ const is_scalar = isScalar(ty);
switch (it.target.cpu.arch) {
.riscv32, .riscv64 => {
it.zig_index += 1;
@@ -10108,6 +10076,27 @@ fn isByRef(ty: Type) bool {
}
}
+fn isScalar(ty: Type) bool {
+ return switch (ty.zigTypeTag()) {
+ .Void,
+ .Bool,
+ .NoReturn,
+ .Int,
+ .Float,
+ .Pointer,
+ .Optional,
+ .ErrorSet,
+ .Enum,
+ .AnyFrame,
+ .Vector,
+ => true,
+
+ .Struct => ty.containerLayout() == .Packed,
+ .Union => ty.containerLayout() == .Packed,
+ else => false,
+ };
+}
+
/// This function returns true if we expect LLVM to lower x86_fp80 correctly
/// and false if we expect LLVM to crash if it counters an x86_fp80 type.
fn backendSupportsF80(target: std.Target) bool {