summaryrefslogtreecommitdiff
path: root/utils/TableGen/CodeGenInstruction.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-11-06 07:06:09 +0000
committerChris Lattner <sabre@nondot.org>2010-11-06 07:06:09 +0000
commit3f2c8e474b8775aa1f3c2c0cb817b7f9f564e068 (patch)
tree3f81fbbd09cc1993058fc7f5abb68b1c9a66ed16 /utils/TableGen/CodeGenInstruction.cpp
parentd0f225cafc76ee2d4982c207c6afb25aaf176d12 (diff)
downloadllvm-3f2c8e474b8775aa1f3c2c0cb817b7f9f564e068.tar.gz
llvm-3f2c8e474b8775aa1f3c2c0cb817b7f9f564e068.tar.bz2
llvm-3f2c8e474b8775aa1f3c2c0cb817b7f9f564e068.tar.xz
implement more checking to reject things like:
(someinst GR16:$foo, GR32:$foo) Reimplement BuildAliasOperandReference to be correctly based on the names of operands in the result pattern, instead of on the instruction operand definitions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118328 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen/CodeGenInstruction.cpp')
-rw-r--r--utils/TableGen/CodeGenInstruction.cpp14
1 files changed, 14 insertions, 0 deletions
diff --git a/utils/TableGen/CodeGenInstruction.cpp b/utils/TableGen/CodeGenInstruction.cpp
index f1ba6f7200..a2989b116d 100644
--- a/utils/TableGen/CodeGenInstruction.cpp
+++ b/utils/TableGen/CodeGenInstruction.cpp
@@ -15,6 +15,7 @@
#include "CodeGenTarget.h"
#include "Record.h"
#include "llvm/ADT/StringExtras.h"
+#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/STLExtras.h"
#include <set>
using namespace llvm;
@@ -407,6 +408,10 @@ CodeGenInstAlias::CodeGenInstAlias(Record *R, CodeGenTarget &T)
" arguments, but " + ResultInst->TheDef->getName() +
" instruction expects " + utostr(ResultInst->Operands.size())+
" operands!");
+
+ // NameClass - If argument names are repeated, we need to verify they have
+ // the same class.
+ StringMap<Record*> NameClass;
// Decode and validate the arguments of the result.
for (unsigned i = 0, e = Result->getNumArgs(); i != e; ++i) {
@@ -425,6 +430,15 @@ CodeGenInstAlias::CodeGenInstAlias(Record *R, CodeGenTarget &T)
", instruction operand is class " +
ResultInst->Operands[i].Rec->getName());
+ // Verify we don't have something like: (someinst GR16:$foo, GR32:$foo)
+ // $foo can exist multiple times in the result list, but it must have the
+ // same type.
+ Record *&Entry = NameClass[Result->getArgName(i)];
+ if (Entry && Entry != ADI->getDef())
+ throw TGError(R->getLoc(), "result value $" + Result->getArgName(i) +
+ " is both " + Entry->getName() + " and " +
+ ADI->getDef()->getName() + "!");
+
// Now that it is validated, add it.
ResultOperands.push_back(ResultOperand(Result->getArgName(i),
ADI->getDef()));