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

Anton Korobeynikov asl at math.spbu.ru
Sat Jul 5 16:48:30 PDT 2008


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.

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;
       





More information about the llvm-commits mailing list