Add Win64 thiscall calling convention.
authorTilmann Scheller <tilmann.scheller@googlemail.com>
Wed, 2 Mar 2011 19:29:22 +0000 (19:29 +0000)
committerTilmann Scheller <tilmann.scheller@googlemail.com>
Wed, 2 Mar 2011 19:29:22 +0000 (19:29 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@126862 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CallingConv.h
lib/AsmParser/LLLexer.cpp
lib/AsmParser/LLParser.cpp
lib/AsmParser/LLToken.h
lib/Target/X86/X86CallingConv.td
lib/VMCore/AsmWriter.cpp

index 4c5ee626709a22a1b178cde36082828c84a6a7fc..49dcbb8e8009c1f3da074319a9d6918fdcc13c0e 100644 (file)
@@ -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
 
index 857fa1ef626f01d9e4437b2b6fcf49e1a1b5e379..c8bbd051f6d005d9a5676ecd9f983c060335c167 100644 (file)
@@ -549,6 +549,7 @@ lltok::Kind LLLexer::LexIdentifier() {
   KEYWORD(msp430_intrcc);
   KEYWORD(ptx_kernel);
   KEYWORD(ptx_device);
+  KEYWORD(win64_thiscallcc);
 
   KEYWORD(cc);
   KEYWORD(c);
index fc10c0405477f442a52d6101c86b22e1c1887527..ed97b401db825a4405dac1245b05a36379273d83 100644 (file)
@@ -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();
index 576da191aecf5682764a926c5e19867264e5fd18..7f36637292bca1b01e2ba66c25851314e4fb2e5c 100644 (file)
@@ -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,
index a44fb694e725f5ad7ac8cceb60380b94e9026479..ad71d8fd225cac520b173f5e452acd8669edc797 100644 (file)
@@ -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]>>,
 
index ff6084d8a8bc6a7eb0324a8e502c59ca5b83b156..62c65dfd32e31aced5de7e252f93a12443557797 100644 (file)
@@ -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;
     }