commit 389d1177a57a442b7814d9fdede2a088c614b69d (tree)
parent 97779442d0a551d96f2a0b1799e96944918af32e
Author: LemonBoy <thatlemon@gmail.com>
Date: Tue, 4 May 2021 18:43:31 +0200
stage1: Fix LLVM error in inline asm invocation
Pointer types need an extra indirection layer during the generation of
the function prototype for inline asm blocks.
Closes #3606
Diffstat:
2 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/src/stage1/codegen.cpp b/src/stage1/codegen.cpp
@@ -4880,6 +4880,9 @@ static LLVMValueRef ir_render_asm_gen(CodeGen *g, IrExecutableGen *executable, I
type_ref = get_llvm_type(g, wider_type);
value_ref = gen_widen_or_shorten(g, false, type, wider_type, value_ref);
}
+ } else if (handle_is_ptr(g, type)) {
+ ZigType *gen_type = get_pointer_to_type(g, type, true);
+ type_ref = get_llvm_type(g, gen_type);
}
param_types[param_index] = type_ref;
@@ -9296,7 +9299,6 @@ static void init(CodeGen *g) {
char *layout_str = LLVMCopyStringRepOfTargetData(g->target_data_ref);
LLVMSetDataLayout(g->module, layout_str);
-
assert(g->pointer_size_bytes == LLVMPointerSize(g->target_data_ref));
g->is_big_endian = (LLVMByteOrder(g->target_data_ref) == LLVMBigEndian);
diff --git a/test/stage1/behavior/asm.zig b/test/stage1/behavior/asm.zig
@@ -87,6 +87,21 @@ test "sized integer/float in asm input" {
);
}
+test "struct/array/union types as input values" {
+ asm volatile (""
+ :
+ : [_] "m" (@as([1]u32, undefined))
+ ); // fails
+ asm volatile (""
+ :
+ : [_] "m" (@as(struct { x: u32, y: u8 }, undefined))
+ ); // fails
+ asm volatile (""
+ :
+ : [_] "m" (@as(union { x: u32, y: u8 }, undefined))
+ ); // fails
+}
+
extern fn this_is_my_alias() i32;
export fn derp() i32 {