mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-20 16:17:38 +00:00
add an explicit class for holding llvm::SourceMgr diagnostics and use
it to print them. This gives us column numbers in the diag line. Before:
t.s:4: error: unexpected token in argument list
mov %eax %edx
^
now:
t.s:4:11: error: unexpected token in argument list
mov %eax %edx
^
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74732 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
+52
-19
@@ -76,17 +76,17 @@ unsigned SourceMgr::FindLineNumber(SMLoc Loc, int BufferID) const {
|
||||
return LineNo;
|
||||
}
|
||||
|
||||
void SourceMgr::PrintIncludeStack(SMLoc IncludeLoc) const {
|
||||
void SourceMgr::PrintIncludeStack(SMLoc IncludeLoc, raw_ostream &OS) const {
|
||||
if (IncludeLoc == SMLoc()) return; // Top of stack.
|
||||
|
||||
int CurBuf = FindBufferContainingLoc(IncludeLoc);
|
||||
assert(CurBuf != -1 && "Invalid or unspecified location!");
|
||||
|
||||
PrintIncludeStack(getBufferInfo(CurBuf).IncludeLoc);
|
||||
PrintIncludeStack(getBufferInfo(CurBuf).IncludeLoc, OS);
|
||||
|
||||
errs() << "Included from "
|
||||
<< getBufferInfo(CurBuf).Buffer->getBufferIdentifier()
|
||||
<< ":" << FindLineNumber(IncludeLoc, CurBuf) << ":\n";
|
||||
OS << "Included from "
|
||||
<< getBufferInfo(CurBuf).Buffer->getBufferIdentifier()
|
||||
<< ":" << FindLineNumber(IncludeLoc, CurBuf) << ":\n";
|
||||
}
|
||||
|
||||
|
||||
@@ -99,19 +99,11 @@ void SourceMgr::PrintMessage(SMLoc Loc, const std::string &Msg,
|
||||
int CurBuf = FindBufferContainingLoc(Loc);
|
||||
assert(CurBuf != -1 && "Invalid or unspecified location!");
|
||||
|
||||
PrintIncludeStack(getBufferInfo(CurBuf).IncludeLoc);
|
||||
PrintIncludeStack(getBufferInfo(CurBuf).IncludeLoc, OS);
|
||||
|
||||
MemoryBuffer *CurMB = getBufferInfo(CurBuf).Buffer;
|
||||
|
||||
|
||||
OS << CurMB->getBufferIdentifier() << ":"
|
||||
<< FindLineNumber(Loc, CurBuf) << ": ";
|
||||
|
||||
if (Type)
|
||||
OS << Type << ": ";
|
||||
|
||||
OS << Msg << "\n";
|
||||
|
||||
// Scan backward to find the start of the line.
|
||||
const char *LineStart = Loc.getPointer();
|
||||
while (LineStart != CurMB->getBufferStart() &&
|
||||
@@ -122,10 +114,51 @@ void SourceMgr::PrintMessage(SMLoc Loc, const std::string &Msg,
|
||||
while (LineEnd != CurMB->getBufferEnd() &&
|
||||
LineEnd[0] != '\n' && LineEnd[0] != '\r')
|
||||
++LineEnd;
|
||||
|
||||
std::string PrintedMsg;
|
||||
if (Type) {
|
||||
PrintedMsg = Type;
|
||||
PrintedMsg += ": ";
|
||||
}
|
||||
PrintedMsg += Msg;
|
||||
|
||||
|
||||
// Print out the line.
|
||||
OS << std::string(LineStart, LineEnd) << "\n";
|
||||
// Print out spaces before the caret.
|
||||
for (const char *Pos = LineStart; Pos != Loc.getPointer(); ++Pos)
|
||||
OS << (*Pos == '\t' ? '\t' : ' ');
|
||||
OS << "^\n";
|
||||
SMDiagnostic(CurMB->getBufferIdentifier(), FindLineNumber(Loc, CurBuf),
|
||||
Loc.getPointer()-LineStart, PrintedMsg,
|
||||
std::string(LineStart, LineEnd)).Print(0, OS);
|
||||
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// SMDiagnostic Implementation
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
void SMDiagnostic::Print(const char *ProgName, raw_ostream &S) {
|
||||
if (ProgName && ProgName[0])
|
||||
S << ProgName << ": ";
|
||||
|
||||
if (Filename == "-")
|
||||
S << "<stdin>";
|
||||
else
|
||||
S << Filename;
|
||||
|
||||
if (LineNo != -1) {
|
||||
S << ':' << LineNo;
|
||||
if (ColumnNo != -1)
|
||||
S << ':' << (ColumnNo+1);
|
||||
}
|
||||
|
||||
S << ": " << Message << '\n';
|
||||
|
||||
if (LineNo != -1 && ColumnNo != -1) {
|
||||
S << LineContents << '\n';
|
||||
|
||||
// Print out spaces/tabs before the caret.
|
||||
for (unsigned i = 0; i != unsigned(ColumnNo); ++i)
|
||||
S << (LineContents[i] == '\t' ? '\t' : ' ');
|
||||
S << "^\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user