diff options
| author | Chris Lattner <sabre@nondot.org> | 2009-07-02 22:24:20 +0000 | 
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2009-07-02 22:24:20 +0000 | 
| commit | cc64cc9313d7b6b559ac427e2861484112e11d04 (patch) | |
| tree | 268810ecc882acf9d9180d23e326e132a51f6dc8 /llvm/lib/Support | |
| parent | ade05a37f109bd894342396c00cb44d588d34b9d (diff) | |
| download | bcm5719-llvm-cc64cc9313d7b6b559ac427e2861484112e11d04.tar.gz bcm5719-llvm-cc64cc9313d7b6b559ac427e2861484112e11d04.zip  | |
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
          ^
llvm-svn: 74732
Diffstat (limited to 'llvm/lib/Support')
| -rw-r--r-- | llvm/lib/Support/SourceMgr.cpp | 71 | 
1 files changed, 52 insertions, 19 deletions
diff --git a/llvm/lib/Support/SourceMgr.cpp b/llvm/lib/Support/SourceMgr.cpp index 6232265cb3b..123531e21db 100644 --- a/llvm/lib/Support/SourceMgr.cpp +++ b/llvm/lib/Support/SourceMgr.cpp @@ -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"; +  } +} + +  | 

