]> granicus.if.org Git - clang/commitdiff
Remove nondeterminism introduced in r178950.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Sat, 6 Apr 2013 07:07:44 +0000 (07:07 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Sat, 6 Apr 2013 07:07:44 +0000 (07:07 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@178952 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CodeGenModule.cpp
lib/CodeGen/CodeGenModule.h

index 670f06620d23df4892c3d0979647856591e073a1..e8e3d1ae76e46fe265e03a3b6195a6605e12ec9a 100644 (file)
@@ -1732,13 +1732,15 @@ void CodeGenModule::MaybeHandleStaticInExternC(const SomeDecl *D,
   // OK, this is an internal linkage entity inside an extern "C" linkage
   // specification. Make a note of that so we can give it the "expected"
   // mangled name if nothing else is using that name.
-  StaticExternCMap::iterator I =
-      StaticExternCValues.insert(std::make_pair(D->getIdentifier(), GV)).first;
+  std::pair<StaticExternCMap::iterator, bool> R =
+      StaticExternCValues.insert(std::make_pair(D->getIdentifier(), GV));
 
   // If we have multiple internal linkage entities with the same name
   // in extern "C" regions, none of them gets that name.
-  if (I->second != GV)
-    I->second = 0;
+  if (!R.second)
+    R.first->second = 0;
+  else
+    StaticExternCIdents.push_back(D->getIdentifier());
 }
 
 void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) {
@@ -2947,13 +2949,13 @@ static void EmitGlobalDeclMetadata(CodeGenModule &CGM,
 /// to such functions with an unmangled name from inline assembly within the
 /// same translation unit.
 void CodeGenModule::EmitStaticExternCAliases() {
-  for (StaticExternCMap::iterator I = StaticExternCValues.begin(),
-                                  E = StaticExternCValues.end();
-       I != E; ++I)
-    if (I->second && !getModule().getNamedValue(I->first->getName()))
-      AddUsedGlobal(
-        new llvm::GlobalAlias(I->second->getType(), I->second->getLinkage(),
-                              I->first->getName(), I->second, &getModule()));
+  for (unsigned I = 0, N = StaticExternCIdents.size(); I != N; ++I) {
+    IdentifierInfo *Name = StaticExternCIdents[I];
+    llvm::GlobalValue *Val = StaticExternCValues[Name];
+    if (Val && !getModule().getNamedValue(Name->getName()))
+      AddUsedGlobal(new llvm::GlobalAlias(Val->getType(), Val->getLinkage(),
+                                          Name->getName(), Val, &getModule()));
+  }
 }
 
 /// Emits metadata nodes associating all the global values in the
index ccac4371c49935eca069d9432d78cb9b2e4e9416..6bc44563faee834b80a5c17d167c49c4e7846e79 100644 (file)
@@ -310,6 +310,7 @@ class CodeGenModule : public CodeGenTypeCache {
   typedef llvm::DenseMap<IdentifierInfo *,
                          llvm::GlobalValue *> StaticExternCMap;
   StaticExternCMap StaticExternCValues;
+  std::vector<IdentifierInfo*> StaticExternCIdents;
 
   /// CXXGlobalInits - Global variables with initializers that need to run
   /// before main.