mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-02-26 08:33:14 +01:00
[svn r241] Fixed missing terminator for void main() with inline asm block.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user