- Use canonical FileID when using getSpelling() caching.  This
  addresses some cache misses we were seeing with -fsyntax-only on
  Cocoa.h
- Added Preprocessor::getPhysicalCharacterAt() utility method for
  clients to grab the first character at a specified sourcelocation.
  This uses the PTH spelling cache.
- Modified Sema::ActOnNumericConstant() to use
  Preprocessor::getPhysicalCharacterAt() instead of
  SourceManager::getCharacterData() (to get PTH hits).

These changes cause -fsyntax-only to not page in any sources from
Cocoa.h.  We see a speedup of 27%.

llvm-svn: 62193
This commit is contained in:
Ted Kremenek 2009-01-13 23:19:12 +00:00
parent 2b136fe2a5
commit e9814186ac
4 changed files with 20 additions and 6 deletions

View File

@ -449,6 +449,20 @@ public:
/// if an internal buffer is returned.
unsigned getSpelling(const Token &Tok, const char *&Buffer) const;
/// getPhysicalCharacterAt - Return a pointer to the start of the specified
/// location in the appropriate MemoryBuffer.
char getPhysicalCharacterAt(SourceLocation SL) const {
if (PTH) {
SL = SourceMgr.getPhysicalLoc(SL);
unsigned fid = SourceMgr.getCanonicalFileID(SL);
unsigned fpos = SourceMgr.getFullFilePos(SL);
const char* data;
if (PTH->getSpelling(fid, fpos, data))
return *data;
}
return *SourceMgr.getCharacterData(SL);
}
/// CreateString - Plop the specified string into a scratch buffer and return
/// a location for it. If specified, the source location provides a source

View File

@ -423,7 +423,7 @@ unsigned PTHSpellingSearch::getSpellingBinarySearch(unsigned fpos,
unsigned PTHLexer::getSpelling(SourceLocation sloc, const char *&Buffer) {
SourceManager& SM = PP->getSourceManager();
sloc = SM.getPhysicalLoc(sloc);
unsigned fid = sloc.getFileID();
unsigned fid = SM.getCanonicalFileID(sloc);
unsigned fpos = SM.getFullFilePos(sloc);
return (fid == FileID ) ? MySpellingSrch.getSpellingLinearSearch(fpos, Buffer)

View File

@ -199,7 +199,7 @@ std::string Preprocessor::getSpelling(const Token &Tok) const {
if (PTH) {
SourceLocation sloc = SourceMgr.getPhysicalLoc(Tok.getLocation());
unsigned fid = sloc.getFileID();
unsigned fid = SourceMgr.getCanonicalFileID(sloc);
unsigned fpos = SourceMgr.getFullFilePos(sloc);
if (unsigned len = PTH->getSpelling(fid, fpos, TokStart)) {
assert(!Tok.needsCleaning());
@ -265,7 +265,7 @@ unsigned Preprocessor::getSpelling(const Token &Tok,
}
else {
SourceLocation sloc = SourceMgr.getPhysicalLoc(Tok.getLocation());
unsigned fid = sloc.getFileID();
unsigned fid = SourceMgr.getCanonicalFileID(sloc);
unsigned fpos = SourceMgr.getFullFilePos(sloc);
len = PTH->getSpelling(fid, fpos, Buffer);
}

View File

@ -846,13 +846,13 @@ Action::ExprResult Sema::ActOnNumericConstant(const Token &Tok) {
// fast path for a single digit (which is quite common). A single digit
// cannot have a trigraph, escaped newline, radix prefix, or type suffix.
if (Tok.getLength() == 1) {
const char *Ty = PP.getSourceManager().getCharacterData(Tok.getLocation());
const char Ty = PP.getPhysicalCharacterAt(Tok.getLocation());
unsigned IntSize =static_cast<unsigned>(Context.getTypeSize(Context.IntTy));
return ExprResult(new IntegerLiteral(llvm::APInt(IntSize, *Ty-'0'),
return ExprResult(new IntegerLiteral(llvm::APInt(IntSize, Ty-'0'),
Context.IntTy,
Tok.getLocation()));
}
llvm::SmallString<512> IntegerBuffer;
// Add padding so that NumericLiteralParser can overread by one character.
IntegerBuffer.resize(Tok.getLength()+1);