зеркало из https://github.com/microsoft/clang-1.git
lower the interface to getLineNumber like we did for
getColumnNumber. This fixes a FIXME in SourceManager::getPresumedLoc because we now just decompose the sloc once. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63701 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
e7353a6a52
Коммит
30fc933e5f
|
@ -162,7 +162,7 @@ void PrintPPOutputPPCallbacks::FileChanged(SourceLocation Loc,
|
|||
}
|
||||
|
||||
Loc = SourceMgr.getInstantiationLoc(Loc);
|
||||
CurLine = SourceMgr.getLineNumber(Loc);
|
||||
CurLine = SourceMgr.getInstantiationLineNumber(Loc);
|
||||
|
||||
if (DisableLineMarkers) return;
|
||||
|
||||
|
|
|
@ -766,7 +766,8 @@ void RewriteObjC::RewriteMethodDeclaration(ObjCMethodDecl *Method) {
|
|||
SourceLocation LocStart = Method->getLocStart();
|
||||
SourceLocation LocEnd = Method->getLocEnd();
|
||||
|
||||
if (SM->getLineNumber(LocEnd) > SM->getLineNumber(LocStart)) {
|
||||
if (SM->getInstantiationLineNumber(LocEnd) >
|
||||
SM->getInstantiationLineNumber(LocStart)) {
|
||||
InsertText(LocStart, "#if 0\n", 6);
|
||||
ReplaceText(LocEnd, 1, ";\n#endif\n", 9);
|
||||
} else {
|
||||
|
|
|
@ -200,8 +200,6 @@ public:
|
|||
FullSourceLoc getInstantiationLoc() const;
|
||||
FullSourceLoc getSpellingLoc() const;
|
||||
|
||||
unsigned getLineNumber() const;
|
||||
|
||||
unsigned getInstantiationLineNumber() const;
|
||||
unsigned getInstantiationColumnNumber() const;
|
||||
|
||||
|
|
|
@ -490,14 +490,10 @@ public:
|
|||
/// for the position indicated. This requires building and caching a table of
|
||||
/// line offsets for the MemoryBuffer, so this is not cheap: use only when
|
||||
/// about to emit a diagnostic.
|
||||
unsigned getLineNumber(SourceLocation Loc) const;
|
||||
unsigned getLineNumber(FileID FID, unsigned FilePos) const;
|
||||
|
||||
unsigned getInstantiationLineNumber(SourceLocation Loc) const {
|
||||
return getLineNumber(getInstantiationLoc(Loc));
|
||||
}
|
||||
unsigned getSpellingLineNumber(SourceLocation Loc) const {
|
||||
return getLineNumber(getSpellingLoc(Loc));
|
||||
}
|
||||
unsigned getInstantiationLineNumber(SourceLocation Loc) const;
|
||||
unsigned getSpellingLineNumber(SourceLocation Loc) const;
|
||||
|
||||
// FIXME: This should handle #line.
|
||||
SrcMgr::CharacteristicKind getFileCharacteristic(SourceLocation Loc) const {
|
||||
|
|
|
@ -78,11 +78,6 @@ FullSourceLoc FullSourceLoc::getSpellingLoc() const {
|
|||
return FullSourceLoc(SrcMgr->getSpellingLoc(*this), *SrcMgr);
|
||||
}
|
||||
|
||||
unsigned FullSourceLoc::getLineNumber() const {
|
||||
assert(isValid());
|
||||
return SrcMgr->getLineNumber(*this);
|
||||
}
|
||||
|
||||
unsigned FullSourceLoc::getInstantiationLineNumber() const {
|
||||
assert(isValid());
|
||||
return SrcMgr->getInstantiationLineNumber(*this);
|
||||
|
|
|
@ -474,11 +474,13 @@ unsigned SourceManager::getColumnNumber(FileID FID, unsigned FilePos) const {
|
|||
}
|
||||
|
||||
unsigned SourceManager::getSpellingColumnNumber(SourceLocation Loc) const {
|
||||
if (Loc.isInvalid()) return 0;
|
||||
std::pair<FileID, unsigned> LocInfo = getDecomposedSpellingLoc(Loc);
|
||||
return getColumnNumber(LocInfo.first, LocInfo.second);
|
||||
}
|
||||
|
||||
unsigned SourceManager::getInstantiationColumnNumber(SourceLocation Loc) const {
|
||||
if (Loc.isInvalid()) return 0;
|
||||
std::pair<FileID, unsigned> LocInfo = getDecomposedInstantiationLoc(Loc);
|
||||
return getColumnNumber(LocInfo.first, LocInfo.second);
|
||||
}
|
||||
|
@ -535,17 +537,12 @@ static void ComputeLineNumbers(ContentCache* FI, llvm::BumpPtrAllocator &Alloc){
|
|||
/// for the position indicated. This requires building and caching a table of
|
||||
/// line offsets for the MemoryBuffer, so this is not cheap: use only when
|
||||
/// about to emit a diagnostic.
|
||||
unsigned SourceManager::getLineNumber(SourceLocation Loc) const {
|
||||
if (Loc.isInvalid()) return 0;
|
||||
assert(Loc.isFileID() && "Don't know what part of instantiation loc to get");
|
||||
|
||||
std::pair<FileID, unsigned> LocInfo = getDecomposedLoc(Loc);
|
||||
|
||||
unsigned SourceManager::getLineNumber(FileID FID, unsigned FilePos) const {
|
||||
ContentCache *Content;
|
||||
if (LastLineNoFileIDQuery == LocInfo.first)
|
||||
if (LastLineNoFileIDQuery == FID)
|
||||
Content = LastLineNoContentCache;
|
||||
else
|
||||
Content = const_cast<ContentCache*>(getSLocEntry(LocInfo.first)
|
||||
Content = const_cast<ContentCache*>(getSLocEntry(FID)
|
||||
.getFile().getContentCache());
|
||||
|
||||
// If this is the first use of line information for this buffer, compute the
|
||||
|
@ -559,12 +556,12 @@ unsigned SourceManager::getLineNumber(SourceLocation Loc) const {
|
|||
unsigned *SourceLineCacheStart = SourceLineCache;
|
||||
unsigned *SourceLineCacheEnd = SourceLineCache + Content->NumLines;
|
||||
|
||||
unsigned QueriedFilePos = LocInfo.second+1;
|
||||
unsigned QueriedFilePos = FilePos+1;
|
||||
|
||||
// If the previous query was to the same file, we know both the file pos from
|
||||
// that query and the line number returned. This allows us to narrow the
|
||||
// search space from the entire file to something near the match.
|
||||
if (LastLineNoFileIDQuery == LocInfo.first) {
|
||||
if (LastLineNoFileIDQuery == FID) {
|
||||
if (QueriedFilePos >= LastLineNoFilePos) {
|
||||
SourceLineCache = SourceLineCache+LastLineNoResult-1;
|
||||
|
||||
|
@ -618,13 +615,25 @@ unsigned SourceManager::getLineNumber(SourceLocation Loc) const {
|
|||
= std::lower_bound(SourceLineCache, SourceLineCacheEnd, QueriedFilePos);
|
||||
unsigned LineNo = Pos-SourceLineCacheStart;
|
||||
|
||||
LastLineNoFileIDQuery = LocInfo.first;
|
||||
LastLineNoFileIDQuery = FID;
|
||||
LastLineNoContentCache = Content;
|
||||
LastLineNoFilePos = QueriedFilePos;
|
||||
LastLineNoResult = LineNo;
|
||||
return LineNo;
|
||||
}
|
||||
|
||||
unsigned SourceManager::getInstantiationLineNumber(SourceLocation Loc) const {
|
||||
if (Loc.isInvalid()) return 0;
|
||||
std::pair<FileID, unsigned> LocInfo = getDecomposedInstantiationLoc(Loc);
|
||||
return getLineNumber(LocInfo.first, LocInfo.second);
|
||||
}
|
||||
unsigned SourceManager::getSpellingLineNumber(SourceLocation Loc) const {
|
||||
if (Loc.isInvalid()) return 0;
|
||||
std::pair<FileID, unsigned> LocInfo = getDecomposedSpellingLoc(Loc);
|
||||
return getLineNumber(LocInfo.first, LocInfo.second);
|
||||
}
|
||||
|
||||
|
||||
/// getPresumedLoc - This method returns the "presumed" location of a
|
||||
/// SourceLocation specifies. A "presumed location" can be modified by #line
|
||||
/// or GNU line marker directives. This provides a view on the data that a
|
||||
|
@ -637,11 +646,8 @@ PresumedLoc SourceManager::getPresumedLoc(SourceLocation Loc) const {
|
|||
|
||||
// Presumed locations are always for instantiation points.
|
||||
std::pair<FileID, unsigned> LocInfo = getDecomposedInstantiationLoc(Loc);
|
||||
Loc = getInstantiationLoc(Loc);
|
||||
|
||||
// FIXME: Could just decompose Loc once!
|
||||
|
||||
const SrcMgr::FileInfo &FI = getSLocEntry(getFileID(Loc)).getFile();
|
||||
const SrcMgr::FileInfo &FI = getSLocEntry(LocInfo.first).getFile();
|
||||
const SrcMgr::ContentCache *C = FI.getContentCache();
|
||||
|
||||
// To get the source name, first consult the FileEntry (if one exists) before
|
||||
|
@ -649,7 +655,8 @@ PresumedLoc SourceManager::getPresumedLoc(SourceLocation Loc) const {
|
|||
const char *Filename =
|
||||
C->Entry ? C->Entry->getName() : C->getBuffer()->getBufferIdentifier();
|
||||
|
||||
return PresumedLoc(Filename, getLineNumber(Loc),
|
||||
return PresumedLoc(Filename,
|
||||
getLineNumber(LocInfo.first, LocInfo.second),
|
||||
getColumnNumber(LocInfo.first, LocInfo.second),
|
||||
FI.getIncludeLoc());
|
||||
}
|
||||
|
|
|
@ -455,7 +455,8 @@ void CGDebugInfo::EmitStopPoint(llvm::Function *Fn, CGBuilderTy &Builder) {
|
|||
// Don't bother if things are the same as last time.
|
||||
SourceManager &SM = M->getContext().getSourceManager();
|
||||
if (CurLoc == PrevLoc
|
||||
|| (SM.getLineNumber(CurLoc) == SM.getLineNumber(PrevLoc)
|
||||
|| (SM.getInstantiationLineNumber(CurLoc) ==
|
||||
SM.getInstantiationLineNumber(PrevLoc)
|
||||
&& SM.isFromSameFile(CurLoc, PrevLoc)))
|
||||
return;
|
||||
|
||||
|
|
|
@ -461,10 +461,10 @@ void HTMLDiagnostics::HighlightRange(Rewriter& R, FileID BugFileID,
|
|||
SourceManager& SM = R.getSourceMgr();
|
||||
|
||||
SourceLocation InstantiationStart = SM.getInstantiationLoc(Range.getBegin());
|
||||
unsigned StartLineNo = SM.getLineNumber(InstantiationStart);
|
||||
unsigned StartLineNo = SM.getInstantiationLineNumber(InstantiationStart);
|
||||
|
||||
SourceLocation InstantiationEnd = SM.getInstantiationLoc(Range.getEnd());
|
||||
unsigned EndLineNo = SM.getLineNumber(InstantiationEnd);
|
||||
unsigned EndLineNo = SM.getInstantiationLineNumber(InstantiationEnd);
|
||||
|
||||
if (EndLineNo < StartLineNo)
|
||||
return;
|
||||
|
|
|
@ -45,11 +45,11 @@ void TextDiagnosticPrinter::HighlightRange(const SourceRange &R,
|
|||
SourceLocation Begin = SM.getInstantiationLoc(R.getBegin());
|
||||
SourceLocation End = SM.getInstantiationLoc(R.getEnd());
|
||||
|
||||
unsigned StartLineNo = SM.getLineNumber(Begin);
|
||||
unsigned StartLineNo = SM.getInstantiationLineNumber(Begin);
|
||||
if (StartLineNo > LineNo || SM.getFileID(Begin) != FID)
|
||||
return; // No intersection.
|
||||
|
||||
unsigned EndLineNo = SM.getLineNumber(End);
|
||||
unsigned EndLineNo = SM.getInstantiationLineNumber(End);
|
||||
if (EndLineNo < LineNo || SM.getFileID(End) != FID)
|
||||
return; // No intersection.
|
||||
|
||||
|
@ -167,7 +167,8 @@ void TextDiagnosticPrinter::HandleDiagnostic(Diagnostic::Level Level,
|
|||
|
||||
// Highlight all of the characters covered by Ranges with ~ characters.
|
||||
for (unsigned i = 0; i != Info.getNumRanges(); ++i)
|
||||
HighlightRange(Info.getRange(i), ILoc.getManager(), ILoc.getLineNumber(),
|
||||
HighlightRange(Info.getRange(i), ILoc.getManager(),
|
||||
ILoc.getInstantiationLineNumber(),
|
||||
ILoc.getFileID(), CaretLine, SourceLine);
|
||||
|
||||
// Next, insert the caret itself.
|
||||
|
|
Загрузка…
Ссылка в новой задаче