diff options
author | Chris Lattner <sabre@nondot.org> | 2010-03-27 18:49:33 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-03-27 18:49:33 +0000 |
commit | 5d3569e93ce31052a55d6e64b7153d055d60d8e8 (patch) | |
tree | 055823b26b3ccd4bfbfdc285556effd1e12dfdfb /utils | |
parent | 46475cb08e5ac0bb66d23a134e95abcc95dc9ddf (diff) | |
download | external_llvm-5d3569e93ce31052a55d6e64b7153d055d60d8e8.zip external_llvm-5d3569e93ce31052a55d6e64b7153d055d60d8e8.tar.gz external_llvm-5d3569e93ce31052a55d6e64b7153d055d60d8e8.tar.bz2 |
fix a bug in my recent patch that increased opcode size to 2 bytes:
the index comments nested under OPC_SwitchOpcode were off by one.
This fixes the comments.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@99722 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r-- | utils/TableGen/DAGISelMatcherEmitter.cpp | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/utils/TableGen/DAGISelMatcherEmitter.cpp b/utils/TableGen/DAGISelMatcherEmitter.cpp index 22a3430..8855034 100644 --- a/utils/TableGen/DAGISelMatcherEmitter.cpp +++ b/utils/TableGen/DAGISelMatcherEmitter.cpp @@ -280,10 +280,14 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx, // For each case we emit the size, then the opcode, then the matcher. for (unsigned i = 0, e = NumCases; i != e; ++i) { const Matcher *Child; - if (const SwitchOpcodeMatcher *SOM = dyn_cast<SwitchOpcodeMatcher>(N)) + unsigned IdxSize; + if (const SwitchOpcodeMatcher *SOM = dyn_cast<SwitchOpcodeMatcher>(N)) { Child = SOM->getCaseMatcher(i); - else + IdxSize = 2; // size of opcode in table is 2 bytes. + } else { Child = cast<SwitchTypeMatcher>(N)->getCaseMatcher(i); + IdxSize = 1; // size of type in table is 1 byte. + } // We need to encode the opcode and the offset of the case code before // emitting the case code. Handle this by buffering the output into a @@ -299,7 +303,8 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx, TmpBuf.clear(); raw_svector_ostream OS(TmpBuf); formatted_raw_ostream FOS(OS); - ChildSize = EmitMatcherList(Child, Indent+1, CurrentIdx+VBRSize+1, FOS); + ChildSize = EmitMatcherList(Child, Indent+1, CurrentIdx+VBRSize+IdxSize, + FOS); } while (GetVBRSize(ChildSize) != VBRSize); assert(ChildSize != 0 && "Should not have a zero-sized child!"); @@ -315,14 +320,13 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx, CurrentIdx += EmitVBRValue(ChildSize, OS); OS << ' '; - if (const SwitchOpcodeMatcher *SOM = dyn_cast<SwitchOpcodeMatcher>(N)) { + if (const SwitchOpcodeMatcher *SOM = dyn_cast<SwitchOpcodeMatcher>(N)) OS << "TARGET_OPCODE(" << SOM->getCaseOpcode(i).getEnumName() << "),"; - CurrentIdx += 2; - } else { + else OS << getEnumName(cast<SwitchTypeMatcher>(N)->getCaseType(i)) << ','; - ++CurrentIdx; - } - + + CurrentIdx += IdxSize; + if (!OmitComments) OS << "// ->" << CurrentIdx+ChildSize; OS << '\n'; |