Mercurial > projects > ldc
changeset 225:74701ba40398 trunk
[svn r241] Fixed missing terminator for void main() with inline asm block.
author | lindquist |
---|---|
date | Fri, 06 Jun 2008 22:30:31 +0200 |
parents | 116cc012409b |
children | 4145266ff4bd |
files | gen/asmstmt.cpp gen/functions.cpp llvmdc.kdevelop.filelist tangotests/asm2.d |
diffstat | 4 files changed, 19 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/gen/asmstmt.cpp Fri Jun 06 22:04:41 2008 +0200 +++ b/gen/asmstmt.cpp Fri Jun 06 22:30:31 2008 +0200 @@ -76,18 +76,18 @@ const LLType* ret = LLType::VoidTy; if (!output_values.empty()) { - std::cout << "memory outputs" << std::endl; assert(output_values.size() == 1); const LLType* llty = DtoType(output_values[0]->getType()); + std::cout << "out: " << *llty << '\n'; params.push_back(llty); } // inputs if (!input_values.empty()) { - std::cout << "inputs" << std::endl; assert(input_values.size() == 1); const LLType* llty = DtoType(input_values[0]->getType()); + std::cout << "in: " << *llty << '\n'; params.push_back(llty); }
--- a/gen/functions.cpp Fri Jun 06 22:04:41 2008 +0200 +++ b/gen/functions.cpp Fri Jun 06 22:30:31 2008 +0200 @@ -694,6 +694,19 @@ } } + // if the last block is not terminated we return a null value or void + // for some unknown reason this is needed when a void main() has a inline asm block ... + // this should be harmless for well formed code! + lastbb = &func->getBasicBlockList().back(); + if (!lastbb->getTerminator()) + { + Logger::println("adding missing return statement"); + if (func->getReturnType() == llvm::Type::VoidTy) + llvm::ReturnInst::Create(lastbb); + else + llvm::ReturnInst::Create(llvm::Constant::getNullValue(func->getReturnType()), lastbb); + } + gIR->functions.pop_back(); } }