summaryrefslogtreecommitdiffstats
path: root/clang/lib/Frontend/ASTUnit.cpp
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2014-03-09 04:24:57 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2014-03-09 04:24:57 +0000
commitb255ee91a7aae47cf7d6199b447efd6da75f1c76 (patch)
treeed59dcbe52533111a20b7246467b300ee58fee0f /clang/lib/Frontend/ASTUnit.cpp
parent67101a52defbfb6542eabd35c1a99d8b522866a3 (diff)
downloadbcm5719-llvm-b255ee91a7aae47cf7d6199b447efd6da75f1c76.tar.gz
bcm5719-llvm-b255ee91a7aae47cf7d6199b447efd6da75f1c76.zip
[libclang] Don't pad the main buffer for the preamble.
Padding does not seem to be useful currently, and it leads to bogus location if an error points to the end of the file. rdar://15836513 llvm-svn: 203370
Diffstat (limited to 'clang/lib/Frontend/ASTUnit.cpp')
-rw-r--r--clang/lib/Frontend/ASTUnit.cpp46
1 files changed, 6 insertions, 40 deletions
diff --git a/clang/lib/Frontend/ASTUnit.cpp b/clang/lib/Frontend/ASTUnit.cpp
index 4881e28e9bb..7b5e91592ca 100644
--- a/clang/lib/Frontend/ASTUnit.cpp
+++ b/clang/lib/Frontend/ASTUnit.cpp
@@ -1278,20 +1278,6 @@ ASTUnit::ComputePreamble(CompilerInvocation &Invocation,
MaxLines));
}
-static llvm::MemoryBuffer *CreatePaddedMainFileBuffer(llvm::MemoryBuffer *Old,
- unsigned NewSize,
- StringRef NewName) {
- llvm::MemoryBuffer *Result
- = llvm::MemoryBuffer::getNewUninitMemBuffer(NewSize, NewName);
- memcpy(const_cast<char*>(Result->getBufferStart()),
- Old->getBufferStart(), Old->getBufferSize());
- memset(const_cast<char*>(Result->getBufferStart()) + Old->getBufferSize(),
- ' ', NewSize - Old->getBufferSize() - 1);
- const_cast<char*>(Result->getBufferEnd())[-1] = '\n';
-
- return Result;
-}
-
ASTUnit::PreambleFileHash
ASTUnit::PreambleFileHash::createForFile(off_t Size, time_t ModTime) {
PreambleFileHash Result;
@@ -1427,7 +1413,6 @@ llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble(
// new main file.
if (Preamble.size() == NewPreamble.second.first &&
PreambleEndsAtStartOfLine == NewPreamble.second.second &&
- NewPreamble.first->getBufferSize() < PreambleReservedSize-2 &&
memcmp(Preamble.getBufferStart(), NewPreamble.first->getBufferStart(),
NewPreamble.second.first) == 0) {
// The preamble has not changed. We may be able to re-use the precompiled
@@ -1500,11 +1485,8 @@ llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble(
PreambleInvocation->getDiagnosticOpts());
getDiagnostics().setNumWarnings(NumWarningsInPreamble);
- // Create a version of the main file buffer that is padded to
- // buffer size we reserved when creating the preamble.
- return CreatePaddedMainFileBuffer(NewPreamble.first,
- PreambleReservedSize,
- FrontendOpts.Inputs[0].getFile());
+ return llvm::MemoryBuffer::getMemBufferCopy(
+ NewPreamble.first->getBuffer(), FrontendOpts.Inputs[0].getFile());
}
}
@@ -1544,16 +1526,6 @@ llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble(
// We did not previously compute a preamble, or it can't be reused anyway.
SimpleTimer PreambleTimer(WantTiming);
PreambleTimer.setOutput("Precompiling preamble");
-
- // Create a new buffer that stores the preamble. The buffer also contains
- // extra space for the original contents of the file (which will be present
- // when we actually parse the file) along with more room in case the file
- // grows.
- PreambleReservedSize = NewPreamble.first->getBufferSize();
- if (PreambleReservedSize < 4096)
- PreambleReservedSize = 8191;
- else
- PreambleReservedSize *= 2;
// Save the preamble text for later; we'll need to compare against it for
// subsequent reparses.
@@ -1566,13 +1538,8 @@ llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble(
delete PreambleBuffer;
PreambleBuffer
- = llvm::MemoryBuffer::getNewUninitMemBuffer(PreambleReservedSize,
- FrontendOpts.Inputs[0].getFile());
- memcpy(const_cast<char*>(PreambleBuffer->getBufferStart()),
- NewPreamble.first->getBufferStart(), Preamble.size());
- memset(const_cast<char*>(PreambleBuffer->getBufferStart()) + Preamble.size(),
- ' ', PreambleReservedSize - Preamble.size() - 1);
- const_cast<char*>(PreambleBuffer->getBufferEnd())[-1] = '\n';
+ = llvm::MemoryBuffer::getMemBufferCopy(
+ NewPreamble.first->getBuffer().slice(0, Preamble.size()), MainFilename);
// Remap the main source file to the preamble buffer.
StringRef MainFilePath = FrontendOpts.Inputs[0].getFile();
@@ -1721,9 +1688,8 @@ llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble(
PreambleTopLevelHashValue = CurrentTopLevelHashValue;
}
- return CreatePaddedMainFileBuffer(NewPreamble.first,
- PreambleReservedSize,
- FrontendOpts.Inputs[0].getFile());
+ return llvm::MemoryBuffer::getMemBufferCopy(NewPreamble.first->getBuffer(),
+ MainFilename);
}
void ASTUnit::RealizeTopLevelDeclsFromPreamble() {
OpenPOWER on IntegriCloud