Mercurial > projects > ldc
diff gen/asmstmt.cpp @ 959:7e669954db7d
Implement implicit return after inline asm on x86_64
author | Frits van Bommel <fvbommel wxs.nl> |
---|---|
date | Sun, 15 Feb 2009 18:04:22 +0100 |
parents | e048e36bc155 |
children | fe2d9bb7078d |
line wrap: on
line diff
--- a/gen/asmstmt.cpp Sun Feb 15 14:54:36 2009 +0100 +++ b/gen/asmstmt.cpp Sun Feb 15 18:04:22 2009 +0100 @@ -670,15 +670,19 @@ std::vector<LLValue*> args; args.insert(args.end(), outargs.begin(), outargs.end()); args.insert(args.end(), inargs.begin(), inargs.end()); - llvm::CallInst* call = p->ir->CreateCall(ia, args.begin(), args.end(), ""); + llvm::CallInst* call = p->ir->CreateCall(ia, args.begin(), args.end(), + retty == LLType::VoidTy ? "" : "asm"); // capture abi return value if (useabiret) { - if (p->asmBlock->retemu) - p->asmBlock->asmBlock->abiret = DtoLoad(p->asmBlock->asmBlock->abiret); + IRAsmBlock* block = p->asmBlock; + if (block->retfixup) + block->asmBlock->abiret = (*block->retfixup)(p->ir, call); + else if (p->asmBlock->retemu) + block->asmBlock->abiret = DtoLoad(block->asmBlock->abiret); else - p->asmBlock->asmBlock->abiret = call; + block->asmBlock->abiret = call; } p->asmBlock = NULL;