# HG changeset patch # User Frits van Bommel # Date 1234993822 -3600 # Node ID ae710cba0884b469fef3759f2f94130affc13669 # Parent 523bf4f166bc4ab484b983caf0b5ec9b6e1fe836 Clean up the code generated when jumping out of inline asm and make label names more expressive. diff -r 523bf4f166bc -r ae710cba0884 gen/asmstmt.cpp --- a/gen/asmstmt.cpp Wed Feb 18 21:46:14 2009 +0100 +++ b/gen/asmstmt.cpp Wed Feb 18 22:50:22 2009 +0100 @@ -540,7 +540,7 @@ // initialize the setter statement we're going to build IRAsmStmt* outSetterStmt = new IRAsmStmt; - std::string asmGotoEnd = "jmp "+asmGotoEndLabel.str()+" ; "; + std::string asmGotoEnd = "\n\tjmp "+asmGotoEndLabel.str()+"\n"; std::ostringstream code; code << asmGotoEnd; @@ -574,8 +574,8 @@ // provide an in-asm target for the branch and set value Logger::println("statement '%s' references outer label '%s': creating forwarder", a->code.c_str(), a->isBranchToLabel->string); - code << fdmangle << '_' << a->isBranchToLabel->string << ": ; "; - code << "movl $<>, $<> ; "; + code << fdmangle << '_' << a->isBranchToLabel->string << ":\n\t"; + code << "movl $<>, $<>\n"; //FIXME: Store the value -> label mapping somewhere, so it can be referenced later outSetterStmt->in.push_back(DtoConstUint(n_goto)); outSetterStmt->in_c += "i,"; @@ -587,7 +587,7 @@ { // finalize code outSetterStmt->code = code.str(); - outSetterStmt->code += asmGotoEndLabel.str()+": ; "; + outSetterStmt->code += asmGotoEndLabel.str()+":\n"; // create storage for and initialize the temporary jump_target = DtoAlloca(LLType::Int32Ty, "__llvm_jump_target"); diff -r 523bf4f166bc -r ae710cba0884 gen/llvmhelpers.cpp --- a/gen/llvmhelpers.cpp Wed Feb 18 21:46:14 2009 +0100 +++ b/gen/llvmhelpers.cpp Wed Feb 18 22:50:22 2009 +0100 @@ -191,7 +191,7 @@ std::string labelname = gIR->func()->getScopedLabelName(target->toChars()); llvm::BasicBlock*& targetBB = gIR->func()->labelToBB[labelname]; if (targetBB == NULL) - targetBB = llvm::BasicBlock::Create("label", gIR->topfunc()); + targetBB = llvm::BasicBlock::Create("label_" + labelname, gIR->topfunc()); // find finallys between goto and label EnclosingHandler* endfinally = enclosinghandler; diff -r 523bf4f166bc -r ae710cba0884 gen/statements.cpp --- a/gen/statements.cpp Wed Feb 18 21:46:14 2009 +0100 +++ b/gen/statements.cpp Wed Feb 18 22:50:22 2009 +0100 @@ -1224,13 +1224,13 @@ llvm::BasicBlock* oldend = gIR->scopeend(); if (labelBB != NULL) { - labelBB->moveBefore(oldend); + labelBB->moveBefore(oldend); } else { - labelBB = llvm::BasicBlock::Create("label", p->topfunc(), oldend); + labelBB = llvm::BasicBlock::Create("label_" + labelname, p->topfunc(), oldend); } if (!p->scopereturned()) - llvm::BranchInst::Create(labelBB, p->scopebb()); + llvm::BranchInst::Create(labelBB, p->scopebb()); p->scope() = IRScope(labelBB,oldend); }