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 | 4ab829c2a229dc20ecb9f35e7337bbfa95bf4026 (patch) | |
tree | c349c90f8866912df963e9919e66d299884a555d | |
parent | 9dba61a1e46099b77adf15de224aaa16037a7fff (diff) |
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.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@117912 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Lex/PreprocessingRecord.h | 10 | ||||
-rw-r--r-- | lib/Lex/PreprocessingRecord.cpp | 20 | ||||
-rw-r--r-- | lib/Serialization/ASTReader.cpp | 2 |
3 files changed, 23 insertions, 9 deletions
diff --git a/include/clang/Lex/PreprocessingRecord.h b/include/clang/Lex/PreprocessingRecord.h index 0c5b7bc37f..69a2f18035 100644 --- a/include/clang/Lex/PreprocessingRecord.h +++ b/include/clang/Lex/PreprocessingRecord.h @@ -199,7 +199,7 @@ namespace clang { private: /// \brief The name of the file that was included, as written in /// the source. - std::string FileName; + llvm::StringRef FileName; /// \brief Whether the file name was in quotation marks; otherwise, it was /// in angle brackets. @@ -214,11 +214,9 @@ namespace clang { const FileEntry *File; public: - explicit InclusionDirective(InclusionKind Kind, - const std::string &FileName, bool InQuotes, - const FileEntry *File, SourceRange Range) - : PreprocessingDirective(InclusionDirectiveKind, Range), - FileName(FileName), InQuotes(InQuotes), Kind(Kind), File(File) { } + InclusionDirective(PreprocessingRecord &PPRec, + InclusionKind Kind, llvm::StringRef FileName, + bool InQuotes, const FileEntry *File, SourceRange Range); /// \brief Determine what kind of inclusion directive this is. InclusionKind getKind() const { return static_cast<InclusionKind>(Kind); } diff --git a/lib/Lex/PreprocessingRecord.cpp b/lib/Lex/PreprocessingRecord.cpp index 34421779c9..f6036ef779 100644 --- a/lib/Lex/PreprocessingRecord.cpp +++ b/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); } diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index 22d3cbc68f..5c947bc639 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -1555,7 +1555,7 @@ void ASTReader::ReadMacroRecord(PerFileData &F, uint64_t Offset) { InclusionDirective::InclusionKind Kind = static_cast<InclusionDirective::InclusionKind>(Record[5]); InclusionDirective *ID - = new (PPRec) InclusionDirective(Kind, + = new (PPRec) InclusionDirective(PPRec, Kind, llvm::StringRef(BlobStart, Record[3]), Record[4], File, |