188ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner//===- CallingConvEmitter.cpp - Generate calling conventions --------------===//
288ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner//
388ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner//                     The LLVM Compiler Infrastructure
488ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner//
53060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// This file is distributed under the University of Illinois Open Source
63060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// License. See LICENSE.TXT for details.
788ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner//
888ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner//===----------------------------------------------------------------------===//
988ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner//
1088ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner// This tablegen backend is responsible for emitting descriptions of the calling
1188ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner// conventions supported by this target.
1288ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner//
1388ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner//===----------------------------------------------------------------------===//
1488ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner
1588ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner#include "CodeGenTarget.h"
167c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourne#include "llvm/TableGen/Record.h"
176f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen#include "llvm/TableGen/TableGenBackend.h"
186f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen#include <cassert>
1988ee2a18a77438e3f26efc87bded672db041fe09Chris Lattnerusing namespace llvm;
2088ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner
216f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesennamespace {
226f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesenclass CallingConvEmitter {
236f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen  RecordKeeper &Records;
246f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesenpublic:
256f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen  explicit CallingConvEmitter(RecordKeeper &R) : Records(R) {}
266f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen
276f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen  void run(raw_ostream &o);
286f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen
296f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesenprivate:
306f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen  void EmitCallingConv(Record *CC, raw_ostream &O);
316f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen  void EmitAction(Record *Action, unsigned Indent, raw_ostream &O);
326f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen  unsigned Counter;
336f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen};
346f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen} // End anonymous namespace
356f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen
361a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarvoid CallingConvEmitter::run(raw_ostream &O) {
3788ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner
3888ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner  std::vector<Record*> CCs = Records.getAllDerivedDefinitions("CallingConv");
3988ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner
4088ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner  // Emit prototypes for all of the CC's so that they can forward ref each
4188ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner  // other.
4288ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner  for (unsigned i = 0, e = CCs.size(); i != e; ++i) {
4388ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner    O << "static bool " << CCs[i]->getName()
441e96bab329eb23e4ce8a0dc3cc6b33a3f03d15bfDuncan Sands      << "(unsigned ValNo, MVT ValVT,\n"
4588ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner      << std::string(CCs[i]->getName().size()+13, ' ')
461440e8b918d7116c3587cb95f4f7ac7a0a0b65adDuncan Sands      << "MVT LocVT, CCValAssign::LocInfo LocInfo,\n"
472092c8ac9c8647d31fd4d01d74d361f01ca05e38Chris Lattner      << std::string(CCs[i]->getName().size()+13, ' ')
48276dcbdc8db6614cfd5004dc7dc35e437ddf9c58Duncan Sands      << "ISD::ArgFlagsTy ArgFlags, CCState &State);\n";
4988ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner  }
5088ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner
5188ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner  // Emit each calling convention description in full.
5288ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner  for (unsigned i = 0, e = CCs.size(); i != e; ++i)
5388ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner    EmitCallingConv(CCs[i], O);
5488ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner}
5588ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner
5688ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner
571a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarvoid CallingConvEmitter::EmitCallingConv(Record *CC, raw_ostream &O) {
5805bce0beee87512e52428d4b80f5a8e79a949576David Greene  ListInit *CCActions = CC->getValueAsListInit("Actions");
5988ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner  Counter = 0;
6088ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner
6188ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner  O << "\n\nstatic bool " << CC->getName()
621e96bab329eb23e4ce8a0dc3cc6b33a3f03d15bfDuncan Sands    << "(unsigned ValNo, MVT ValVT,\n"
632092c8ac9c8647d31fd4d01d74d361f01ca05e38Chris Lattner    << std::string(CC->getName().size()+13, ' ')
641440e8b918d7116c3587cb95f4f7ac7a0a0b65adDuncan Sands    << "MVT LocVT, CCValAssign::LocInfo LocInfo,\n"
6588ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner    << std::string(CC->getName().size()+13, ' ')
66276dcbdc8db6614cfd5004dc7dc35e437ddf9c58Duncan Sands    << "ISD::ArgFlagsTy ArgFlags, CCState &State) {\n";
6788ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner  // Emit all of the actions, in order.
6888ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner  for (unsigned i = 0, e = CCActions->getSize(); i != e; ++i) {
6988ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner    O << "\n";
7088ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner    EmitAction(CCActions->getElementAsRecord(i), 2, O);
7188ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner  }
7288ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner
7388ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner  O << "\n  return true;  // CC didn't match.\n";
7488ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner  O << "}\n";
7588ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner}
7688ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner
7788ee2a18a77438e3f26efc87bded672db041fe09Chris Lattnervoid CallingConvEmitter::EmitAction(Record *Action,
781a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar                                    unsigned Indent, raw_ostream &O) {
7988ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner  std::string IndentStr = std::string(Indent, ' ');
8088ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner
8188ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner  if (Action->isSubClassOf("CCPredicateAction")) {
8288ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner    O << IndentStr << "if (";
8388ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner
84e3bab80e338ac81b5b911c6ebc513aeafc335ce5Chris Lattner    if (Action->isSubClassOf("CCIfType")) {
8505bce0beee87512e52428d4b80f5a8e79a949576David Greene      ListInit *VTs = Action->getValueAsListInit("VTs");
8688ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner      for (unsigned i = 0, e = VTs->getSize(); i != e; ++i) {
8788ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner        Record *VT = VTs->getElementAsRecord(i);
882092c8ac9c8647d31fd4d01d74d361f01ca05e38Chris Lattner        if (i != 0) O << " ||\n    " << IndentStr;
8988ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner        O << "LocVT == " << getEnumName(getValueType(VT));
9088ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner      }
9188ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner
92e3bab80e338ac81b5b911c6ebc513aeafc335ce5Chris Lattner    } else if (Action->isSubClassOf("CCIf")) {
9388ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner      O << Action->getValueAsString("Predicate");
9488ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner    } else {
9588ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner      Action->dump();
9688ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner      throw "Unknown CCPredicateAction!";
9788ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner    }
9888ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner
9988ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner    O << ") {\n";
10088ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner    EmitAction(Action->getValueAsDef("SubAction"), Indent+2, O);
10188ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner    O << IndentStr << "}\n";
10288ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner  } else {
10388ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner    if (Action->isSubClassOf("CCDelegateTo")) {
10488ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner      Record *CC = Action->getValueAsDef("CC");
10588ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner      O << IndentStr << "if (!" << CC->getName()
10688ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner        << "(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State))\n"
10788ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner        << IndentStr << "  return false;\n";
10888ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner    } else if (Action->isSubClassOf("CCAssignToReg")) {
10905bce0beee87512e52428d4b80f5a8e79a949576David Greene      ListInit *RegList = Action->getValueAsListInit("RegList");
11088ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner      if (RegList->getSize() == 1) {
11188ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner        O << IndentStr << "if (unsigned Reg = State.AllocateReg(";
11288ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner        O << getQualifiedName(RegList->getElementAsRecord(0)) << ")) {\n";
11388ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner      } else {
114c5eaae4e9bc75b203b3a9922b480729bc4f340e2Craig Topper        O << IndentStr << "static const uint16_t RegList" << ++Counter
11588ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner          << "[] = {\n";
11688ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner        O << IndentStr << "  ";
11788ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner        for (unsigned i = 0, e = RegList->getSize(); i != e; ++i) {
11888ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner          if (i != 0) O << ", ";
11988ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner          O << getQualifiedName(RegList->getElementAsRecord(i));
12088ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner        }
12188ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner        O << "\n" << IndentStr << "};\n";
12288ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner        O << IndentStr << "if (unsigned Reg = State.AllocateReg(RegList"
12388ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner          << Counter << ", " << RegList->getSize() << ")) {\n";
12488ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner      }
12588ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner      O << IndentStr << "  State.addLoc(CCValAssign::getReg(ValNo, ValVT, "
12688ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner        << "Reg, LocVT, LocInfo));\n";
12788ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner      O << IndentStr << "  return false;\n";
12888ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner      O << IndentStr << "}\n";
12967073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov    } else if (Action->isSubClassOf("CCAssignToRegWithShadow")) {
13005bce0beee87512e52428d4b80f5a8e79a949576David Greene      ListInit *RegList = Action->getValueAsListInit("RegList");
13105bce0beee87512e52428d4b80f5a8e79a949576David Greene      ListInit *ShadowRegList = Action->getValueAsListInit("ShadowRegList");
13267073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov      if (ShadowRegList->getSize() >0 &&
13367073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov          ShadowRegList->getSize() != RegList->getSize())
13467073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov        throw "Invalid length of list of shadowed registers";
13567073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov
13667073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov      if (RegList->getSize() == 1) {
13767073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov        O << IndentStr << "if (unsigned Reg = State.AllocateReg(";
13867073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov        O << getQualifiedName(RegList->getElementAsRecord(0));
13967073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov        O << ", " << getQualifiedName(ShadowRegList->getElementAsRecord(0));
14067073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov        O << ")) {\n";
14167073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov      } else {
14267073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov        unsigned RegListNumber = ++Counter;
14367073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov        unsigned ShadowRegListNumber = ++Counter;
14467073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov
145c5eaae4e9bc75b203b3a9922b480729bc4f340e2Craig Topper        O << IndentStr << "static const uint16_t RegList" << RegListNumber
14667073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov          << "[] = {\n";
14767073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov        O << IndentStr << "  ";
14867073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov        for (unsigned i = 0, e = RegList->getSize(); i != e; ++i) {
14967073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov          if (i != 0) O << ", ";
15067073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov          O << getQualifiedName(RegList->getElementAsRecord(i));
15167073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov        }
15267073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov        O << "\n" << IndentStr << "};\n";
15367073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov
154c5eaae4e9bc75b203b3a9922b480729bc4f340e2Craig Topper        O << IndentStr << "static const uint16_t RegList"
15567073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov          << ShadowRegListNumber << "[] = {\n";
15667073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov        O << IndentStr << "  ";
15767073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov        for (unsigned i = 0, e = ShadowRegList->getSize(); i != e; ++i) {
15867073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov          if (i != 0) O << ", ";
15967073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov          O << getQualifiedName(ShadowRegList->getElementAsRecord(i));
16067073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov        }
16167073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov        O << "\n" << IndentStr << "};\n";
16267073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov
16367073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov        O << IndentStr << "if (unsigned Reg = State.AllocateReg(RegList"
16467073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov          << RegListNumber << ", " << "RegList" << ShadowRegListNumber
16567073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov          << ", " << RegList->getSize() << ")) {\n";
16667073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov      }
16767073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov      O << IndentStr << "  State.addLoc(CCValAssign::getReg(ValNo, ValVT, "
16867073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov        << "Reg, LocVT, LocInfo));\n";
16967073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov      O << IndentStr << "  return false;\n";
17067073f1cbd95f61a8db01ac479f5e60c0a048ac0Anton Korobeynikov      O << IndentStr << "}\n";
17188ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner    } else if (Action->isSubClassOf("CCAssignToStack")) {
17288ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner      int Size = Action->getValueAsInt("Size");
17388ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner      int Align = Action->getValueAsInt("Align");
17487b665d3dee92ef5f30d9eb1afdb64448bc3e2efDuncan Sands
1755daafa9b1b5279ba6a5032a4a841abb20b4023efEvan Cheng      O << IndentStr << "unsigned Offset" << ++Counter
1765daafa9b1b5279ba6a5032a4a841abb20b4023efEvan Cheng        << " = State.AllocateStack(";
17787b665d3dee92ef5f30d9eb1afdb64448bc3e2efDuncan Sands      if (Size)
1785daafa9b1b5279ba6a5032a4a841abb20b4023efEvan Cheng        O << Size << ", ";
17987b665d3dee92ef5f30d9eb1afdb64448bc3e2efDuncan Sands      else
1805daafa9b1b5279ba6a5032a4a841abb20b4023efEvan Cheng        O << "\n" << IndentStr << "  State.getTarget().getTargetData()"
1811440e8b918d7116c3587cb95f4f7ac7a0a0b65adDuncan Sands          "->getTypeAllocSize(EVT(LocVT).getTypeForEVT(State.getContext())), ";
18287b665d3dee92ef5f30d9eb1afdb64448bc3e2efDuncan Sands      if (Align)
18387b665d3dee92ef5f30d9eb1afdb64448bc3e2efDuncan Sands        O << Align;
18487b665d3dee92ef5f30d9eb1afdb64448bc3e2efDuncan Sands      else
1855daafa9b1b5279ba6a5032a4a841abb20b4023efEvan Cheng        O << "\n" << IndentStr << "  State.getTarget().getTargetData()"
1861440e8b918d7116c3587cb95f4f7ac7a0a0b65adDuncan Sands          "->getABITypeAlignment(EVT(LocVT).getTypeForEVT(State.getContext()))";
18755e958746901ef8c04f370e746a7538137d0bcf8Rafael Espindola      if (Action->isSubClassOf("CCAssignToStackWithShadow"))
18855e958746901ef8c04f370e746a7538137d0bcf8Rafael Espindola        O << ", " << getQualifiedName(Action->getValueAsDef("ShadowReg"));
1895daafa9b1b5279ba6a5032a4a841abb20b4023efEvan Cheng      O << ");\n" << IndentStr
19087b665d3dee92ef5f30d9eb1afdb64448bc3e2efDuncan Sands        << "State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset"
19188ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner        << Counter << ", LocVT, LocInfo));\n";
19288ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner      O << IndentStr << "return false;\n";
19388ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner    } else if (Action->isSubClassOf("CCPromoteToType")) {
1942092c8ac9c8647d31fd4d01d74d361f01ca05e38Chris Lattner      Record *DestTy = Action->getValueAsDef("DestTy");
1952092c8ac9c8647d31fd4d01d74d361f01ca05e38Chris Lattner      O << IndentStr << "LocVT = " << getEnumName(getValueType(DestTy)) <<";\n";
196276dcbdc8db6614cfd5004dc7dc35e437ddf9c58Duncan Sands      O << IndentStr << "if (ArgFlags.isSExt())\n"
197d0b82b301d700217a716526f9329bb031e0d6578Anton Korobeynikov        << IndentStr << IndentStr << "LocInfo = CCValAssign::SExt;\n"
198276dcbdc8db6614cfd5004dc7dc35e437ddf9c58Duncan Sands        << IndentStr << "else if (ArgFlags.isZExt())\n"
199d0b82b301d700217a716526f9329bb031e0d6578Anton Korobeynikov        << IndentStr << IndentStr << "LocInfo = CCValAssign::ZExt;\n"
200d0b82b301d700217a716526f9329bb031e0d6578Anton Korobeynikov        << IndentStr << "else\n"
201d0b82b301d700217a716526f9329bb031e0d6578Anton Korobeynikov        << IndentStr << IndentStr << "LocInfo = CCValAssign::AExt;\n";
2021f595bb42950088ccb8246e6b065a96027b46ec6Bob Wilson    } else if (Action->isSubClassOf("CCBitConvertToType")) {
2031f595bb42950088ccb8246e6b065a96027b46ec6Bob Wilson      Record *DestTy = Action->getValueAsDef("DestTy");
2041f595bb42950088ccb8246e6b065a96027b46ec6Bob Wilson      O << IndentStr << "LocVT = " << getEnumName(getValueType(DestTy)) <<";\n";
2051f595bb42950088ccb8246e6b065a96027b46ec6Bob Wilson      O << IndentStr << "LocInfo = CCValAssign::BCvt;\n";
2064ab15535e7028a48d75c9d08ed57e9b3b05b1f53Anton Korobeynikov    } else if (Action->isSubClassOf("CCPassIndirect")) {
2074ab15535e7028a48d75c9d08ed57e9b3b05b1f53Anton Korobeynikov      Record *DestTy = Action->getValueAsDef("DestTy");
2084ab15535e7028a48d75c9d08ed57e9b3b05b1f53Anton Korobeynikov      O << IndentStr << "LocVT = " << getEnumName(getValueType(DestTy)) <<";\n";
2094ab15535e7028a48d75c9d08ed57e9b3b05b1f53Anton Korobeynikov      O << IndentStr << "LocInfo = CCValAssign::Indirect;\n";
2106bfa8a121d69f16ca2cb48360a182f52e5930f0eEvan Cheng    } else if (Action->isSubClassOf("CCPassByVal")) {
2116bfa8a121d69f16ca2cb48360a182f52e5930f0eEvan Cheng      int Size = Action->getValueAsInt("Size");
2126bfa8a121d69f16ca2cb48360a182f52e5930f0eEvan Cheng      int Align = Action->getValueAsInt("Align");
2136bfa8a121d69f16ca2cb48360a182f52e5930f0eEvan Cheng      O << IndentStr
2146bfa8a121d69f16ca2cb48360a182f52e5930f0eEvan Cheng        << "State.HandleByVal(ValNo, ValVT, LocVT, LocInfo, "
2156bfa8a121d69f16ca2cb48360a182f52e5930f0eEvan Cheng        << Size << ", " << Align << ", ArgFlags);\n";
216594d37e21aea4ef841d9ee5d9c328c4bf1c6bed7Rafael Espindola      O << IndentStr << "return false;\n";
2171f595bb42950088ccb8246e6b065a96027b46ec6Bob Wilson    } else if (Action->isSubClassOf("CCCustom")) {
2181f595bb42950088ccb8246e6b065a96027b46ec6Bob Wilson      O << IndentStr
2191f595bb42950088ccb8246e6b065a96027b46ec6Bob Wilson        << "if (" << Action->getValueAsString("FuncName") << "(ValNo, ValVT, "
2201f595bb42950088ccb8246e6b065a96027b46ec6Bob Wilson        << "LocVT, LocInfo, ArgFlags, State))\n";
2211f595bb42950088ccb8246e6b065a96027b46ec6Bob Wilson      O << IndentStr << IndentStr << "return false;\n";
22288ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner    } else {
22388ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner      Action->dump();
22488ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner      throw "Unknown CCAction!";
22588ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner    }
22688ee2a18a77438e3f26efc87bded672db041fe09Chris Lattner  }
22750d456539dea5e61d7a1592a78f1861fb35b0063Chris Lattner}
2286f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen
2296f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesennamespace llvm {
2306f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen
2316f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesenvoid EmitCallingConv(RecordKeeper &RK, raw_ostream &OS) {
2326f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen  emitSourceFileHeader("Calling Convention Implementation Fragment", OS);
2336f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen  CallingConvEmitter(RK).run(OS);
2346f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen}
2356f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen
2366f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen} // End llvm namespace
237