Use a smallstring instead of an std::string in FileChanged to avoid some malloc traffic.
This speeds up -E on xalancbmk by 2.4% llvm-svn: 40461
This commit is contained in:
parent
830a77fd65
commit
4c4a245475
|
@ -231,7 +231,7 @@ unsigned SourceManager::getColumnNumber(SourceLocation Loc) const {
|
|||
/// getSourceName - This method returns the name of the file or buffer that
|
||||
/// the SourceLocation specifies. This can be modified with #line directives,
|
||||
/// etc.
|
||||
std::string SourceManager::getSourceName(SourceLocation Loc) {
|
||||
const char *SourceManager::getSourceName(SourceLocation Loc) {
|
||||
unsigned FileID = Loc.getFileID();
|
||||
if (FileID == 0) return "";
|
||||
return getFileInfo(FileID)->Buffer->getBufferIdentifier();
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include "clang/Lex/Pragma.h"
|
||||
#include "clang/Basic/SourceManager.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/ADT/SmallString.h"
|
||||
#include "llvm/ADT/StringExtras.h"
|
||||
#include "llvm/Config/config.h"
|
||||
#include <cstdio>
|
||||
|
@ -123,13 +124,13 @@ namespace {
|
|||
class PrintPPOutputPPCallbacks : public PPCallbacks {
|
||||
Preprocessor &PP;
|
||||
unsigned CurLine;
|
||||
std::string CurFilename;
|
||||
bool EmittedTokensOnThisLine;
|
||||
DirectoryLookup::DirType FileType;
|
||||
llvm::SmallString<512> CurFilename;
|
||||
public:
|
||||
PrintPPOutputPPCallbacks(Preprocessor &pp) : PP(pp) {
|
||||
CurLine = 0;
|
||||
CurFilename = "<uninit>";
|
||||
CurFilename += "<uninit>";
|
||||
EmittedTokensOnThisLine = false;
|
||||
FileType = DirectoryLookup::NormalHeaderDir;
|
||||
}
|
||||
|
@ -237,7 +238,9 @@ void PrintPPOutputPPCallbacks::FileChanged(SourceLocation Loc,
|
|||
|
||||
Loc = SourceMgr.getLogicalLoc(Loc);
|
||||
CurLine = SourceMgr.getLineNumber(Loc);
|
||||
CurFilename = Lexer::Stringify(SourceMgr.getSourceName(Loc));
|
||||
CurFilename.clear();
|
||||
CurFilename += SourceMgr.getSourceName(Loc);
|
||||
Lexer::Stringify(CurFilename);
|
||||
FileType = FileType;
|
||||
|
||||
if (EmittedTokensOnThisLine) {
|
||||
|
|
|
@ -92,6 +92,17 @@ std::string Lexer::Stringify(const std::string &Str, bool Charify) {
|
|||
return Result;
|
||||
}
|
||||
|
||||
/// Stringify - Convert the specified string into a C string by escaping '\'
|
||||
/// and " characters. This does not add surrounding ""'s to the string.
|
||||
void Lexer::Stringify(llvm::SmallVectorImpl<char> &Str) {
|
||||
for (unsigned i = 0, e = Str.size(); i != e; ++i) {
|
||||
if (Str[i] == '\\' || Str[i] == '"') {
|
||||
Str.insert(Str.begin()+i, '\\');
|
||||
++i; ++e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Character information.
|
||||
|
|
|
@ -240,7 +240,7 @@ public:
|
|||
/// getSourceName - This method returns the name of the file or buffer that
|
||||
/// the SourceLocation specifies. This can be modified with #line directives,
|
||||
/// etc.
|
||||
std::string getSourceName(SourceLocation Loc);
|
||||
const char *getSourceName(SourceLocation Loc);
|
||||
|
||||
/// Given a SourceLocation object, return the logical location referenced by
|
||||
/// the ID. This logical location is subject to #line directives, etc.
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include "clang/Lex/Token.h"
|
||||
#include "clang/Lex/MultipleIncludeOpt.h"
|
||||
#include "clang/Basic/LangOptions.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <cassert>
|
||||
|
@ -173,6 +174,10 @@ public:
|
|||
/// If Charify is true, this escapes the ' character instead of ".
|
||||
static std::string Stringify(const std::string &Str, bool Charify = false);
|
||||
|
||||
/// Stringify - Convert the specified string into a C string by escaping '\'
|
||||
/// and " characters. This does not add surrounding ""'s to the string.
|
||||
static void Stringify(llvm::SmallVectorImpl<char> &Str);
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Internal implementation interfaces.
|
||||
private:
|
||||
|
|
Loading…
Reference in New Issue