r178952 - Remove nondeterminism introduced in r178950.

John McCall rjmccall at apple.com
Mon Apr 8 10:42:57 PDT 2013


On Apr 6, 2013, at 12:07 AM, Richard Smith <richard-llvm at metafoo.co.uk> wrote:

> Author: rsmith
> Date: Sat Apr  6 02:07:44 2013
> New Revision: 178952
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=178952&view=rev
> Log:
> Remove nondeterminism introduced in r178950.
> 
> Modified:
>    cfe/trunk/lib/CodeGen/CodeGenModule.cpp
>    cfe/trunk/lib/CodeGen/CodeGenModule.h
> 
> Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=178952&r1=178951&r2=178952&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Sat Apr  6 02:07:44 2013
> @@ -1732,13 +1732,15 @@ void CodeGenModule::MaybeHandleStaticInE
>   // 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(CodeG
> /// 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
> 
> Modified: cfe/trunk/lib/CodeGen/CodeGenModule.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.h?rev=178952&r1=178951&r2=178952&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CodeGenModule.h (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenModule.h Sat Apr  6 02:07:44 2013
> @@ -310,6 +310,7 @@ class CodeGenModule : public CodeGenType
>   typedef llvm::DenseMap<IdentifierInfo *,
>                          llvm::GlobalValue *> StaticExternCMap;
>   StaticExternCMap StaticExternCValues;
> +  std::vector<IdentifierInfo*> StaticExternCIdents;

I think this is just llvm::MapVector<IdentifierInfo*, llvm::GlobalValue*>.

John.



More information about the cfe-commits mailing list