Change PTHLexer::getSourceLocation() to not call GetToken() and instead just read the file offset in the token data buffer directly.

llvm-svn: 61170
This commit is contained in:
Ted Kremenek 2008-12-17 23:36:32 +00:00
parent be4fb8a25f
commit 63ff81c4e1
2 changed files with 17 additions and 2 deletions

View File

@ -90,8 +90,8 @@ public:
/// getSourceLocation - Return a source location for the token in
/// the current file.
SourceLocation getSourceLocation() { return GetToken().getLocation(); }
SourceLocation getSourceLocation();
/// SkipBlock - Used by Preprocessor to skip the current conditional block.
bool SkipBlock();

View File

@ -262,6 +262,21 @@ bool PTHLexer::SkipBlock() {
return isEndif;
}
SourceLocation PTHLexer::getSourceLocation() {
// getLocation is not on the hot path. It is used to get the location of
// the next token when transitioning back to this lexer when done
// handling a #included file. Just read the necessary data from the token
// data buffer to construct the SourceLocation object.
// NOTE: This is a virtual function; hence it is defined out-of-line.
const char* p = CurPtr + (1 + 1 + 4);
uint32_t offset =
((uint32_t) ((uint8_t) p[0]))
| (((uint32_t) ((uint8_t) p[1])) << 8)
| (((uint32_t) ((uint8_t) p[2])) << 16)
| (((uint32_t) ((uint8_t) p[3])) << 24);
return SourceLocation::getFileLoc(FileID, offset);
}
//===----------------------------------------------------------------------===//
// Token reconstruction from the PTH file.
//===----------------------------------------------------------------------===//