Darwin PPC external weak linkage support.
authorEvan Cheng <evan.cheng@apple.com>
Fri, 1 Dec 2006 07:56:37 +0000 (07:56 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Fri, 1 Dec 2006 07:56:37 +0000 (07:56 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32068 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/PowerPC/PPCAsmPrinter.cpp

index b5962ea215a0bf7209100be045b3f4d51d363e06..fdc335d4cf429c16569b52c39ede534f804f6f26 100644 (file)
@@ -52,6 +52,9 @@ namespace {
     std::set<std::string> FnStubs, GVStubs;
     const PPCSubtarget &Subtarget;
     
+    // Necessary for external weak linkage support
+    std::set<std::string> ExtWeakSymbols;
+
     PPCAsmPrinter(std::ostream &O, TargetMachine &TM, const TargetAsmInfo *T)
       : AsmPrinter(O, TM, T), Subtarget(TM.getSubtarget<PPCSubtarget>()) {
     }
@@ -159,6 +162,8 @@ namespace {
             std::string Name = Mang->getValueName(GV);
             FnStubs.insert(Name);
             O << "L" << Name << "$stub";
+            if (GV->hasExternalWeakLinkage())
+              ExtWeakSymbols.insert(Name);
             return;
           }
         }
@@ -330,8 +335,10 @@ void PPCAsmPrinter::printOp(const MachineOperand &MO) {
         return;
       }
     }
-
     O << Name;
+    
+    if (GV->hasExternalWeakLinkage())
+      ExtWeakSymbols.insert(Name);
     return;
   }
 
@@ -633,6 +640,13 @@ bool DarwinAsmPrinter::doFinalization(Module &M) {
     }
   }
 
+  if (ExtWeakSymbols.begin() != ExtWeakSymbols.end())
+    SwitchToDataSection("");
+  for (std::set<std::string>::iterator i = ExtWeakSymbols.begin(),
+       e = ExtWeakSymbols.end(); i != e; ++i) {
+    O << "\t.weak_reference " << *i << "\n";
+  }
+
   bool isPPC64 = TD->getPointerSizeInBits() == 64;
 
   // Output stubs for dynamically-linked functions