r203370 - [libclang] Don't pad the main buffer for the preamble.

Argyrios Kyrtzidis akyrtzi at gmail.com
Sat Mar 8 20:24:57 PST 2014


Author: akirtzidis
Date: Sat Mar  8 22:24:57 2014
New Revision: 203370

URL: http://llvm.org/viewvc/llvm-project?rev=203370&view=rev
Log:
[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

Added:
    cfe/trunk/test/Index/preamble-reparse-warn-end-of-file.c
    cfe/trunk/test/Index/preamble-reparse-warn-macro.c
Modified:
    cfe/trunk/include/clang/Frontend/ASTUnit.h
    cfe/trunk/lib/Frontend/ASTUnit.cpp

Modified: cfe/trunk/include/clang/Frontend/ASTUnit.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/ASTUnit.h?rev=203370&r1=203369&r2=203370&view=diff
==============================================================================
--- cfe/trunk/include/clang/Frontend/ASTUnit.h (original)
+++ cfe/trunk/include/clang/Frontend/ASTUnit.h Sat Mar  8 22:24:57 2014
@@ -261,10 +261,6 @@ private:
   /// Used to inform the lexer as to whether it's starting at the beginning of
   /// a line after skipping the preamble.
   bool PreambleEndsAtStartOfLine;
-  
-  /// \brief The size of the source buffer that we've reserved for the main 
-  /// file within the precompiled preamble.
-  unsigned PreambleReservedSize;
 
   /// \brief Keeps track of the files that were used when computing the 
   /// preamble, with both their buffer size and their modification time.

Modified: cfe/trunk/lib/Frontend/ASTUnit.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/ASTUnit.cpp?rev=203370&r1=203369&r2=203370&view=diff
==============================================================================
--- cfe/trunk/lib/Frontend/ASTUnit.cpp (original)
+++ cfe/trunk/lib/Frontend/ASTUnit.cpp Sat Mar  8 22:24:57 2014
@@ -1278,20 +1278,6 @@ ASTUnit::ComputePreamble(CompilerInvocat
                                                        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::getMainBuff
     // 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::getMainBuff
                               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::getMainBuff
   // 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::getMainBuff
 
   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::getMainBuff
     PreambleTopLevelHashValue = CurrentTopLevelHashValue;
   }
   
-  return CreatePaddedMainFileBuffer(NewPreamble.first, 
-                                    PreambleReservedSize,
-                                    FrontendOpts.Inputs[0].getFile());
+  return llvm::MemoryBuffer::getMemBufferCopy(NewPreamble.first->getBuffer(),
+                                              MainFilename);
 }
 
 void ASTUnit::RealizeTopLevelDeclsFromPreamble() {

Added: cfe/trunk/test/Index/preamble-reparse-warn-end-of-file.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/preamble-reparse-warn-end-of-file.c?rev=203370&view=auto
==============================================================================
--- cfe/trunk/test/Index/preamble-reparse-warn-end-of-file.c (added)
+++ cfe/trunk/test/Index/preamble-reparse-warn-end-of-file.c Sat Mar  8 22:24:57 2014
@@ -0,0 +1,12 @@
+// RUN: mkdir -p %t
+// RUN: touch %t/header.h
+// RUN: env CINDEXTEST_EDITING=1 c-index-test -test-load-source-reparse 2 local %s -I %t 2> %t.err.txt > %t.out.txt
+// RUN: cat %t.err.txt >> %t.out.txt
+// RUN: FileCheck -input-file=%t.out.txt %s
+// CHECK: preamble-reparse-warn-end-of-file.c:[[FnLine:.*]]:6: FunctionDecl=test:[[FnLine]]:6
+// CHECK: preamble-reparse-warn-end-of-file.c:[[FnLine]]:14: error: expected '}'
+// CHECK: preamble-reparse-warn-end-of-file.c:[[FnLine]]:14: error: expected '}'
+
+#include "header.h"
+
+void test() {

Added: cfe/trunk/test/Index/preamble-reparse-warn-macro.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/preamble-reparse-warn-macro.c?rev=203370&view=auto
==============================================================================
--- cfe/trunk/test/Index/preamble-reparse-warn-macro.c (added)
+++ cfe/trunk/test/Index/preamble-reparse-warn-macro.c Sat Mar  8 22:24:57 2014
@@ -0,0 +1,14 @@
+// RUN: mkdir -p %t
+// RUN: touch %t/header.h
+// RUN: env CINDEXTEST_EDITING=1 c-index-test -test-load-source-reparse 2 local %s -I %t 2> %t.err.txt > %t.out.txt
+// RUN: cat %t.err.txt >> %t.out.txt
+// RUN: FileCheck -input-file=%t.out.txt %s
+// CHECK: preamble-reparse-warn-macro.c:14:9: warning: 'MAC' macro redefined
+// CHECK-NEXT: Number FIX-ITs = 0
+// CHECK-NEXT: preamble-reparse-warn-macro.c:10:9: note: previous definition is here
+
+#define MAC 1
+#include "header.h"
+
+void test();
+#define MAC 2





More information about the cfe-commits mailing list