summaryrefslogtreecommitdiffstats
path: root/llvm/utils/TableGen/PredicateExpander.cpp
diff options
context:
space:
mode:
authorAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>2018-08-09 15:32:48 +0000
committerAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>2018-08-09 15:32:48 +0000
commitf3bde0485c2451487c0debc8719d290d56eb7009 (patch)
treee52c0416302bc835bbd0477b54b260a2b5cf5017 /llvm/utils/TableGen/PredicateExpander.cpp
parent879c1421301af0880d711320bcc0df0d911b16a8 (diff)
downloadbcm5719-llvm-f3bde0485c2451487c0debc8719d290d56eb7009.tar.gz
bcm5719-llvm-f3bde0485c2451487c0debc8719d290d56eb7009.zip
[MC][PredicateExpander] Extend the grammar to support simple switch and return statements.
This patch introduces tablegen class MCStatement. Currently, an MCStatement can be either a return statement, or a switch statement. ``` MCStatement: MCReturnStatement MCOpcodeSwitchStatement ``` A MCReturnStatement expands to a return statement, and the boolean expression associated with the return statement is described by a MCInstPredicate. An MCOpcodeSwitchStatement is a switch statement where the condition is a check on the machine opcode. It allows the definition of multiple checks, as well as a default case. More details on the grammar implemented by these two new constructs can be found in the diff for TargetInstrPredicates.td. This patch makes it easier to read the body of auto-generated TargetInstrInfo predicates. In future, I plan to reuse/extend the MCStatement grammar to describe more complex target hooks. For now, this is just a first step (mostly a minor cosmetic change to polish the new predicates framework). Differential Revision: https://reviews.llvm.org/D50457 llvm-svn: 339352
Diffstat (limited to 'llvm/utils/TableGen/PredicateExpander.cpp')
-rw-r--r--llvm/utils/TableGen/PredicateExpander.cpp66
1 files changed, 66 insertions, 0 deletions
diff --git a/llvm/utils/TableGen/PredicateExpander.cpp b/llvm/utils/TableGen/PredicateExpander.cpp
index 68eb32794a0..6f611737a43 100644
--- a/llvm/utils/TableGen/PredicateExpander.cpp
+++ b/llvm/utils/TableGen/PredicateExpander.cpp
@@ -176,6 +176,72 @@ void PredicateExpander::expandCheckNonPortable(formatted_raw_ostream &OS,
OS << '(' << Code << ')';
}
+void PredicateExpander::expandReturnStatement(formatted_raw_ostream &OS,
+ const Record *Rec) {
+ OS << "return ";
+ expandPredicate(OS, Rec);
+ OS << ";";
+}
+
+void PredicateExpander::expandOpcodeSwitchCase(formatted_raw_ostream &OS,
+ const Record *Rec) {
+ const RecVec &Opcodes = Rec->getValueAsListOfDefs("Opcodes");
+ for (const Record *Opcode : Opcodes) {
+ OS.PadToColumn(getIndentLevel() * 2);
+ OS << "case " << Opcode->getValueAsString("Namespace")
+ << "::" << Opcode->getName() << " :\n";
+ }
+
+ increaseIndentLevel();
+ expandStatement(OS, Rec->getValueAsDef("CaseStmt"));
+ decreaseIndentLevel();
+}
+
+void PredicateExpander::expandOpcodeSwitchStatement(formatted_raw_ostream &OS,
+ const RecVec &Cases,
+ const Record *Default) {
+ OS << "switch(MI" << (isByRef() ? "." : "->") << "getOpcode()) {\n";
+
+ for (const Record *Rec : Cases) {
+ expandOpcodeSwitchCase(OS, Rec);
+ OS << '\n';
+ }
+
+ unsigned ColNum = getIndentLevel() * 2;
+ OS.PadToColumn(ColNum);
+
+ // Expand the default case.
+ OS << "default :\n";
+ increaseIndentLevel();
+ expandStatement(OS, Default);
+ decreaseIndentLevel();
+ OS << '\n';
+
+ OS.PadToColumn(ColNum);
+ OS << "} // end of switch-stmt";
+}
+
+void PredicateExpander::expandStatement(formatted_raw_ostream &OS,
+ const Record *Rec) {
+ OS.flush();
+ unsigned ColNum = getIndentLevel() * 2;
+ if (OS.getColumn() < ColNum)
+ OS.PadToColumn(ColNum);
+
+ if (Rec->isSubClassOf("MCOpcodeSwitchStatement")) {
+ expandOpcodeSwitchStatement(OS, Rec->getValueAsListOfDefs("Cases"),
+ Rec->getValueAsDef("DefaultCase"));
+ return;
+ }
+
+ if (Rec->isSubClassOf("MCReturnStatement")) {
+ expandReturnStatement(OS, Rec->getValueAsDef("Pred"));
+ return;
+ }
+
+ llvm_unreachable("No known rules to expand this MCStatement");
+}
+
void PredicateExpander::expandPredicate(formatted_raw_ostream &OS,
const Record *Rec) {
OS.flush();
OpenPOWER on IntegriCloud