mirror of
https://github.com/ldc-developers/ldc.git
synced 2025-05-09 04:15:58 +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");
|
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
|
// give the 'this' argument storage and debug info
|
||||||
if (f->usesThis)
|
if (f->usesThis)
|
||||||
{
|
{
|
||||||
|
|
|
@ -37,7 +37,12 @@ unsigned DtoCallingConv(LINK l)
|
||||||
if (l == LINKc || l == LINKcpp)
|
if (l == LINKc || l == LINKcpp)
|
||||||
return llvm::CallingConv::C;
|
return llvm::CallingConv::C;
|
||||||
else if (l == LINKd || l == LINKdefault)
|
else if (l == LINKd || l == LINKdefault)
|
||||||
|
{
|
||||||
|
if (global.params.cpu == ARCHx86)
|
||||||
|
return llvm::CallingConv::X86_StdCall;
|
||||||
|
else
|
||||||
return llvm::CallingConv::Fast;
|
return llvm::CallingConv::Fast;
|
||||||
|
}
|
||||||
else if (l == LINKwindows)
|
else if (l == LINKwindows)
|
||||||
return llvm::CallingConv::X86_StdCall;
|
return llvm::CallingConv::X86_StdCall;
|
||||||
else
|
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