Re-commit r214547 with tests fixed. Hopefully all the bots will be happy now.

Original message:

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

llvm-svn: 214555
This commit is contained in:
Richard Smith 2014-08-01 20:39:36 +00:00
parent e2d6429493
commit 1ba0a07e46
3 changed files with 20 additions and 11 deletions

View 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);
}
}

View 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;

View 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
};