diff options
author | Alp Toker <alp@nuanti.com> | 2014-07-07 11:06:51 +0000 |
---|---|---|
committer | Alp Toker <alp@nuanti.com> | 2014-07-07 11:06:51 +0000 |
commit | 7eb95e21d7798c46577ddb33e3d8f87f3e1bb15f (patch) | |
tree | 0dd0b5a80a8a1591ad4b1c72c399be096a17e1c4 /clang/lib/Frontend/ChainedIncludesSource.cpp | |
parent | d0993e00773842b14806aaa8d810b1b1dce6bd61 (diff) | |
download | bcm5719-llvm-7eb95e21d7798c46577ddb33e3d8f87f3e1bb15f.tar.gz bcm5719-llvm-7eb95e21d7798c46577ddb33e3d8f87f3e1bb15f.zip |
ChainedIncludesSource: avoid copying n*(n+1)/2 file contents into memory
Just reference the data instead with shallow MemoryBuffer instances.
llvm-svn: 212450
Diffstat (limited to 'clang/lib/Frontend/ChainedIncludesSource.cpp')
-rw-r--r-- | clang/lib/Frontend/ChainedIncludesSource.cpp | 18 |
1 files changed, 6 insertions, 12 deletions
diff --git a/clang/lib/Frontend/ChainedIncludesSource.cpp b/clang/lib/Frontend/ChainedIncludesSource.cpp index 01897cbf2a3..387f67118e9 100644 --- a/clang/lib/Frontend/ChainedIncludesSource.cpp +++ b/clang/lib/Frontend/ChainedIncludesSource.cpp @@ -126,17 +126,14 @@ ChainedIncludesSource::create(CompilerInstance &CI) { } else { assert(!serialBufs.empty()); SmallVector<llvm::MemoryBuffer *, 4> bufs; - for (unsigned si = 0, se = serialBufs.size(); si != se; ++si) { - bufs.push_back(llvm::MemoryBuffer::getMemBufferCopy( - StringRef(serialBufs[si]->getBufferStart(), - serialBufs[si]->getBufferSize()))); - } + // TODO: Pass through the existing MemoryBuffer instances instead of + // allocating new ones. + for (auto *SB : serialBufs) + bufs.push_back(llvm::MemoryBuffer::getMemBuffer(SB->getBuffer())); std::string pchName = includes[i-1]; llvm::raw_string_ostream os(pchName); os << ".pch" << i-1; - os.flush(); - - serialBufNames.push_back(pchName); + serialBufNames.push_back(os.str()); IntrusiveRefCntPtr<ASTReader> Reader; Reader = createASTReader(*Clang, pchName, bufs, serialBufNames, @@ -151,11 +148,8 @@ ChainedIncludesSource::create(CompilerInstance &CI) { return nullptr; ParseAST(Clang->getSema()); - OS.flush(); Clang->getDiagnosticClient().EndSourceFile(); - serialBufs.push_back( - llvm::MemoryBuffer::getMemBufferCopy(StringRef(serialAST.data(), - serialAST.size()))); + serialBufs.push_back(llvm::MemoryBuffer::getMemBufferCopy(OS.str())); source->CIs.push_back(Clang.release()); } |