diff options
| author | Chris Lattner <sabre@nondot.org> | 2011-10-16 04:47:35 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2011-10-16 04:47:35 +0000 |
| commit | a3a06810836e42098c37baba492297e30bdf65c4 (patch) | |
| tree | af39ceb3a19551ed140572d08b494545db94c952 /llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp | |
| parent | 25ea4e5ad322948563dd8995d156ed21ef7ba689 (diff) | |
| download | bcm5719-llvm-a3a06810836e42098c37baba492297e30bdf65c4.tar.gz bcm5719-llvm-a3a06810836e42098c37baba492297e30bdf65c4.zip | |
Enhance llvm::SourceMgr to support diagnostic ranges, the same way clang does. Enhance
the X86 asmparser to produce ranges in the one case that was annoying me, for example:
test.s:10:15: error: invalid operand for instruction
movl 0(%rax), 0(%edx)
^~~~~~~
It should be straight-forward to enhance filecheck, tblgen, and/or the .ll parser to use
ranges where appropriate if someone is interested.
llvm-svn: 142106
Diffstat (limited to 'llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp')
| -rw-r--r-- | llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp index cb4f15ffed3..eda180e7348 100644 --- a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp +++ b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp @@ -41,7 +41,10 @@ private: MCAsmLexer &getLexer() const { return Parser.getLexer(); } - bool Error(SMLoc L, const Twine &Msg) { return Parser.Error(L, Msg); } + bool Error(SMLoc L, const Twine &Msg, + ArrayRef<SMRange> Ranges = ArrayRef<SMRange>()) { + return Parser.Error(L, Msg, Ranges); + } X86Operand *ParseOperand(); X86Operand *ParseMemOperand(unsigned SegReg, SMLoc StartLoc); @@ -145,6 +148,8 @@ struct X86Operand : public MCParsedAsmOperand { SMLoc getStartLoc() const { return StartLoc; } /// getEndLoc - Get the location of the last token of this operand. SMLoc getEndLoc() const { return EndLoc; } + + SMRange getLocRange() const { return SMRange(StartLoc, EndLoc); } virtual void print(raw_ostream &OS) const {} @@ -1083,16 +1088,19 @@ MatchAndEmitInstruction(SMLoc IDLoc, } // Recover location info for the operand if we know which was the problem. - SMLoc ErrorLoc = IDLoc; if (OrigErrorInfo != ~0U) { if (OrigErrorInfo >= Operands.size()) return Error(IDLoc, "too few operands for instruction"); - ErrorLoc = ((X86Operand*)Operands[OrigErrorInfo])->getStartLoc(); - if (ErrorLoc == SMLoc()) ErrorLoc = IDLoc; + X86Operand *Operand = (X86Operand*)Operands[OrigErrorInfo]; + if (Operand->getStartLoc().isValid()) { + SMRange OperandRange = Operand->getLocRange(); + return Error(Operand->getStartLoc(), "invalid operand for instruction", + OperandRange); + } } - return Error(ErrorLoc, "invalid operand for instruction"); + return Error(IDLoc, "invalid operand for instruction"); } // If one instruction matched with a missing feature, report this as a @@ -1112,7 +1120,6 @@ MatchAndEmitInstruction(SMLoc IDLoc, } // If all of these were an outright failure, report it in a useless way. - // FIXME: We should give nicer diagnostics about the exact failure. Error(IDLoc, "unknown use of instruction mnemonic without a size suffix"); return true; } |

