mirror of
https://github.com/ziglang/zig.git
synced 2025-12-17 11:43:16 +00:00
stage1: Add missing bitcast when rendering var ptr
Some types require this extra bitcast, eg. structs or unions with extra padding fields inserted by the compiler. Fixes #7250
This commit is contained in:
parent
be2adff087
commit
0a4a99ec87
@ -3893,15 +3893,30 @@ static LLVMValueRef ir_render_vector_store_elem(CodeGen *g, IrExecutableGen *exe
|
|||||||
}
|
}
|
||||||
|
|
||||||
static LLVMValueRef ir_render_var_ptr(CodeGen *g, IrExecutableGen *executable, IrInstGenVarPtr *instruction) {
|
static LLVMValueRef ir_render_var_ptr(CodeGen *g, IrExecutableGen *executable, IrInstGenVarPtr *instruction) {
|
||||||
if (instruction->base.value->special != ConstValSpecialRuntime)
|
Error err;
|
||||||
return ir_llvm_value(g, &instruction->base);
|
|
||||||
ZigVar *var = instruction->var;
|
ZigType *ptr_type = instruction->base.value->type;
|
||||||
if (type_has_bits(g, var->var_type)) {
|
assert(ptr_type->id == ZigTypeIdPointer);
|
||||||
assert(var->value_ref);
|
bool ptr_type_has_bits;
|
||||||
return var->value_ref;
|
if ((err = type_has_bits2(g, ptr_type, &ptr_type_has_bits)))
|
||||||
} else {
|
codegen_report_errors_and_exit(g);
|
||||||
|
|
||||||
|
if (!ptr_type_has_bits) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The extra bitcasts are needed in case the LLVM value is an unnamed
|
||||||
|
// struct, as it happens when rendering container types with extra alignment
|
||||||
|
// fields.
|
||||||
|
if (instruction->base.value->special != ConstValSpecialRuntime) {
|
||||||
|
return LLVMBuildBitCast(g->builder, ir_llvm_value(g, &instruction->base),
|
||||||
|
get_llvm_type(g, ptr_type), "");
|
||||||
|
}
|
||||||
|
|
||||||
|
ZigVar *var = instruction->var;
|
||||||
|
assert(var->value_ref);
|
||||||
|
return LLVMBuildBitCast(g->builder, var->value_ref,
|
||||||
|
get_llvm_type(g, ptr_type), "");
|
||||||
}
|
}
|
||||||
|
|
||||||
static LLVMValueRef ir_render_return_ptr(CodeGen *g, IrExecutableGen *executable,
|
static LLVMValueRef ir_render_return_ptr(CodeGen *g, IrExecutableGen *executable,
|
||||||
|
|||||||
@ -60,6 +60,7 @@ comptime {
|
|||||||
_ = @import("behavior/bugs/7027.zig");
|
_ = @import("behavior/bugs/7027.zig");
|
||||||
_ = @import("behavior/bugs/7047.zig");
|
_ = @import("behavior/bugs/7047.zig");
|
||||||
_ = @import("behavior/bugs/7003.zig");
|
_ = @import("behavior/bugs/7003.zig");
|
||||||
|
_ = @import("behavior/bugs/7250.zig");
|
||||||
_ = @import("behavior/bugs/394.zig");
|
_ = @import("behavior/bugs/394.zig");
|
||||||
_ = @import("behavior/bugs/421.zig");
|
_ = @import("behavior/bugs/421.zig");
|
||||||
_ = @import("behavior/bugs/529.zig");
|
_ = @import("behavior/bugs/529.zig");
|
||||||
|
|||||||
15
test/stage1/behavior/bugs/7250.zig
Normal file
15
test/stage1/behavior/bugs/7250.zig
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
const nrfx_uart_t = extern struct {
|
||||||
|
p_reg: [*c]u32,
|
||||||
|
drv_inst_idx: u8,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub fn nrfx_uart_rx(p_instance: [*c]const nrfx_uart_t) void {}
|
||||||
|
|
||||||
|
threadlocal var g_uart0 = nrfx_uart_t{
|
||||||
|
.p_reg = 0,
|
||||||
|
.drv_inst_idx = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
test "reference a global threadlocal variable" {
|
||||||
|
_ = nrfx_uart_rx(&g_uart0);
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user