Fixed a problem where the enhanced disassembly
authorSean Callanan <scallanan@apple.com>
Tue, 9 Feb 2010 01:00:18 +0000 (01:00 +0000)
committerSean Callanan <scallanan@apple.com>
Tue, 9 Feb 2010 01:00:18 +0000 (01:00 +0000)
library was reporting inaccurate token IDs.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@95639 91177308-0d34-0410-b5e6-96231b3b80d8

tools/edis/EDToken.cpp

index 6b67e624e8c2ddf83fa4030ed508bdeea26b444b..9408305d4bbeb37331e8f6611166fac65c488d73 100644 (file)
@@ -94,7 +94,8 @@ int EDToken::tokenize(std::vector<EDToken*> &tokens,
   SmallVector<MCParsedAsmOperand*, 5> parsedOperands;
   SmallVector<AsmToken, 10> asmTokens;
   
-  disassembler.parseInst(parsedOperands, asmTokens, str);
+  if(disassembler.parseInst(parsedOperands, asmTokens, str))
+    return -1;
   
   SmallVectorImpl<MCParsedAsmOperand*>::iterator operandIterator;
   unsigned int operandIndex;
@@ -167,7 +168,12 @@ int EDToken::tokenize(std::vector<EDToken*> &tokens,
     if(operandIterator != parsedOperands.end() &&
        tokenLoc.getPointer() >= 
        (*operandIterator)->getStartLoc().getPointer()) {
-      token->setOperandID(operandOrder[operandIndex]);
+      /// operandIndex == 0 means the operand is the instruction (which the
+      /// AsmParser treats as an operand but edis does not).  We therefore skip
+      /// operandIndex == 0 and subtract 1 from all other operand indices.
+      
+      if(operandIndex > 0)
+        token->setOperandID(operandOrder[operandIndex - 1]);
     }
     
     tokens.push_back(token);