@@ -1844,12 +1844,12 @@ static LLVMValueRef gen_assign_raw(CodeGen *g, LLVMValueRef ptr, ZigType *ptr_ty
1844
1844
return nullptr ;
1845
1845
}
1846
1846
1847
- static void gen_var_debug_decl (CodeGen *g, ZigVar *var) {
1847
+ static void gen_var_debug_decl (CodeGen *g, ZigVar *var, LLVMValueRef value_ref ) {
1848
1848
assert (var->di_loc_var != nullptr );
1849
1849
AstNode *source_node = var->decl_node ;
1850
1850
ZigLLVMDILocation *debug_loc = ZigLLVMGetDebugLoc ((unsigned )source_node->line + 1 ,
1851
1851
(unsigned )source_node->column + 1 , get_di_scope (g, var->parent_scope ));
1852
- ZigLLVMInsertDeclareAtEnd (g->dbuilder , var-> value_ref , var->di_loc_var , debug_loc,
1852
+ ZigLLVMInsertDeclareAtEnd (g->dbuilder , value_ref, var->di_loc_var , debug_loc,
1853
1853
LLVMGetInsertBlock (g->builder ));
1854
1854
}
1855
1855
@@ -2000,7 +2000,7 @@ static bool iter_function_params_c_abi(CodeGen *g, ZigType *fn_type, FnWalk *fn_
2000
2000
clear_debug_source_node (g);
2001
2001
gen_store_untyped (g, LLVMGetParam (llvm_fn, fn_walk->data .inits .gen_i ), var->value_ref , var->align_bytes , false );
2002
2002
if (var->decl_node ) {
2003
- gen_var_debug_decl (g, var);
2003
+ gen_var_debug_decl (g, var, var-> value_ref );
2004
2004
}
2005
2005
fn_walk->data .inits .gen_i += 1 ;
2006
2006
break ;
@@ -2035,7 +2035,7 @@ static bool iter_function_params_c_abi(CodeGen *g, ZigType *fn_type, FnWalk *fn_
2035
2035
}
2036
2036
case FnWalkIdInits:
2037
2037
if (var->decl_node ) {
2038
- gen_var_debug_decl (g, var);
2038
+ gen_var_debug_decl (g, var, var-> value_ref );
2039
2039
}
2040
2040
fn_walk->data .inits .gen_i += 1 ;
2041
2041
break ;
@@ -2073,7 +2073,7 @@ static bool iter_function_params_c_abi(CodeGen *g, ZigType *fn_type, FnWalk *fn_
2073
2073
}
2074
2074
case FnWalkIdInits:
2075
2075
if (var->decl_node ) {
2076
- gen_var_debug_decl (g, var);
2076
+ gen_var_debug_decl (g, var, var-> value_ref );
2077
2077
}
2078
2078
fn_walk->data .inits .gen_i += 1 ;
2079
2079
break ;
@@ -2111,7 +2111,7 @@ static bool iter_function_params_c_abi(CodeGen *g, ZigType *fn_type, FnWalk *fn_
2111
2111
LLVMValueRef bitcasted = LLVMBuildBitCast (g->builder , var->value_ref , ptr_to_int_type_ref, " " );
2112
2112
gen_store_untyped (g, arg, bitcasted, var->align_bytes , false );
2113
2113
if (var->decl_node ) {
2114
- gen_var_debug_decl (g, var);
2114
+ gen_var_debug_decl (g, var, var-> value_ref );
2115
2115
}
2116
2116
fn_walk->data .inits .gen_i += 1 ;
2117
2117
break ;
@@ -2206,7 +2206,7 @@ void walk_function_params(CodeGen *g, ZigType *fn_type, FnWalk *fn_walk) {
2206
2206
}
2207
2207
2208
2208
if (variable->decl_node ) {
2209
- gen_var_debug_decl (g, variable);
2209
+ gen_var_debug_decl (g, variable, variable-> value_ref );
2210
2210
}
2211
2211
break ;
2212
2212
}
@@ -3175,18 +3175,16 @@ static LLVMValueRef ir_render_bool_not(CodeGen *g, IrExecutable *executable, IrI
3175
3175
return LLVMBuildICmp (g->builder , LLVMIntEQ, value, zero, " " );
3176
3176
}
3177
3177
3178
- static LLVMValueRef ir_render_decl_var (CodeGen *g, IrExecutable *executable,
3179
- IrInstructionDeclVarGen *decl_var_instruction)
3180
- {
3181
- ZigVar *var = decl_var_instruction->var ;
3178
+ static LLVMValueRef ir_render_decl_var (CodeGen *g, IrExecutable *executable, IrInstructionDeclVarGen *instruction) {
3179
+ ZigVar *var = instruction->var ;
3182
3180
3183
3181
if (!type_has_bits (var->value ->type ))
3184
3182
return nullptr ;
3185
3183
3186
3184
if (var->ref_count == 0 && g->build_mode != BuildModeDebug)
3187
3185
return nullptr ;
3188
3186
3189
- gen_var_debug_decl (g, var);
3187
+ gen_var_debug_decl (g, var, ir_llvm_value (g, instruction-> var_ptr ) );
3190
3188
return nullptr ;
3191
3189
}
3192
3190
@@ -5304,7 +5302,7 @@ static LLVMValueRef ir_render_instruction(CodeGen *g, IrExecutable *executable,
5304
5302
case IrInstructionIdStoreResult:
5305
5303
zig_panic (" TODO" );
5306
5304
case IrInstructionIdAlloca:
5307
- zig_panic ( " TODO " );
5305
+ return instruction-> llvm_value ; // handled before function code generation
5308
5306
}
5309
5307
zig_unreachable ();
5310
5308
}
@@ -6194,8 +6192,11 @@ static void do_code_gen(CodeGen *g) {
6194
6192
// allocate temporary stack data
6195
6193
for (size_t alloca_i = 0 ; alloca_i < fn_table_entry->alloca_list .length ; alloca_i += 1 ) {
6196
6194
IrInstructionAlloca *instruction = fn_table_entry->alloca_list .at (alloca_i);
6197
- ZigType *slot_type = instruction->base .value .type ;
6198
- instruction->base .llvm_value = build_alloca (g, slot_type, " " , get_abi_alignment (g, slot_type));
6195
+ ZigType *ptr_type = instruction->base .value .type ;
6196
+ assert (ptr_type->id == ZigTypeIdPointer);
6197
+ ZigType *child_type = ptr_type->data .pointer .child_type ;
6198
+ instruction->base .llvm_value = build_alloca (g, child_type, instruction->name_hint ,
6199
+ get_ptr_align (g, ptr_type));
6199
6200
}
6200
6201
6201
6202
ImportTableEntry *import = get_scope_import (&fn_table_entry->fndef_scope ->base );
@@ -6221,8 +6222,6 @@ static void do_code_gen(CodeGen *g) {
6221
6222
continue ;
6222
6223
6223
6224
if (var->src_arg_index == SIZE_MAX) {
6224
- var->value_ref = build_alloca (g, var->value ->type , buf_ptr (&var->name ), var->align_bytes );
6225
-
6226
6225
var->di_loc_var = ZigLLVMCreateAutoVariable (g->dbuilder , get_di_scope (g, var->parent_scope ),
6227
6226
buf_ptr (&var->name ), import->di_file , (unsigned )(var->decl_node ->line + 1 ),
6228
6227
var->value ->type ->di_type , !g->strip_debug_symbols , 0 );
0 commit comments