| author | |
| committer | |
| log | 113f0c9450398655717ea8bb5196a9df88f15000 |
| tree | 0c7aeee019b61f7a95129e56debd5c0f4a55738f |
| parent | 9c9ea935191190471c1b2fd30c8cffde74421456 |
3 files changed, 33 insertions(+), 4 deletions(-)
src/codegen.cpp+10-4| ... | @@ -528,7 +528,15 @@ static LLVMValueRef gen_expr(CodeGen *g, AstNode *node) { | ... | @@ -528,7 +528,15 @@ static LLVMValueRef gen_expr(CodeGen *g, AstNode *node) { |
| 528 | return nullptr; | 528 | return nullptr; |
| 529 | } else { | 529 | } else { |
| 530 | add_debug_source_node(g, node); | 530 | add_debug_source_node(g, node); |
| 531 | return LLVMBuildStore(g->builder, value, variable->value_ref); | 531 | variable->value_ref = LLVMBuildAlloca(g->builder, |
| 532 | variable->type->type_ref, buf_ptr(&variable->name)); | ||
| 533 | LLVMValueRef store_instr = LLVMBuildStore(g->builder, value, variable->value_ref); | ||
| 534 | |||
| 535 | LLVMZigDILocation *debug_loc = LLVMZigGetDebugLoc(node->line + 1, node->column + 1, | ||
| 536 | g->cur_block_context->di_scope); | ||
| 537 | LLVMZigInsertDeclare(g->dbuilder, variable->value_ref, variable->di_loc_var, | ||
| 538 | debug_loc, store_instr); | ||
| 539 | return nullptr; | ||
| 532 | } | 540 | } |
| 533 | } | 541 | } |
| 534 | case NodeTypeCastExpr: | 542 | case NodeTypeCastExpr: |
| ... | @@ -577,6 +585,7 @@ static LLVMValueRef gen_expr(CodeGen *g, AstNode *node) { | ... | @@ -577,6 +585,7 @@ static LLVMValueRef gen_expr(CodeGen *g, AstNode *node) { |
| 577 | if (variable->type == g->builtin_types.entry_void) { | 585 | if (variable->type == g->builtin_types.entry_void) { |
| 578 | return nullptr; | 586 | return nullptr; |
| 579 | } else if (variable->is_ptr) { | 587 | } else if (variable->is_ptr) { |
| 588 | add_debug_source_node(g, node); | ||
| 580 | return LLVMBuildLoad(g->builder, variable->value_ref, ""); | 589 | return LLVMBuildLoad(g->builder, variable->value_ref, ""); |
| 581 | } else { | 590 | } else { |
| 582 | return variable->value_ref; | 591 | return variable->value_ref; |
| ... | @@ -770,9 +779,6 @@ static void do_code_gen(CodeGen *g) { | ... | @@ -770,9 +779,6 @@ static void do_code_gen(CodeGen *g) { |
| 770 | } else { | 779 | } else { |
| 771 | tag = LLVMZigTag_DW_auto_variable(); | 780 | tag = LLVMZigTag_DW_auto_variable(); |
| 772 | arg_no = 0; | 781 | arg_no = 0; |
| 773 | |||
| 774 | add_debug_source_node(g, var->decl_node); | ||
| 775 | var->value_ref = LLVMBuildAlloca(g->builder, var->type->type_ref, buf_ptr(&var->name)); | ||
| 776 | } | 782 | } |
| 777 | 783 | ||
| 778 | var->di_loc_var = LLVMZigCreateLocalVariable(g->dbuilder, tag, | 784 | var->di_loc_var = LLVMZigCreateLocalVariable(g->dbuilder, tag, |
src/zig_llvm.cpp+18| ... | @@ -304,6 +304,24 @@ void LLVMZigRestoreInsertPoint(LLVMBuilderRef builder, LLVMZigInsertionPoint *ip | ... | @@ -304,6 +304,24 @@ void LLVMZigRestoreInsertPoint(LLVMBuilderRef builder, LLVMZigInsertionPoint *ip |
| 304 | unwrap(builder)->restoreIP(*ip); | 304 | unwrap(builder)->restoreIP(*ip); |
| 305 | } | 305 | } |
| 306 | 306 | ||
| 307 | |||
| 308 | LLVMValueRef LLVMZigInsertDeclare(LLVMZigDIBuilder *dibuilder, LLVMValueRef storage, | ||
| 309 | LLVMZigDILocalVariable *var_info, LLVMZigDILocation *debug_loc, LLVMValueRef insert_before_instr) | ||
| 310 | { | ||
| 311 | Instruction *result = reinterpret_cast<DIBuilder*>(dibuilder)->insertDeclare( | ||
| 312 | unwrap(storage), | ||
| 313 | reinterpret_cast<DILocalVariable *>(var_info), | ||
| 314 | reinterpret_cast<DIBuilder*>(dibuilder)->createExpression(), | ||
| 315 | reinterpret_cast<DILocation*>(debug_loc), | ||
| 316 | static_cast<Instruction*>(unwrap(insert_before_instr))); | ||
| 317 | return wrap(result); | ||
| 318 | } | ||
| 319 | |||
| 320 | LLVMZigDILocation *LLVMZigGetDebugLoc(unsigned line, unsigned col, LLVMZigDIScope *scope) { | ||
| 321 | DebugLoc debug_loc = DebugLoc::get(line, col, reinterpret_cast<DIScope*>(scope), nullptr); | ||
| 322 | return reinterpret_cast<LLVMZigDILocation*>(debug_loc.get()); | ||
| 323 | } | ||
| 324 | |||
| 307 | //------------------------------------ | 325 | //------------------------------------ |
| 308 | 326 | ||
| 309 | enum FloatAbi { | 327 | enum FloatAbi { |
src/zig_llvm.hpp+5| ... | @@ -23,6 +23,7 @@ struct LLVMZigDILexicalBlock; | ... | @@ -23,6 +23,7 @@ struct LLVMZigDILexicalBlock; |
| 23 | struct LLVMZigDISubprogram; | 23 | struct LLVMZigDISubprogram; |
| 24 | struct LLVMZigDISubroutineType; | 24 | struct LLVMZigDISubroutineType; |
| 25 | struct LLVMZigDILocalVariable; | 25 | struct LLVMZigDILocalVariable; |
| 26 | struct LLVMZigDILocation; | ||
| 26 | struct LLVMZigInsertionPoint; | 27 | struct LLVMZigInsertionPoint; |
| 27 | 28 | ||
| 28 | void LLVMZigInitializeLoopStrengthReducePass(LLVMPassRegistryRef R); | 29 | void LLVMZigInitializeLoopStrengthReducePass(LLVMPassRegistryRef R); |
| ... | @@ -91,6 +92,10 @@ void LLVMZigDIBuilderFinalize(LLVMZigDIBuilder *dibuilder); | ... | @@ -91,6 +92,10 @@ void LLVMZigDIBuilderFinalize(LLVMZigDIBuilder *dibuilder); |
| 91 | LLVMZigInsertionPoint *LLVMZigSaveInsertPoint(LLVMBuilderRef builder); | 92 | LLVMZigInsertionPoint *LLVMZigSaveInsertPoint(LLVMBuilderRef builder); |
| 92 | void LLVMZigRestoreInsertPoint(LLVMBuilderRef builder, LLVMZigInsertionPoint *point); | 93 | void LLVMZigRestoreInsertPoint(LLVMBuilderRef builder, LLVMZigInsertionPoint *point); |
| 93 | 94 | ||
| 95 | LLVMValueRef LLVMZigInsertDeclare(LLVMZigDIBuilder *dibuilder, LLVMValueRef storage, | ||
| 96 | LLVMZigDILocalVariable *var_info, LLVMZigDILocation *debug_loc, LLVMValueRef insert_before_instr); | ||
| 97 | LLVMZigDILocation *LLVMZigGetDebugLoc(unsigned line, unsigned col, LLVMZigDIScope *scope); | ||
| 98 | |||
| 94 | 99 | ||
| 95 | /* | 100 | /* |
| 96 | * This stuff is not LLVM API but it depends on the LLVM C++ API so we put it here. | 101 | * This stuff is not LLVM API but it depends on the LLVM C++ API so we put it here. |