Add LTO_SYMBOL_DEFINITION_WEAKUNDEF, use that on the gold plugin.
authorRafael Espindola <rafael.espindola@gmail.com>
Fri, 24 Apr 2009 16:55:21 +0000 (16:55 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Fri, 24 Apr 2009 16:55:21 +0000 (16:55 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@69972 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm-c/lto.h
tools/gold/gold-plugin.cpp
tools/lto/LTOModule.cpp
tools/lto/LTOModule.h

index 1d9881425e5b5d80692d6ad4e18d697385075289..98b9e0868ad1f60dc0e67c8d8cb87be937c8ac42 100644 (file)
@@ -30,6 +30,7 @@ typedef enum {
     LTO_SYMBOL_DEFINITION_TENTATIVE   = 0x00000200,    
     LTO_SYMBOL_DEFINITION_WEAK        = 0x00000300,    
     LTO_SYMBOL_DEFINITION_UNDEFINED   = 0x00000400,    
+    LTO_SYMBOL_DEFINITION_WEAKUNDEF   = 0x00000500,
     LTO_SYMBOL_SCOPE_MASK             = 0x00003800,    
     LTO_SYMBOL_SCOPE_INTERNAL         = 0x00000800,    
     LTO_SYMBOL_SCOPE_HIDDEN           = 0x00001000,    
index 9ad045061f561dc173bac33f25df4cd4ca523c93..260e175282d53a6bf784c3033222342ae27c8c3b 100644 (file)
@@ -257,6 +257,9 @@ ld_plugin_status claim_file_hook(const ld_plugin_input_file *file,
       case LTO_SYMBOL_DEFINITION_WEAK:
         sym.def = LDPK_WEAKDEF;
         break;
+      case LTO_SYMBOL_DEFINITION_WEAKUNDEF:
+        sym.def = LDPK_WEAKUNDEF;
+        break;
       default:
         (*message)(LDPL_ERROR, "Unknown definition attribute: %d", definition);
         return LDPS_ERR;
index 71f3850e525ce1e819a2514a88f8118058d4ef38..78c8cfe93d34f6201e408a5e398815cc7c5dc0e5 100644 (file)
@@ -258,9 +258,21 @@ void LTOModule::addPotentialUndefinedSymbol(GlobalValue* decl, Mangler &mangler)
 {   
    const char* name = mangler.getValueName(decl).c_str();
     // ignore all llvm.* symbols
-    if ( strncmp(name, "llvm.", 5) != 0 ) {
-        _undefines[name] = 1;
-    }
+    if ( strncmp(name, "llvm.", 5) == 0 )
+      return;
+
+    // we already have the symbol
+    if (_undefines.find(name) != _undefines.end())
+      return;
+
+    NameAndAttributes info;
+    // string is owned by _undefines
+    info.name = ::strdup(name);
+    if (decl->hasExternalWeakLinkage())
+      info.attributes = LTO_SYMBOL_DEFINITION_WEAKUNDEF;
+    else
+      info.attributes = LTO_SYMBOL_DEFINITION_UNDEFINED;
+    _undefines[name] = info;
 }
 
 
@@ -339,16 +351,14 @@ void LTOModule::lazyParseSymbols()
         }
 
         // make symbols for all undefines
-        for (StringSet::iterator it=_undefines.begin(); 
+        for (StringMap<NameAndAttributes>::iterator it=_undefines.begin(); 
                                                 it != _undefines.end(); ++it) {
             // if this symbol also has a definition, then don't make an undefine
             // because it is a tentative definition
             if ( _defines.count(it->getKeyData(), it->getKeyData()+
                                                   it->getKeyLength()) == 0 ) {
-                NameAndAttributes info;
-                info.name = it->getKeyData();
-                info.attributes = LTO_SYMBOL_DEFINITION_UNDEFINED;
-                _symbols.push_back(info);
+              NameAndAttributes info = it->getValue();
+              _symbols.push_back(info);
             }
         }
     }    
index 0cb9cdc8b0cff78fbc00b273459210b1f765bc13..c2337401dac44724e948b702dfb4e4e489b48418 100644 (file)
@@ -97,7 +97,7 @@ private:
     std::vector<NameAndAttributes>          _symbols;
     // _defines and _undefines only needed to disambiguate tentative definitions
     StringSet                               _defines;    
-    StringSet                               _undefines; 
+    llvm::StringMap<NameAndAttributes>      _undefines;
 };
 
 extern std::string getFeatureString(const char *TargetTriple);