First step towards D abi compliance.

Framepointer elimination is now disabled for functions using inline asm (with a hack from aKor).
This commit is contained in:
Tomas Lindquist Olsen 2008-08-19 20:18:01 +02:00
parent 9caf74c59b
commit 3346a78e71
3 changed files with 47 additions and 1 deletions

View file

@ -593,6 +593,16 @@ void DtoDefineFunc(FuncDeclaration* fd)
fd->vresult->ir.irLocal->value = DtoAlloca(DtoType(fd->vresult->type), "function_vresult");
}
// this hack makes sure the frame pointer elimination optimization is disabled.
// this this eliminates a bunch of inline asm related issues.
// naked must always eliminate the framepointer however...
if (fd->inlineAsm && !fd->naked)
{
// emit a call to llvm_eh_unwind_init
LLFunction* hack = GET_INTRINSIC_DECL(eh_unwind_init);
gIR->ir->CreateCall(hack, "");
}
// give the 'this' argument storage and debug info
if (f->usesThis)
{

View file

@ -37,7 +37,12 @@ unsigned DtoCallingConv(LINK l)
if (l == LINKc || l == LINKcpp)
return llvm::CallingConv::C;
else if (l == LINKd || l == LINKdefault)
{
if (global.params.cpu == ARCHx86)
return llvm::CallingConv::X86_StdCall;
else
return llvm::CallingConv::Fast;
}
else if (l == LINKwindows)
return llvm::CallingConv::X86_StdCall;
else

31
tests/mini/callingconv1.d Normal file
View file

@ -0,0 +1,31 @@
module mini.callingconv1;
extern(C) int printf(char*, ...);
float foo(float a, float b)
{
return a + b;
}
void main()
{
float a = 1.5;
float b = 2.5;
float c;
asm
{
mov EAX, [a];
push EAX;
mov EAX, [b];
push EAX;
call foo;
fstp c;
}
printf("%f\n", c);
assert(c == 4.0);
printf("passed\n", c);
}