2007-02-28 06:05:51 +08:00
|
|
|
//===- CallingConvEmitter.cpp - Generate calling conventions --------------===//
|
|
|
|
//
|
2019-01-19 16:50:56 +08:00
|
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
2007-02-28 06:05:51 +08:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// This tablegen backend is responsible for emitting descriptions of the calling
|
|
|
|
// conventions supported by this target.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#include "CodeGenTarget.h"
|
2012-10-26 04:33:17 +08:00
|
|
|
#include "llvm/TableGen/Error.h"
|
2011-10-02 00:41:13 +08:00
|
|
|
#include "llvm/TableGen/Record.h"
|
2012-06-11 23:37:55 +08:00
|
|
|
#include "llvm/TableGen/TableGenBackend.h"
|
|
|
|
#include <cassert>
|
2007-02-28 06:05:51 +08:00
|
|
|
using namespace llvm;
|
|
|
|
|
2012-06-11 23:37:55 +08:00
|
|
|
namespace {
|
|
|
|
class CallingConvEmitter {
|
|
|
|
RecordKeeper &Records;
|
|
|
|
public:
|
|
|
|
explicit CallingConvEmitter(RecordKeeper &R) : Records(R) {}
|
|
|
|
|
|
|
|
void run(raw_ostream &o);
|
|
|
|
|
|
|
|
private:
|
|
|
|
void EmitCallingConv(Record *CC, raw_ostream &O);
|
|
|
|
void EmitAction(Record *Action, unsigned Indent, raw_ostream &O);
|
|
|
|
unsigned Counter;
|
|
|
|
};
|
|
|
|
} // End anonymous namespace
|
|
|
|
|
2009-07-03 08:10:29 +08:00
|
|
|
void CallingConvEmitter::run(raw_ostream &O) {
|
2007-02-28 06:05:51 +08:00
|
|
|
std::vector<Record*> CCs = Records.getAllDerivedDefinitions("CallingConv");
|
2014-11-02 01:38:22 +08:00
|
|
|
|
|
|
|
// Emit prototypes for all of the non-custom CC's so that they can forward ref
|
|
|
|
// each other.
|
2017-10-16 22:52:26 +08:00
|
|
|
for (Record *CC : CCs) {
|
|
|
|
if (!CC->getValueAsBit("Custom")) {
|
[X86] Deduplicate static calling convention helpers for code size, NFC
Summary:
Right now we include ${TGT}GenCallingConv.inc once per each instruction
selection method implemented by ${TGT}:
- ${TGT}ISelLowering.cpp
- ${TGT}CallLowering.cpp
- ${TGT}FastISel.cpp
Instead, add a mechanism to tablegen for marking a particular convention
as "External", which causes tablegen to emit into the ::llvm namespace,
instead of as a static helper. This allows us to provide a header to
forward declare it, so we can simply call the function from all the
places it is referenced. Typically the calling convention analyzer is
called indirectly, so it doesn't benefit from inlining.
This saves a bit of final binary size, but mostly just saves object file
size:
before after diff artifact
12852K 12492K -360K X86ISelLowering.cpp.obj
4640K 4280K -360K X86FastISel.cpp.obj
1704K 2092K +388K X86CallingConv.cpp.obj
52448K 52336K -112K llc.exe
I didn't collect before numbers for X86CallLowering.cpp.obj, which is
for GlobalISel, but we should save 360K there as well.
This patch applies the strategy to the X86 backend, but there is no
reason it couldn't be applied to the other backends that implement
multiple ISel strategies, like AArch64.
Reviewers: craig.topper, hfinkel, efriedma
Subscribers: javed.absar, kristof.beyls, hiraditya, llvm-commits
Differential Revision: https://reviews.llvm.org/D56883
llvm-svn: 351616
2019-01-19 08:33:02 +08:00
|
|
|
unsigned Pad = CC->getName().size();
|
|
|
|
if (CC->getValueAsBit("Entry")) {
|
|
|
|
O << "bool llvm::";
|
|
|
|
Pad += 12;
|
|
|
|
} else {
|
|
|
|
O << "static bool ";
|
|
|
|
Pad += 13;
|
|
|
|
}
|
|
|
|
O << CC->getName() << "(unsigned ValNo, MVT ValVT,\n"
|
|
|
|
<< std::string(Pad, ' ') << "MVT LocVT, CCValAssign::LocInfo LocInfo,\n"
|
|
|
|
<< std::string(Pad, ' ')
|
2014-11-02 01:38:22 +08:00
|
|
|
<< "ISD::ArgFlagsTy ArgFlags, CCState &State);\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Emit each non-custom calling convention description in full.
|
2017-10-16 22:52:26 +08:00
|
|
|
for (Record *CC : CCs) {
|
|
|
|
if (!CC->getValueAsBit("Custom"))
|
|
|
|
EmitCallingConv(CC, O);
|
2007-02-28 06:05:51 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-07-03 08:10:29 +08:00
|
|
|
void CallingConvEmitter::EmitCallingConv(Record *CC, raw_ostream &O) {
|
2011-07-30 06:43:06 +08:00
|
|
|
ListInit *CCActions = CC->getValueAsListInit("Actions");
|
2007-02-28 06:05:51 +08:00
|
|
|
Counter = 0;
|
|
|
|
|
[X86] Deduplicate static calling convention helpers for code size, NFC
Summary:
Right now we include ${TGT}GenCallingConv.inc once per each instruction
selection method implemented by ${TGT}:
- ${TGT}ISelLowering.cpp
- ${TGT}CallLowering.cpp
- ${TGT}FastISel.cpp
Instead, add a mechanism to tablegen for marking a particular convention
as "External", which causes tablegen to emit into the ::llvm namespace,
instead of as a static helper. This allows us to provide a header to
forward declare it, so we can simply call the function from all the
places it is referenced. Typically the calling convention analyzer is
called indirectly, so it doesn't benefit from inlining.
This saves a bit of final binary size, but mostly just saves object file
size:
before after diff artifact
12852K 12492K -360K X86ISelLowering.cpp.obj
4640K 4280K -360K X86FastISel.cpp.obj
1704K 2092K +388K X86CallingConv.cpp.obj
52448K 52336K -112K llc.exe
I didn't collect before numbers for X86CallLowering.cpp.obj, which is
for GlobalISel, but we should save 360K there as well.
This patch applies the strategy to the X86 backend, but there is no
reason it couldn't be applied to the other backends that implement
multiple ISel strategies, like AArch64.
Reviewers: craig.topper, hfinkel, efriedma
Subscribers: javed.absar, kristof.beyls, hiraditya, llvm-commits
Differential Revision: https://reviews.llvm.org/D56883
llvm-svn: 351616
2019-01-19 08:33:02 +08:00
|
|
|
O << "\n\n";
|
|
|
|
unsigned Pad = CC->getName().size();
|
|
|
|
if (CC->getValueAsBit("Entry")) {
|
|
|
|
O << "bool llvm::";
|
|
|
|
Pad += 12;
|
|
|
|
} else {
|
|
|
|
O << "static bool ";
|
|
|
|
Pad += 13;
|
|
|
|
}
|
|
|
|
O << CC->getName() << "(unsigned ValNo, MVT ValVT,\n"
|
|
|
|
<< std::string(Pad, ' ') << "MVT LocVT, CCValAssign::LocInfo LocInfo,\n"
|
|
|
|
<< std::string(Pad, ' ') << "ISD::ArgFlagsTy ArgFlags, CCState &State) {\n";
|
2007-02-28 06:05:51 +08:00
|
|
|
// Emit all of the actions, in order.
|
2015-06-02 12:15:57 +08:00
|
|
|
for (unsigned i = 0, e = CCActions->size(); i != e; ++i) {
|
2007-02-28 06:05:51 +08:00
|
|
|
O << "\n";
|
|
|
|
EmitAction(CCActions->getElementAsRecord(i), 2, O);
|
|
|
|
}
|
|
|
|
|
|
|
|
O << "\n return true; // CC didn't match.\n";
|
|
|
|
O << "}\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
void CallingConvEmitter::EmitAction(Record *Action,
|
2009-07-03 08:10:29 +08:00
|
|
|
unsigned Indent, raw_ostream &O) {
|
2007-02-28 06:05:51 +08:00
|
|
|
std::string IndentStr = std::string(Indent, ' ');
|
|
|
|
|
|
|
|
if (Action->isSubClassOf("CCPredicateAction")) {
|
|
|
|
O << IndentStr << "if (";
|
|
|
|
|
2007-02-28 13:29:06 +08:00
|
|
|
if (Action->isSubClassOf("CCIfType")) {
|
2011-07-30 06:43:06 +08:00
|
|
|
ListInit *VTs = Action->getValueAsListInit("VTs");
|
2015-06-02 12:15:57 +08:00
|
|
|
for (unsigned i = 0, e = VTs->size(); i != e; ++i) {
|
2007-02-28 06:05:51 +08:00
|
|
|
Record *VT = VTs->getElementAsRecord(i);
|
2007-02-28 12:43:48 +08:00
|
|
|
if (i != 0) O << " ||\n " << IndentStr;
|
2007-02-28 06:05:51 +08:00
|
|
|
O << "LocVT == " << getEnumName(getValueType(VT));
|
|
|
|
}
|
|
|
|
|
2007-02-28 13:29:06 +08:00
|
|
|
} else if (Action->isSubClassOf("CCIf")) {
|
2007-02-28 06:05:51 +08:00
|
|
|
O << Action->getValueAsString("Predicate");
|
|
|
|
} else {
|
2017-01-28 10:02:38 +08:00
|
|
|
errs() << *Action;
|
[tablegen] Add locations to many PrintFatalError() calls
Summary:
While working on the GISel Combiner, I noticed I was producing location-less
error messages fairly often and set about fixing this. In the process, I
noticed quite a few places elsewhere in TableGen that also neglected to include
a relevant location.
This patch adds locations to errors that relate to a specific record (or a
field within it) and also have easy access to the relevant location. This is
particularly useful when multiclasses are involved as many of these errors
refer to the full name of a record and it's difficult to guess which substring
is grep-able.
Unfortunately, tablegen currently only supports Record granularity so it's not
currently possible to point at a specific Init so these sometimes point at the
record that caused the error rather than the precise origin of the error.
Reviewers: bogner, aditya_nandakumar, volkan, aemerson, paquette, nhaehnle
Reviewed By: nhaehnle
Subscribers: jdoerfert, nhaehnle, asb, rbar, johnrusso, simoncook, apazos, sabuasal, niosHD, jrtc27, zzheng, edward-jones, rogfer01, MartinMosbeck, brucehoult, the_o, PkmX, jocewei, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D58077
llvm-svn: 353862
2019-02-13 01:36:57 +08:00
|
|
|
PrintFatalError(Action->getLoc(), "Unknown CCPredicateAction!");
|
2007-02-28 06:05:51 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
O << ") {\n";
|
|
|
|
EmitAction(Action->getValueAsDef("SubAction"), Indent+2, O);
|
|
|
|
O << IndentStr << "}\n";
|
|
|
|
} else {
|
|
|
|
if (Action->isSubClassOf("CCDelegateTo")) {
|
|
|
|
Record *CC = Action->getValueAsDef("CC");
|
|
|
|
O << IndentStr << "if (!" << CC->getName()
|
|
|
|
<< "(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State))\n"
|
|
|
|
<< IndentStr << " return false;\n";
|
|
|
|
} else if (Action->isSubClassOf("CCAssignToReg")) {
|
2011-07-30 06:43:06 +08:00
|
|
|
ListInit *RegList = Action->getValueAsListInit("RegList");
|
2015-06-02 12:15:57 +08:00
|
|
|
if (RegList->size() == 1) {
|
2007-02-28 06:05:51 +08:00
|
|
|
O << IndentStr << "if (unsigned Reg = State.AllocateReg(";
|
|
|
|
O << getQualifiedName(RegList->getElementAsRecord(0)) << ")) {\n";
|
|
|
|
} else {
|
2014-04-04 13:16:06 +08:00
|
|
|
O << IndentStr << "static const MCPhysReg RegList" << ++Counter
|
2007-02-28 06:05:51 +08:00
|
|
|
<< "[] = {\n";
|
|
|
|
O << IndentStr << " ";
|
2015-06-02 12:15:57 +08:00
|
|
|
for (unsigned i = 0, e = RegList->size(); i != e; ++i) {
|
2007-02-28 06:05:51 +08:00
|
|
|
if (i != 0) O << ", ";
|
|
|
|
O << getQualifiedName(RegList->getElementAsRecord(i));
|
|
|
|
}
|
|
|
|
O << "\n" << IndentStr << "};\n";
|
|
|
|
O << IndentStr << "if (unsigned Reg = State.AllocateReg(RegList"
|
2015-02-21 10:11:17 +08:00
|
|
|
<< Counter << ")) {\n";
|
2007-02-28 06:05:51 +08:00
|
|
|
}
|
|
|
|
O << IndentStr << " State.addLoc(CCValAssign::getReg(ValNo, ValVT, "
|
|
|
|
<< "Reg, LocVT, LocInfo));\n";
|
|
|
|
O << IndentStr << " return false;\n";
|
|
|
|
O << IndentStr << "}\n";
|
2008-04-02 13:23:57 +08:00
|
|
|
} else if (Action->isSubClassOf("CCAssignToRegWithShadow")) {
|
2011-07-30 06:43:06 +08:00
|
|
|
ListInit *RegList = Action->getValueAsListInit("RegList");
|
|
|
|
ListInit *ShadowRegList = Action->getValueAsListInit("ShadowRegList");
|
2015-06-02 12:15:57 +08:00
|
|
|
if (!ShadowRegList->empty() && ShadowRegList->size() != RegList->size())
|
[tablegen] Add locations to many PrintFatalError() calls
Summary:
While working on the GISel Combiner, I noticed I was producing location-less
error messages fairly often and set about fixing this. In the process, I
noticed quite a few places elsewhere in TableGen that also neglected to include
a relevant location.
This patch adds locations to errors that relate to a specific record (or a
field within it) and also have easy access to the relevant location. This is
particularly useful when multiclasses are involved as many of these errors
refer to the full name of a record and it's difficult to guess which substring
is grep-able.
Unfortunately, tablegen currently only supports Record granularity so it's not
currently possible to point at a specific Init so these sometimes point at the
record that caused the error rather than the precise origin of the error.
Reviewers: bogner, aditya_nandakumar, volkan, aemerson, paquette, nhaehnle
Reviewed By: nhaehnle
Subscribers: jdoerfert, nhaehnle, asb, rbar, johnrusso, simoncook, apazos, sabuasal, niosHD, jrtc27, zzheng, edward-jones, rogfer01, MartinMosbeck, brucehoult, the_o, PkmX, jocewei, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D58077
llvm-svn: 353862
2019-02-13 01:36:57 +08:00
|
|
|
PrintFatalError(Action->getLoc(),
|
|
|
|
"Invalid length of list of shadowed registers");
|
2008-04-02 13:23:57 +08:00
|
|
|
|
2015-06-02 12:15:57 +08:00
|
|
|
if (RegList->size() == 1) {
|
2008-04-02 13:23:57 +08:00
|
|
|
O << IndentStr << "if (unsigned Reg = State.AllocateReg(";
|
|
|
|
O << getQualifiedName(RegList->getElementAsRecord(0));
|
|
|
|
O << ", " << getQualifiedName(ShadowRegList->getElementAsRecord(0));
|
|
|
|
O << ")) {\n";
|
|
|
|
} else {
|
|
|
|
unsigned RegListNumber = ++Counter;
|
|
|
|
unsigned ShadowRegListNumber = ++Counter;
|
|
|
|
|
2014-04-04 13:16:06 +08:00
|
|
|
O << IndentStr << "static const MCPhysReg RegList" << RegListNumber
|
2008-04-02 13:23:57 +08:00
|
|
|
<< "[] = {\n";
|
|
|
|
O << IndentStr << " ";
|
2015-06-02 12:15:57 +08:00
|
|
|
for (unsigned i = 0, e = RegList->size(); i != e; ++i) {
|
2008-04-02 13:23:57 +08:00
|
|
|
if (i != 0) O << ", ";
|
|
|
|
O << getQualifiedName(RegList->getElementAsRecord(i));
|
|
|
|
}
|
|
|
|
O << "\n" << IndentStr << "};\n";
|
|
|
|
|
2014-04-04 13:16:06 +08:00
|
|
|
O << IndentStr << "static const MCPhysReg RegList"
|
2008-04-02 13:23:57 +08:00
|
|
|
<< ShadowRegListNumber << "[] = {\n";
|
|
|
|
O << IndentStr << " ";
|
2015-06-02 12:15:57 +08:00
|
|
|
for (unsigned i = 0, e = ShadowRegList->size(); i != e; ++i) {
|
2008-04-02 13:23:57 +08:00
|
|
|
if (i != 0) O << ", ";
|
|
|
|
O << getQualifiedName(ShadowRegList->getElementAsRecord(i));
|
|
|
|
}
|
|
|
|
O << "\n" << IndentStr << "};\n";
|
|
|
|
|
|
|
|
O << IndentStr << "if (unsigned Reg = State.AllocateReg(RegList"
|
|
|
|
<< RegListNumber << ", " << "RegList" << ShadowRegListNumber
|
2015-02-21 10:11:17 +08:00
|
|
|
<< ")) {\n";
|
2008-04-02 13:23:57 +08:00
|
|
|
}
|
|
|
|
O << IndentStr << " State.addLoc(CCValAssign::getReg(ValNo, ValVT, "
|
|
|
|
<< "Reg, LocVT, LocInfo));\n";
|
|
|
|
O << IndentStr << " return false;\n";
|
|
|
|
O << IndentStr << "}\n";
|
2007-02-28 06:05:51 +08:00
|
|
|
} else if (Action->isSubClassOf("CCAssignToStack")) {
|
|
|
|
int Size = Action->getValueAsInt("Size");
|
|
|
|
int Align = Action->getValueAsInt("Align");
|
2007-11-14 16:29:13 +08:00
|
|
|
|
2008-01-15 11:10:35 +08:00
|
|
|
O << IndentStr << "unsigned Offset" << ++Counter
|
|
|
|
<< " = State.AllocateStack(";
|
2007-11-14 16:29:13 +08:00
|
|
|
if (Size)
|
2008-01-15 11:10:35 +08:00
|
|
|
O << Size << ", ";
|
2007-11-14 16:29:13 +08:00
|
|
|
else
|
2014-08-05 05:25:23 +08:00
|
|
|
O << "\n" << IndentStr
|
2015-07-16 14:11:10 +08:00
|
|
|
<< " State.getMachineFunction().getDataLayout()."
|
|
|
|
"getTypeAllocSize(EVT(LocVT).getTypeForEVT(State.getContext())),"
|
2014-08-05 05:25:23 +08:00
|
|
|
" ";
|
2007-11-14 16:29:13 +08:00
|
|
|
if (Align)
|
|
|
|
O << Align;
|
|
|
|
else
|
2014-08-05 05:25:23 +08:00
|
|
|
O << "\n" << IndentStr
|
2015-07-16 14:11:10 +08:00
|
|
|
<< " State.getMachineFunction().getDataLayout()."
|
|
|
|
"getABITypeAlignment(EVT(LocVT).getTypeForEVT(State.getContext()"
|
2014-08-05 05:25:23 +08:00
|
|
|
"))";
|
2008-01-15 11:10:35 +08:00
|
|
|
O << ");\n" << IndentStr
|
2007-11-14 16:29:13 +08:00
|
|
|
<< "State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset"
|
2007-02-28 06:05:51 +08:00
|
|
|
<< Counter << ", LocVT, LocInfo));\n";
|
|
|
|
O << IndentStr << "return false;\n";
|
2014-02-07 19:19:53 +08:00
|
|
|
} else if (Action->isSubClassOf("CCAssignToStackWithShadow")) {
|
|
|
|
int Size = Action->getValueAsInt("Size");
|
|
|
|
int Align = Action->getValueAsInt("Align");
|
|
|
|
ListInit *ShadowRegList = Action->getValueAsListInit("ShadowRegList");
|
|
|
|
|
|
|
|
unsigned ShadowRegListNumber = ++Counter;
|
|
|
|
|
2014-04-04 13:16:06 +08:00
|
|
|
O << IndentStr << "static const MCPhysReg ShadowRegList"
|
2014-02-07 19:19:53 +08:00
|
|
|
<< ShadowRegListNumber << "[] = {\n";
|
|
|
|
O << IndentStr << " ";
|
2015-06-02 12:15:57 +08:00
|
|
|
for (unsigned i = 0, e = ShadowRegList->size(); i != e; ++i) {
|
2014-02-07 19:19:53 +08:00
|
|
|
if (i != 0) O << ", ";
|
|
|
|
O << getQualifiedName(ShadowRegList->getElementAsRecord(i));
|
|
|
|
}
|
|
|
|
O << "\n" << IndentStr << "};\n";
|
|
|
|
|
|
|
|
O << IndentStr << "unsigned Offset" << ++Counter
|
|
|
|
<< " = State.AllocateStack("
|
|
|
|
<< Size << ", " << Align << ", "
|
2015-02-21 10:11:17 +08:00
|
|
|
<< "ShadowRegList" << ShadowRegListNumber << ");\n";
|
2014-02-07 19:19:53 +08:00
|
|
|
O << IndentStr << "State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset"
|
|
|
|
<< Counter << ", LocVT, LocInfo));\n";
|
|
|
|
O << IndentStr << "return false;\n";
|
2007-02-28 06:05:51 +08:00
|
|
|
} else if (Action->isSubClassOf("CCPromoteToType")) {
|
2007-02-28 12:43:48 +08:00
|
|
|
Record *DestTy = Action->getValueAsDef("DestTy");
|
2014-01-15 03:56:36 +08:00
|
|
|
MVT::SimpleValueType DestVT = getValueType(DestTy);
|
|
|
|
O << IndentStr << "LocVT = " << getEnumName(DestVT) <<";\n";
|
|
|
|
if (MVT(DestVT).isFloatingPoint()) {
|
|
|
|
O << IndentStr << "LocInfo = CCValAssign::FPExt;\n";
|
|
|
|
} else {
|
|
|
|
O << IndentStr << "if (ArgFlags.isSExt())\n"
|
|
|
|
<< IndentStr << IndentStr << "LocInfo = CCValAssign::SExt;\n"
|
|
|
|
<< IndentStr << "else if (ArgFlags.isZExt())\n"
|
|
|
|
<< IndentStr << IndentStr << "LocInfo = CCValAssign::ZExt;\n"
|
|
|
|
<< IndentStr << "else\n"
|
|
|
|
<< IndentStr << IndentStr << "LocInfo = CCValAssign::AExt;\n";
|
|
|
|
}
|
2014-09-25 20:15:05 +08:00
|
|
|
} else if (Action->isSubClassOf("CCPromoteToUpperBitsInType")) {
|
|
|
|
Record *DestTy = Action->getValueAsDef("DestTy");
|
|
|
|
MVT::SimpleValueType DestVT = getValueType(DestTy);
|
|
|
|
O << IndentStr << "LocVT = " << getEnumName(DestVT) << ";\n";
|
|
|
|
if (MVT(DestVT).isFloatingPoint()) {
|
[tablegen] Add locations to many PrintFatalError() calls
Summary:
While working on the GISel Combiner, I noticed I was producing location-less
error messages fairly often and set about fixing this. In the process, I
noticed quite a few places elsewhere in TableGen that also neglected to include
a relevant location.
This patch adds locations to errors that relate to a specific record (or a
field within it) and also have easy access to the relevant location. This is
particularly useful when multiclasses are involved as many of these errors
refer to the full name of a record and it's difficult to guess which substring
is grep-able.
Unfortunately, tablegen currently only supports Record granularity so it's not
currently possible to point at a specific Init so these sometimes point at the
record that caused the error rather than the precise origin of the error.
Reviewers: bogner, aditya_nandakumar, volkan, aemerson, paquette, nhaehnle
Reviewed By: nhaehnle
Subscribers: jdoerfert, nhaehnle, asb, rbar, johnrusso, simoncook, apazos, sabuasal, niosHD, jrtc27, zzheng, edward-jones, rogfer01, MartinMosbeck, brucehoult, the_o, PkmX, jocewei, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D58077
llvm-svn: 353862
2019-02-13 01:36:57 +08:00
|
|
|
PrintFatalError(Action->getLoc(),
|
|
|
|
"CCPromoteToUpperBitsInType does not handle floating "
|
2014-09-25 20:15:05 +08:00
|
|
|
"point");
|
|
|
|
} else {
|
|
|
|
O << IndentStr << "if (ArgFlags.isSExt())\n"
|
|
|
|
<< IndentStr << IndentStr << "LocInfo = CCValAssign::SExtUpper;\n"
|
|
|
|
<< IndentStr << "else if (ArgFlags.isZExt())\n"
|
|
|
|
<< IndentStr << IndentStr << "LocInfo = CCValAssign::ZExtUpper;\n"
|
|
|
|
<< IndentStr << "else\n"
|
|
|
|
<< IndentStr << IndentStr << "LocInfo = CCValAssign::AExtUpper;\n";
|
|
|
|
}
|
2009-04-18 03:07:39 +08:00
|
|
|
} else if (Action->isSubClassOf("CCBitConvertToType")) {
|
|
|
|
Record *DestTy = Action->getValueAsDef("DestTy");
|
|
|
|
O << IndentStr << "LocVT = " << getEnumName(getValueType(DestTy)) <<";\n";
|
|
|
|
O << IndentStr << "LocInfo = CCValAssign::BCvt;\n";
|
2009-08-03 16:13:56 +08:00
|
|
|
} else if (Action->isSubClassOf("CCPassIndirect")) {
|
|
|
|
Record *DestTy = Action->getValueAsDef("DestTy");
|
|
|
|
O << IndentStr << "LocVT = " << getEnumName(getValueType(DestTy)) <<";\n";
|
|
|
|
O << IndentStr << "LocInfo = CCValAssign::Indirect;\n";
|
2008-01-15 11:34:58 +08:00
|
|
|
} else if (Action->isSubClassOf("CCPassByVal")) {
|
|
|
|
int Size = Action->getValueAsInt("Size");
|
|
|
|
int Align = Action->getValueAsInt("Align");
|
|
|
|
O << IndentStr
|
|
|
|
<< "State.HandleByVal(ValNo, ValVT, LocVT, LocInfo, "
|
|
|
|
<< Size << ", " << Align << ", ArgFlags);\n";
|
2007-08-10 22:44:42 +08:00
|
|
|
O << IndentStr << "return false;\n";
|
2009-04-18 03:07:39 +08:00
|
|
|
} else if (Action->isSubClassOf("CCCustom")) {
|
|
|
|
O << IndentStr
|
|
|
|
<< "if (" << Action->getValueAsString("FuncName") << "(ValNo, ValVT, "
|
|
|
|
<< "LocVT, LocInfo, ArgFlags, State))\n";
|
|
|
|
O << IndentStr << IndentStr << "return false;\n";
|
2007-02-28 06:05:51 +08:00
|
|
|
} else {
|
2017-01-28 10:02:38 +08:00
|
|
|
errs() << *Action;
|
[tablegen] Add locations to many PrintFatalError() calls
Summary:
While working on the GISel Combiner, I noticed I was producing location-less
error messages fairly often and set about fixing this. In the process, I
noticed quite a few places elsewhere in TableGen that also neglected to include
a relevant location.
This patch adds locations to errors that relate to a specific record (or a
field within it) and also have easy access to the relevant location. This is
particularly useful when multiclasses are involved as many of these errors
refer to the full name of a record and it's difficult to guess which substring
is grep-able.
Unfortunately, tablegen currently only supports Record granularity so it's not
currently possible to point at a specific Init so these sometimes point at the
record that caused the error rather than the precise origin of the error.
Reviewers: bogner, aditya_nandakumar, volkan, aemerson, paquette, nhaehnle
Reviewed By: nhaehnle
Subscribers: jdoerfert, nhaehnle, asb, rbar, johnrusso, simoncook, apazos, sabuasal, niosHD, jrtc27, zzheng, edward-jones, rogfer01, MartinMosbeck, brucehoult, the_o, PkmX, jocewei, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D58077
llvm-svn: 353862
2019-02-13 01:36:57 +08:00
|
|
|
PrintFatalError(Action->getLoc(), "Unknown CCAction!");
|
2007-02-28 06:05:51 +08:00
|
|
|
}
|
|
|
|
}
|
2007-02-28 06:08:27 +08:00
|
|
|
}
|
2012-06-11 23:37:55 +08:00
|
|
|
|
|
|
|
namespace llvm {
|
|
|
|
|
|
|
|
void EmitCallingConv(RecordKeeper &RK, raw_ostream &OS) {
|
|
|
|
emitSourceFileHeader("Calling Convention Implementation Fragment", OS);
|
|
|
|
CallingConvEmitter(RK).run(OS);
|
|
|
|
}
|
|
|
|
|
|
|
|
} // End llvm namespace
|