| 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 | 528 | return nullptr; |
| 529 | 529 | } else { |
| 530 | 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 | 542 | case NodeTypeCastExpr: |
| ... | ... | @@ -577,6 +585,7 @@ static LLVMValueRef gen_expr(CodeGen *g, AstNode *node) { |
| 577 | 585 | if (variable->type == g->builtin_types.entry_void) { |
| 578 | 586 | return nullptr; |
| 579 | 587 | } else if (variable->is_ptr) { |
| 588 | add_debug_source_node(g, node); | |
| 580 | 589 | return LLVMBuildLoad(g->builder, variable->value_ref, ""); |
| 581 | 590 | } else { |
| 582 | 591 | return variable->value_ref; |
| ... | ... | @@ -770,9 +779,6 @@ static void do_code_gen(CodeGen *g) { |
| 770 | 779 | } else { |
| 771 | 780 | tag = LLVMZigTag_DW_auto_variable(); |
| 772 | 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 | 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 | 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 | 327 | enum FloatAbi { |
src/zig_llvm.hpp+5| ... | ... | @@ -23,6 +23,7 @@ struct LLVMZigDILexicalBlock; |
| 23 | 23 | struct LLVMZigDISubprogram; |
| 24 | 24 | struct LLVMZigDISubroutineType; |
| 25 | 25 | struct LLVMZigDILocalVariable; |
| 26 | struct LLVMZigDILocation; | |
| 26 | 27 | struct LLVMZigInsertionPoint; |
| 27 | 28 | |
| 28 | 29 | void LLVMZigInitializeLoopStrengthReducePass(LLVMPassRegistryRef R); |
| ... | ... | @@ -91,6 +92,10 @@ void LLVMZigDIBuilderFinalize(LLVMZigDIBuilder *dibuilder); |
| 91 | 92 | LLVMZigInsertionPoint *LLVMZigSaveInsertPoint(LLVMBuilderRef builder); |
| 92 | 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 | 101 | * This stuff is not LLVM API but it depends on the LLVM C++ API so we put it here. |