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:
Argyrios Kyrtzidis 2011-08-23 21:02:38 +00:00
parent 5451a3973b
commit e7f7516148
3 changed files with 36 additions and 13 deletions

View File

@ -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.
//===--------------------------------------------------------------------===//

View File

@ -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.

View File

@ -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);
}