mirror of
https://github.com/ldc-developers/ldc.git
synced 2025-05-08 11:56:12 +03:00
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:
parent
9caf74c59b
commit
3346a78e71
3 changed files with 47 additions and 1 deletions
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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
31
tests/mini/callingconv1.d
Normal 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);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue