diff options
author | Sean Silva <silvas@purdue.edu> | 2012-09-19 01:47:03 +0000 |
---|---|---|
committer | Sean Silva <silvas@purdue.edu> | 2012-09-19 01:47:03 +0000 |
commit | b2df610b44902124c22f3661a39bffd5341da62d (patch) | |
tree | 53ae0470c3f1aa166d39206d743b47ef100eee9c /utils | |
parent | decfdf548b43c80c3dd81ff1cc3639b80ed33a3e (diff) | |
download | external_llvm-b2df610b44902124c22f3661a39bffd5341da62d.zip external_llvm-b2df610b44902124c22f3661a39bffd5341da62d.tar.gz external_llvm-b2df610b44902124c22f3661a39bffd5341da62d.tar.bz2 |
Iterate deterministicaly over ClassInfo*'s
Fixes an observed instance of nondeterministic TableGen output.
Review by Jakob.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@164191 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r-- | utils/TableGen/AsmMatcherEmitter.cpp | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/utils/TableGen/AsmMatcherEmitter.cpp b/utils/TableGen/AsmMatcherEmitter.cpp index b8deba3..fa4987f 100644 --- a/utils/TableGen/AsmMatcherEmitter.cpp +++ b/utils/TableGen/AsmMatcherEmitter.cpp @@ -279,6 +279,15 @@ public: } }; +namespace { +/// Sort ClassInfo pointers independently of pointer value. +struct LessClassInfoPtr { + bool operator()(const ClassInfo *LHS, const ClassInfo *RHS) const { + return *LHS < *RHS; + } +}; +} + /// MatchableInfo - Helper class for storing the necessary information for an /// instruction or alias which is capable of being matched. struct MatchableInfo { @@ -1240,7 +1249,8 @@ void AsmMatcherInfo::buildOperandMatchInfo() { /// Map containing a mask with all operands indices that can be found for /// that class inside a instruction. - std::map<ClassInfo*, unsigned> OpClassMask; + typedef std::map<ClassInfo*, unsigned, LessClassInfoPtr> OpClassMaskTy; + OpClassMaskTy OpClassMask; for (std::vector<MatchableInfo*>::const_iterator it = Matchables.begin(), ie = Matchables.end(); @@ -1259,7 +1269,7 @@ void AsmMatcherInfo::buildOperandMatchInfo() { } // Generate operand match info for each mnemonic/operand class pair. - for (std::map<ClassInfo*, unsigned>::iterator iit = OpClassMask.begin(), + for (OpClassMaskTy::iterator iit = OpClassMask.begin(), iie = OpClassMask.end(); iit != iie; ++iit) { unsigned OpMask = iit->second; ClassInfo *CI = iit->first; |