[svn r241] Fixed missing terminator for void main() with inline asm block.

This commit is contained in:
Tomas Lindquist Olsen
2008-06-06 22:30:31 +02:00
parent cf4d71b02c
commit 47ac84b223
4 changed files with 19 additions and 3 deletions

View File

@@ -76,18 +76,18 @@ d_build_asm_stmt(std::string code, std::deque<DValue*> const& output_values, std
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);
}

View File

@@ -694,6 +694,19 @@ void DtoDefineFunc(FuncDeclaration* fd)
}
}
// 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();
}
}

View File

@@ -752,6 +752,7 @@ tangotests/align1.d
tangotests/arrays1.d
tangotests/asm1.d
tangotests/asm2.d
tangotests/asm3.d
tangotests/b.d
tangotests/byval1.d
tangotests/c.d

View File

@@ -5,10 +5,12 @@ extern(C) int printf(char*, ...);
int main()
{
int i = 40;
int j = 2;
asm
{
mov EAX, i;
add EAX, 2;
mov EBX, j;
add EAX, EBX;
mov i, EAX;
}
printf("42 = %d\n", i);