mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
Add Win64 thiscall calling convention.
llvm-svn: 126862
This commit is contained in:
parent
06f62a8581
commit
c557d1eeb4
@ -94,7 +94,10 @@ namespace CallingConv {
|
||||
|
||||
/// MBLAZE_INTR - Calling convention used for MBlaze interrupt support
|
||||
/// routines (i.e. GCC's save_volatiles attribute).
|
||||
MBLAZE_SVOL = 74
|
||||
MBLAZE_SVOL = 74,
|
||||
|
||||
/// Win64_ThisCall - Calling convention used for method calls on Win64.
|
||||
Win64_ThisCall = 75
|
||||
};
|
||||
} // End CallingConv namespace
|
||||
|
||||
|
@ -549,6 +549,7 @@ lltok::Kind LLLexer::LexIdentifier() {
|
||||
KEYWORD(msp430_intrcc);
|
||||
KEYWORD(ptx_kernel);
|
||||
KEYWORD(ptx_device);
|
||||
KEYWORD(win64_thiscallcc);
|
||||
|
||||
KEYWORD(cc);
|
||||
KEYWORD(c);
|
||||
|
@ -1087,6 +1087,7 @@ bool LLParser::ParseOptionalVisibility(unsigned &Res) {
|
||||
/// ::= 'msp430_intrcc'
|
||||
/// ::= 'ptx_kernel'
|
||||
/// ::= 'ptx_device'
|
||||
/// ::= 'win64_thiscallcc'
|
||||
/// ::= 'cc' UINT
|
||||
///
|
||||
bool LLParser::ParseOptionalCallingConv(CallingConv::ID &CC) {
|
||||
@ -1104,6 +1105,7 @@ bool LLParser::ParseOptionalCallingConv(CallingConv::ID &CC) {
|
||||
case lltok::kw_msp430_intrcc: CC = CallingConv::MSP430_INTR; break;
|
||||
case lltok::kw_ptx_kernel: CC = CallingConv::PTX_Kernel; break;
|
||||
case lltok::kw_ptx_device: CC = CallingConv::PTX_Device; break;
|
||||
case lltok::kw_win64_thiscallcc:CC = CallingConv::Win64_ThisCall; break;
|
||||
case lltok::kw_cc: {
|
||||
unsigned ArbitraryCC;
|
||||
Lex.Lex();
|
||||
|
@ -74,6 +74,7 @@ namespace lltok {
|
||||
kw_arm_apcscc, kw_arm_aapcscc, kw_arm_aapcs_vfpcc,
|
||||
kw_msp430_intrcc,
|
||||
kw_ptx_kernel, kw_ptx_device,
|
||||
kw_win64_thiscallcc,
|
||||
|
||||
kw_signext,
|
||||
kw_zeroext,
|
||||
|
@ -215,6 +215,13 @@ def CC_X86_Win64_C : CallingConv<[
|
||||
// The first 4 integer arguments are passed in integer registers.
|
||||
CCIfType<[i32], CCAssignToRegWithShadow<[ECX , EDX , R8D , R9D ],
|
||||
[XMM0, XMM1, XMM2, XMM3]>>,
|
||||
|
||||
// Do not pass the sret argument in RCX, the Win64 thiscall calling
|
||||
// convention requires "this" to be passed in RCX.
|
||||
CCIfCC<"CallingConv::Win64_ThisCall",
|
||||
CCIfSRet<CCIfType<[i64], CCAssignToRegWithShadow<[RDX , R8 , R9 ],
|
||||
[XMM1, XMM2, XMM3]>>>>,
|
||||
|
||||
CCIfType<[i64], CCAssignToRegWithShadow<[RCX , RDX , R8 , R9 ],
|
||||
[XMM0, XMM1, XMM2, XMM3]>>,
|
||||
|
||||
|
@ -1586,6 +1586,7 @@ void AssemblyWriter::printFunction(const Function *F) {
|
||||
case CallingConv::MSP430_INTR: Out << "msp430_intrcc "; break;
|
||||
case CallingConv::PTX_Kernel: Out << "ptx_kernel"; break;
|
||||
case CallingConv::PTX_Device: Out << "ptx_device"; break;
|
||||
case CallingConv::Win64_ThisCall:Out << "win64_thiscallcc "; break;
|
||||
default: Out << "cc" << F->getCallingConv() << " "; break;
|
||||
}
|
||||
|
||||
@ -1858,6 +1859,7 @@ void AssemblyWriter::printInstruction(const Instruction &I) {
|
||||
case CallingConv::MSP430_INTR: Out << " msp430_intrcc "; break;
|
||||
case CallingConv::PTX_Kernel: Out << " ptx_kernel"; break;
|
||||
case CallingConv::PTX_Device: Out << " ptx_device"; break;
|
||||
case CallingConv::Win64_ThisCall:Out << " win64_thiscallcc "; break;
|
||||
default: Out << " cc" << CI->getCallingConv(); break;
|
||||
}
|
||||
|
||||
@ -1914,6 +1916,7 @@ void AssemblyWriter::printInstruction(const Instruction &I) {
|
||||
case CallingConv::MSP430_INTR: Out << " msp430_intrcc "; break;
|
||||
case CallingConv::PTX_Kernel: Out << " ptx_kernel"; break;
|
||||
case CallingConv::PTX_Device: Out << " ptx_device"; break;
|
||||
case CallingConv::Win64_ThisCall:Out << " win64_thiscallcc "; break;
|
||||
default: Out << " cc" << II->getCallingConv(); break;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user