[llvm-commits] [llvm] r53158 - in /llvm/trunk: include/llvm/GlobalValue.h lib/Linker/LinkModules.cpp

Nick Lewycky nicholas at mxc.ca
Mon Sep 1 15:06:06 PDT 2008


Anton Korobeynikov wrote:
> Author: asl
> Date: Sat Jul  5 18:48:30 2008
> New Revision: 53158
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=53158&view=rev
> Log:
> Add convenient helper for checking whether global is weak in linker sense
> having weak or linkonce or common or extweak LLVM linkage.

Hi Anton,

I ran across this function and have no idea what it is doing. I 
understand that it's an OR of those linkage types -- but why? What do 
those linkages all have in common? And why do you call it "weak for 
linker"? What's the linker got to do with it, above and beyond the 
'linkages' that these already are? Could you elaborate in the 
documentation for this function? I'd appreciate it.

Specifically, I happened to be looking for a function to determine 
whether or not this global was known to be 'absolutely final' at run 
time or not, regardless of what else we get linked against, or any 
LD_PRELOAD trickery to override weak symbols, etc. For all I know, this 
function might be it -- I couldn't tell.

Nick

> 
> Modified:
>     llvm/trunk/include/llvm/GlobalValue.h
>     llvm/trunk/lib/Linker/LinkModules.cpp
> 
> Modified: llvm/trunk/include/llvm/GlobalValue.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/GlobalValue.h?rev=53158&r1=53157&r2=53158&view=diff
> 
> ==============================================================================
> --- llvm/trunk/include/llvm/GlobalValue.h (original)
> +++ llvm/trunk/include/llvm/GlobalValue.h Sat Jul  5 18:48:30 2008
> @@ -110,6 +110,15 @@
>    void setLinkage(LinkageTypes LT) { Linkage = LT; }
>    LinkageTypes getLinkage() const { return Linkage; }
>  
> +  /// isWeakForLinker - Determines if symbol is weak for linker having weak or
> +  /// linkonce or common or extweak LLVM linkage.
> +  bool isWeakForLinker() const {
> +    return (Linkage == WeakLinkage ||
> +            Linkage == LinkOnceLinkage ||
> +            Linkage == CommonLinkage ||
> +            Linkage == ExternalWeakLinkage);
> +  }
> +
>    /// copyAttributesFrom - copy all additional attributes (those not needed to
>    /// create a GlobalValue) from the GlobalValue Src to this one.
>    virtual void copyAttributesFrom(const GlobalValue *Src);
> 
> Modified: llvm/trunk/lib/Linker/LinkModules.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Linker/LinkModules.cpp?rev=53158&r1=53157&r2=53158&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/Linker/LinkModules.cpp (original)
> +++ llvm/trunk/lib/Linker/LinkModules.cpp Sat Jul  5 18:48:30 2008
> @@ -483,11 +483,10 @@
>              "': can only link appending global with another appending global!");
>      LinkFromSrc = true; // Special cased.
>      LT = Src->getLinkage();
> -  } else if (Src->hasWeakLinkage() || Src->hasLinkOnceLinkage() ||
> -             Src->hasCommonLinkage()) {
> +  } else if (Src->isWeakForLinker()) {
>      // At this point we know that Dest has LinkOnce, External*, Weak, Common,
>      // or DLL* linkage.
> -    if ((Dest->hasLinkOnceLinkage() && 
> +    if ((Dest->hasLinkOnceLinkage() &&
>            (Src->hasWeakLinkage() || Src->hasCommonLinkage())) ||
>          Dest->hasExternalWeakLinkage()) {
>        LinkFromSrc = true;
> @@ -496,8 +495,7 @@
>        LinkFromSrc = false;
>        LT = Dest->getLinkage();
>      }
> -  } else if (Dest->hasWeakLinkage() || Dest->hasLinkOnceLinkage() ||
> -             Dest->hasCommonLinkage()) {
> +  } else if (Dest->isWeakForLinker()) {
>      // At this point we know that Src has External* or DLL* linkage.
>      if (Src->hasExternalWeakLinkage()) {
>        LinkFromSrc = false;
> @@ -762,10 +760,7 @@
>      } else if (GlobalVariable *DGVar = dyn_cast_or_null<GlobalVariable>(DGV)) {
>        // The only allowed way is to link alias with external declaration or weak
>        // symbol..
> -      if (DGVar->isDeclaration() ||
> -          DGVar->hasWeakLinkage() ||
> -          DGVar->hasLinkOnceLinkage() ||
> -          DGVar->hasCommonLinkage()) {
> +      if (DGVar->isDeclaration() || DGVar->isWeakForLinker()) {
>          // But only if aliasee is global too...
>          if (!isa<GlobalVariable>(DAliasee))
>            return Error(Err, "Global-Alias Collision on '" + SGA->getName() +
> @@ -794,10 +789,7 @@
>      } else if (Function *DF = dyn_cast_or_null<Function>(DGV)) {
>        // The only allowed way is to link alias with external declaration or weak
>        // symbol...
> -      if (DF->isDeclaration() ||
> -          DF->hasWeakLinkage() ||
> -          DF->hasLinkOnceLinkage() ||
> -          DF->hasCommonLinkage()) {
> +      if (DF->isDeclaration() || DF->isWeakForLinker()) {
>          // But only if aliasee is function too...
>          if (!isa<Function>(DAliasee))
>            return Error(Err, "Function-Alias Collision on '" + SGA->getName() +
> @@ -874,12 +866,10 @@
>            if (DGV->getInitializer() != SInit)
>              return Error(Err, "Global Variable Collision on '" + SGV->getName() +
>                           "': global variables have different initializers");
> -        } else if (DGV->hasLinkOnceLinkage() || DGV->hasWeakLinkage() ||
> -                   DGV->hasCommonLinkage()) {
> +        } else if (DGV->isWeakForLinker()) {
>            // Nothing is required, mapped values will take the new global
>            // automatically.
> -        } else if (SGV->hasLinkOnceLinkage() || SGV->hasWeakLinkage() ||
> -                   SGV->hasCommonLinkage()) {
> +        } else if (SGV->isWeakForLinker()) {
>            // Nothing is required, mapped values will take the new global
>            // automatically.
>          } else if (DGV->hasAppendingLinkage()) {
> @@ -952,10 +942,7 @@
>        // The only valid mappings are:
>        // - SF is external declaration, which is effectively a no-op.
>        // - SF is weak, when we just need to throw SF out.
> -      if (!SF->isDeclaration() &&
> -          !SF->hasWeakLinkage() &&
> -          !SF->hasLinkOnceLinkage() &&
> -          !SF->hasCommonLinkage())
> +      if (!SF->isDeclaration() && !SF->isWeakForLinker())
>          return Error(Err, "Function-Alias Collision on '" + SF->getName() +
>                       "': symbol multiple defined");
>  
> @@ -1042,21 +1029,19 @@
>      }
>      
>      // At this point we know that DF has LinkOnce, Weak, or External* linkage.
> -    if (SF->hasWeakLinkage() || SF->hasLinkOnceLinkage() ||
> -        SF->hasCommonLinkage()) {
> +    if (SF->isWeakForLinker()) {
>        ValueMap[SF] = MappedDF;
>  
>        // Linkonce+Weak = Weak
>        // *+External Weak = *
> -      if ((DF->hasLinkOnceLinkage() && 
> +      if ((DF->hasLinkOnceLinkage() &&
>                (SF->hasWeakLinkage() || SF->hasCommonLinkage())) ||
>            DF->hasExternalWeakLinkage())
>          DF->setLinkage(SF->getLinkage());
>        continue;
>      }
>      
> -    if (DF->hasWeakLinkage() || DF->hasLinkOnceLinkage() ||
> -        DF->hasCommonLinkage()) {
> +    if (DF->isWeakForLinker()) {
>        // At this point we know that SF has LinkOnce or External* linkage.
>        ValueMap[SF] = MappedDF;
>        
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> 




More information about the llvm-commits mailing list