]> granicus.if.org Git - clang/commitdiff
Re-commit r214547 with tests fixed. Hopefully all the bots will be happy now.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 1 Aug 2014 20:39:36 +0000 (20:39 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 1 Aug 2014 20:39:36 +0000 (20:39 +0000)
Original message:

Fix iterator invalidation issues that are breaking my modules buildbot's
bootstrap.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@214555 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CodeGenModule.cpp
lib/CodeGen/ModuleBuilder.cpp
test/CodeGenCXX/attr-used.cpp

index a14558f975aafbf2d7f44df8c94f3430896b96be..55d47060ff932940cc6ac243098c50002b3bb00e 100644 (file)
@@ -3305,9 +3305,16 @@ void CodeGenModule::EmitVersionIdentMetadata() {
 }
 
 void CodeGenModule::EmitTargetMetadata() {
-  for (auto &I : MangledDeclNames) {
-    const Decl *D = I.first.getDecl()->getMostRecentDecl();
-    llvm::GlobalValue *GV = GetGlobalValue(I.second);
+  // Warning, new MangledDeclNames may be appended within this loop.
+  // We rely on MapVector insertions adding new elements to the end
+  // of the container.
+  // FIXME: Move this loop into the one target that needs it, and only
+  // loop over those declarations for which we couldn't emit the target
+  // metadata when we emitted the declaration.
+  for (unsigned I = 0; I != MangledDeclNames.size(); ++I) {
+    auto &Val = *(MangledDeclNames.begin() + I);
+    const Decl *D = Val.first.getDecl()->getMostRecentDecl();
+    llvm::GlobalValue *GV = GetGlobalValue(Val.second);
     getTargetCodeGenInfo().emitTargetMD(D, GV, *this);
   }
 }
index c5d18d3286a7b820ddc7efcc6872a5877de6055f..8c5e178fe286a083bd5165d047db97b860e91895 100644 (file)
@@ -94,9 +94,11 @@ namespace {
       for (DeclGroupRef::iterator I = DG.begin(), E = DG.end(); I != E; ++I)
         Builder->EmitTopLevelDecl(*I);
 
-      // Emit any deferred inline method definitions.
-      for (CXXMethodDecl *MD : DeferredInlineMethodDefinitions)
-        Builder->EmitTopLevelDecl(MD);
+      // Emit any deferred inline method definitions. Note that more deferred
+      // methods may be added during this loop, since ASTConsumer callbacks
+      // can be invoked if AST inspection results in declarations being added.
+      for (unsigned I = 0; I != DeferredInlineMethodDefinitions.size(); ++I)
+        Builder->EmitTopLevelDecl(DeferredInlineMethodDefinitions[I]);
       DeferredInlineMethodDefinitions.clear();
 
       return true;
index 86173466735752cd8bf4689e692a6f8a37ad89a9..d2a73f7d33e6cbdf3ce926ffbf768aeac05619d5 100644 (file)
@@ -2,16 +2,16 @@
 
 // <rdar://problem/8684363>: clang++ not respecting __attribute__((used)) on destructors
 struct X0 {
-  // CHECK: define linkonce_odr {{.*}} @_ZN2X0C1Ev
+  // CHECK-DAG: define linkonce_odr {{.*}} @_ZN2X0C1Ev
   __attribute__((used)) X0() {}
-  // CHECK: define linkonce_odr {{.*}} @_ZN2X0D1Ev
+  // CHECK-DAG: define linkonce_odr {{.*}} @_ZN2X0D1Ev
   __attribute__((used)) ~X0() {}
 };
 
 // PR19743: not emitting __attribute__((used)) inline methods in nested classes.
 struct X1 {
   struct Nested {
-    // CHECK: define linkonce_odr {{.*}} @_ZN2X16Nested1fEv
+    // CHECK-DAG: define linkonce_odr {{.*}} @_ZN2X16Nested1fEv
     void __attribute__((used)) f() {}
   };
 };
@@ -22,6 +22,6 @@ struct X2 {
   void __attribute__((used)) bar() { foo(); }
   void foo() { }
 
-  // CHECK: define linkonce_odr {{.*}} @_ZN2X23barEv
-  // CHECK: define linkonce_odr {{.*}} @_ZN2X23fooEv
+  // CHECK-DAG: define linkonce_odr {{.*}} @_ZN2X23barEv
+  // CHECK-DAG: define linkonce_odr {{.*}} @_ZN2X23fooEv
 };