diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-11-01 15:03:47 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-11-01 15:03:47 +0000 |
commit | f09b6c9c85a7fd8b5b999c1ce4ae1766c2565e0b (patch) | |
tree | ecf70f92fb25327e2d0c399cfaf83e3081caf815 /clang/lib/Lex/PreprocessingRecord.cpp | |
parent | 1614597873fa80a8d56d42ab20230ca260daa448 (diff) | |
download | bcm5719-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.cpp | 20 |
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); } |