PTH:
- 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:
parent
2b136fe2a5
commit
e9814186ac
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue