summaryrefslogtreecommitdiffstats
path: root/clang/lib/Lex/PreprocessingRecord.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-11-01 15:03:47 +0000
committerDouglas Gregor <dgregor@apple.com>2010-11-01 15:03:47 +0000
commitf09b6c9c85a7fd8b5b999c1ce4ae1766c2565e0b (patch)
treeecf70f92fb25327e2d0c399cfaf83e3081caf815 /clang/lib/Lex/PreprocessingRecord.cpp
parent1614597873fa80a8d56d42ab20230ca260daa448 (diff)
downloadbcm5719-llvm-f09b6c9c85a7fd8b5b999c1ce4ae1766c2565e0b.tar.gz
bcm5719-llvm-f09b6c9c85a7fd8b5b999c1ce4ae1766c2565e0b.zip
Plug a leak in the preprocessing record's handling of inclusion
directives. We had a std::string in an object that was allocated via a BumpPtrAllocator. llvm-svn: 117912
Diffstat (limited to 'clang/lib/Lex/PreprocessingRecord.cpp')
-rw-r--r--clang/lib/Lex/PreprocessingRecord.cpp20
1 files changed, 18 insertions, 2 deletions
diff --git a/clang/lib/Lex/PreprocessingRecord.cpp b/clang/lib/Lex/PreprocessingRecord.cpp
index 34421779c93..f6036ef779c 100644
--- a/clang/lib/Lex/PreprocessingRecord.cpp
+++ b/clang/lib/Lex/PreprocessingRecord.cpp
@@ -21,6 +21,22 @@ using namespace clang;
ExternalPreprocessingRecordSource::~ExternalPreprocessingRecordSource() { }
+
+InclusionDirective::InclusionDirective(PreprocessingRecord &PPRec,
+ InclusionKind Kind,
+ llvm::StringRef FileName,
+ bool InQuotes, const FileEntry *File,
+ SourceRange Range)
+ : PreprocessingDirective(InclusionDirectiveKind, Range),
+ InQuotes(InQuotes), Kind(Kind), File(File)
+{
+ char *Memory
+ = (char*)PPRec.Allocate(FileName.size() + 1, llvm::alignOf<char>());
+ memcpy(Memory, FileName.data(), FileName.size());
+ Memory[FileName.size()] = 0;
+ this->FileName = llvm::StringRef(Memory, FileName.size());
+}
+
void PreprocessingRecord::MaybeLoadPreallocatedEntities() const {
if (!ExternalSource || LoadedPreallocatedEntities)
return;
@@ -160,7 +176,7 @@ void PreprocessingRecord::InclusionDirective(SourceLocation HashLoc,
}
clang::InclusionDirective *ID
- = new (*this) clang::InclusionDirective(Kind, FileName, !IsAngled, File,
- SourceRange(HashLoc, EndLoc));
+ = new (*this) clang::InclusionDirective(*this, Kind, FileName, !IsAngled,
+ File, SourceRange(HashLoc, EndLoc));
PreprocessedEntities.push_back(ID);
}
OpenPOWER on IntegriCloud