forked from OSchip/llvm-project
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
This commit is contained in:
parent
1614597873
commit
f09b6c9c85
|
@ -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); }
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue