forked from OSchip/llvm-project
Introduce SourceManager::isInSLocAddrSpace and use it in TokenLexer instead of isInFileID
since it is a bit more efficient. llvm-svn: 138379
This commit is contained in:
parent
5451a3973b
commit
e7f7516148
|
@ -882,6 +882,30 @@ public:
|
|||
/// expanded.
|
||||
bool isMacroArgExpansion(SourceLocation Loc) const;
|
||||
|
||||
/// \brief Returns true if \arg Loc is inside the [\arg Start, +\arg Length)
|
||||
/// chunk of the source location address space.
|
||||
/// If it's true and \arg RelativeOffset is non-null, it will be set to the
|
||||
/// relative offset of \arg Loc inside the chunk.
|
||||
bool isInSLocAddrSpace(SourceLocation Loc,
|
||||
SourceLocation Start, unsigned Length,
|
||||
unsigned *RelativeOffset = 0) const {
|
||||
assert(((Start.getOffset() < NextLocalOffset &&
|
||||
Start.getOffset()+Length <= NextLocalOffset) ||
|
||||
(Start.getOffset() >= CurrentLoadedOffset &&
|
||||
Start.getOffset()+Length < MaxLoadedOffset)) &&
|
||||
"Chunk is not valid SLoc address space");
|
||||
unsigned LocOffs = Loc.getOffset();
|
||||
unsigned BeginOffs = Start.getOffset();
|
||||
unsigned EndOffs = BeginOffs + Length;
|
||||
if (LocOffs >= BeginOffs && LocOffs < EndOffs) {
|
||||
if (RelativeOffset)
|
||||
*RelativeOffset = LocOffs - BeginOffs;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Queries about the code at a SourceLocation.
|
||||
//===--------------------------------------------------------------------===//
|
||||
|
|
|
@ -71,8 +71,10 @@ class TokenLexer {
|
|||
/// "source location address space".
|
||||
unsigned MacroStartSLocOffset;
|
||||
|
||||
/// \brief FileID/offset of the start of the macro definition.
|
||||
std::pair<FileID, unsigned> MacroDefStartInfo;
|
||||
/// \brief Location of the macro definition.
|
||||
SourceLocation MacroDefStart;
|
||||
/// \brief Length of the macro definition.
|
||||
unsigned MacroDefLength;
|
||||
|
||||
/// Lexical information about the expansion point of the macro: the identifier
|
||||
/// that the macro expanded from had these properties.
|
||||
|
|
|
@ -55,12 +55,12 @@ void TokenLexer::Init(Token &Tok, SourceLocation ELEnd, MacroArgs *Actuals) {
|
|||
// definition. Tokens that get lexed directly from the definition will
|
||||
// have their locations pointing inside this chunk. This is to avoid
|
||||
// creating separate source location entries for each token.
|
||||
SourceLocation macroStart = SM.getExpansionLoc(Tokens[0].getLocation());
|
||||
MacroDefStartInfo = SM.getDecomposedLoc(macroStart);
|
||||
MacroExpansionStart = SM.createExpansionLoc(macroStart,
|
||||
MacroDefStart = SM.getExpansionLoc(Tokens[0].getLocation());
|
||||
MacroDefLength = Macro->getDefinitionLength(SM);
|
||||
MacroExpansionStart = SM.createExpansionLoc(MacroDefStart,
|
||||
ExpandLocStart,
|
||||
ExpandLocEnd,
|
||||
Macro->getDefinitionLength(SM));
|
||||
MacroDefLength);
|
||||
}
|
||||
|
||||
// If this is a function-like macro, expand the arguments and change
|
||||
|
@ -647,14 +647,11 @@ TokenLexer::getExpansionLocForMacroDefLoc(SourceLocation loc) const {
|
|||
assert(loc.isValid() && loc.isFileID());
|
||||
|
||||
SourceManager &SM = PP.getSourceManager();
|
||||
assert(SM.isInFileID(loc,
|
||||
MacroDefStartInfo.first, MacroDefStartInfo.second,
|
||||
Macro->getDefinitionLength(SM)));
|
||||
assert(SM.isInSLocAddrSpace(loc, MacroDefStart, MacroDefLength) &&
|
||||
"Expected loc to come from the macro definition");
|
||||
|
||||
unsigned relativeOffset;
|
||||
SM.isInFileID(loc,
|
||||
MacroDefStartInfo.first, MacroDefStartInfo.second,
|
||||
Macro->getDefinitionLength(SM), &relativeOffset);
|
||||
unsigned relativeOffset = 0;
|
||||
SM.isInSLocAddrSpace(loc, MacroDefStart, MacroDefLength, &relativeOffset);
|
||||
return MacroExpansionStart.getFileLocWithOffset(relativeOffset);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue