summaryrefslogtreecommitdiffstats
path: root/clang/lib/Frontend/ChainedIncludesSource.cpp
diff options
context:
space:
mode:
authorAlp Toker <alp@nuanti.com>2014-07-07 11:06:51 +0000
committerAlp Toker <alp@nuanti.com>2014-07-07 11:06:51 +0000
commit7eb95e21d7798c46577ddb33e3d8f87f3e1bb15f (patch)
tree0dd0b5a80a8a1591ad4b1c72c399be096a17e1c4 /clang/lib/Frontend/ChainedIncludesSource.cpp
parentd0993e00773842b14806aaa8d810b1b1dce6bd61 (diff)
downloadbcm5719-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.cpp18
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());
}
OpenPOWER on IntegriCloud