[cfe-commits] r110052 - in /cfe/trunk: include/clang/Frontend/PCHReader.h lib/Frontend/PCHReader.cpp lib/Frontend/PCHWriter.cpp test/PCH/Inputs/chain-decls1.h test/PCH/Inputs/chain-decls2.h test/PCH/chain-decls.c

Sebastian Redl sebastian.redl at getdesigned.at
Mon Aug 2 11:30:12 PDT 2010


Author: cornedbee
Date: Mon Aug  2 13:30:12 2010
New Revision: 110052

URL: http://llvm.org/viewvc/llvm-project?rev=110052&view=rev
Log:
Query only the latest version of an identifier in the PCH chain. Make sure this version holds the entire declaration chain. This is a much saner solution than trying to merge the info from all elements, and makes redeclarations work properly. Expand the declarations test case to cover more compliated cases.

Modified:
    cfe/trunk/include/clang/Frontend/PCHReader.h
    cfe/trunk/lib/Frontend/PCHReader.cpp
    cfe/trunk/lib/Frontend/PCHWriter.cpp
    cfe/trunk/test/PCH/Inputs/chain-decls1.h
    cfe/trunk/test/PCH/Inputs/chain-decls2.h
    cfe/trunk/test/PCH/chain-decls.c

Modified: cfe/trunk/include/clang/Frontend/PCHReader.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/PCHReader.h?rev=110052&r1=110051&r2=110052&view=diff
==============================================================================
--- cfe/trunk/include/clang/Frontend/PCHReader.h (original)
+++ cfe/trunk/include/clang/Frontend/PCHReader.h Mon Aug  2 13:30:12 2010
@@ -906,12 +906,6 @@
   /// \brief Retrieve the macro definition with the given ID.
   MacroDefinition *getMacroDefinition(pch::IdentID ID);
 
-  /// \brief Erase the macro that's bound to the given IdentifierInfo.
-  void EraseMacro(IdentifierInfo *II);
-
-  /// \brief Check if the given macro identifier is built-in.
-  bool isBuiltinMacro(IdentifierInfo *II);
-      
   /// \brief Retrieve the AST context that this PCH reader
   /// supplements.
   ASTContext *getContext() { return Context; }

Modified: cfe/trunk/lib/Frontend/PCHReader.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/PCHReader.cpp?rev=110052&r1=110051&r2=110052&view=diff
==============================================================================
--- cfe/trunk/lib/Frontend/PCHReader.cpp (original)
+++ cfe/trunk/lib/Frontend/PCHReader.cpp Mon Aug  2 13:30:12 2010
@@ -689,9 +689,6 @@
       uint32_t Offset = ReadUnalignedLE32(d);
       Reader.ReadMacroRecord(Stream, Offset);
       DataLen -= 4;
-    } else if (II->hasMacroDefinition() && !Reader.isBuiltinMacro(II)) {
-      // A previous part of the chain added a macro, but this part #undefed it.
-      Reader.EraseMacro(II);
     }
 
     // Read all of the declarations visible at global scope with this
@@ -1389,15 +1386,6 @@
   return MacroDefinitionsLoaded[ID];
 }
 
-void PCHReader::EraseMacro(IdentifierInfo *II) {
-  PP->setMacroInfo(II, 0);
-}
-
-bool PCHReader::isBuiltinMacro(IdentifierInfo *II) {
-  assert(II->hasMacroDefinition() && "Identifier is not a macro");
-  return PP->getMacroInfo(II)->isBuiltinMacro();
-}
-
 /// \brief If we are loading a relocatable PCH file, and the filename is
 /// not an absolute path, add the system root to the beginning of the file
 /// name.
@@ -3184,12 +3172,11 @@
 }
 
 IdentifierInfo* PCHReader::get(const char *NameStart, const char *NameEnd) {
-  // Try to find this name within our on-disk hash tables. We need to aggregate
-  // the info from all of them.
-  IdentifierInfo *II = 0;
+  // Try to find this name within our on-disk hash tables. We start with the
+  // most recent one, since that one contains the most up-to-date info.
   for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
     PCHIdentifierLookupTable *IdTable
-      = (PCHIdentifierLookupTable *)Chain[N - I - 1]->IdentifierLookupTable;
+        = (PCHIdentifierLookupTable *)Chain[I]->IdentifierLookupTable;
     if (!IdTable)
       continue;
     std::pair<const char*, unsigned> Key(NameStart, NameEnd - NameStart);
@@ -3200,9 +3187,9 @@
     // Dereferencing the iterator has the effect of building the
     // IdentifierInfo node and populating it with the various
     // declarations it needs.
-    II = *Pos;
+    return *Pos;
   }
-  return II;
+  return 0;
 }
 
 std::pair<ObjCMethodList, ObjCMethodList>

Modified: cfe/trunk/lib/Frontend/PCHWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/PCHWriter.cpp?rev=110052&r1=110051&r2=110052&view=diff
==============================================================================
--- cfe/trunk/lib/Frontend/PCHWriter.cpp (original)
+++ cfe/trunk/lib/Frontend/PCHWriter.cpp Mon Aug  2 13:30:12 2010
@@ -1819,8 +1819,7 @@
       for (IdentifierResolver::iterator D = IdentifierResolver::begin(II),
                                      DEnd = IdentifierResolver::end();
            D != DEnd; ++D)
-        if (!Writer.hasChain() || (*D)->getPCHLevel() == 0)
-          DataLen += sizeof(pch::DeclID);
+        DataLen += sizeof(pch::DeclID);
     }
     clang::io::Emit16(Out, DataLen);
     // We emit the key length after the data length so that every
@@ -1872,8 +1871,7 @@
     for (llvm::SmallVector<Decl *, 16>::reverse_iterator D = Decls.rbegin(),
                                                       DEnd = Decls.rend();
          D != DEnd; ++D)
-      if (!Writer.hasChain() || (*D)->getPCHLevel() == 0)
-        clang::io::Emit32(Out, Writer.getDeclID(*D));
+      clang::io::Emit32(Out, Writer.getDeclID(*D));
   }
 };
 } // end anonymous namespace

Modified: cfe/trunk/test/PCH/Inputs/chain-decls1.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/Inputs/chain-decls1.h?rev=110052&r1=110051&r2=110052&view=diff
==============================================================================
--- cfe/trunk/test/PCH/Inputs/chain-decls1.h (original)
+++ cfe/trunk/test/PCH/Inputs/chain-decls1.h Mon Aug  2 13:30:12 2010
@@ -2,3 +2,10 @@
 
 struct one {};
 void two();
+
+void many(int i);
+struct many;
+void many(int j);
+struct many;
+
+void noret();

Modified: cfe/trunk/test/PCH/Inputs/chain-decls2.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/Inputs/chain-decls2.h?rev=110052&r1=110051&r2=110052&view=diff
==============================================================================
--- cfe/trunk/test/PCH/Inputs/chain-decls2.h (original)
+++ cfe/trunk/test/PCH/Inputs/chain-decls2.h Mon Aug  2 13:30:12 2010
@@ -3,3 +3,10 @@
 struct two {};
 void one();
 struct three {}; // for verification
+
+void many(int k);
+struct many;
+void many(int l);
+struct many {};
+
+void noret() __attribute__((noreturn));

Modified: cfe/trunk/test/PCH/chain-decls.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/chain-decls.c?rev=110052&r1=110051&r2=110052&view=diff
==============================================================================
--- cfe/trunk/test/PCH/chain-decls.c (original)
+++ cfe/trunk/test/PCH/chain-decls.c Mon Aug  2 13:30:12 2010
@@ -10,7 +10,7 @@
 // CHECK: void f();
 // CHECK: void g();
 
-void h() {
+int h() {
   f();
   g();
 
@@ -19,4 +19,9 @@
   struct two y;
   two();
   struct three z;
+
+  many(0);
+  struct many m;
+
+  noret();
 }





More information about the cfe-commits mailing list