mirror of
https://github.com/ziglang/zig.git
synced 2024-11-28 16:12:33 +00:00
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
This commit is contained in:
parent
97779442d0
commit
389d1177a5
@ -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);
|
||||
|
||||
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user