Add weak reference directive.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32091 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/llvm/Target/TargetAsmInfo.h b/include/llvm/Target/TargetAsmInfo.h
index 28c144a..050949e 100644
--- a/include/llvm/Target/TargetAsmInfo.h
+++ b/include/llvm/Target/TargetAsmInfo.h
@@ -211,6 +211,10 @@
     /// as being used somehow that the assembler can't see.  This prevents dead
     /// code elimination on some targets.
     const char *UsedDirective;            // Defaults to null.
+
+    /// WeakRefDirective - This directive, if non-null, is used to decalre a
+    /// global as being a weak undefined symbol.
+    const char *WeakRefDirective;         // Defaults to null.
     
     //===--- Dwarf Emission Directives -----------------------------------===//
 
@@ -422,6 +426,9 @@
     const char *getUsedDirective() const {
       return UsedDirective;
     }
+    const char *getWeakRefDirective() const {
+      return WeakRefDirective;
+    }
     bool hasLEB128() const {
       return HasLEB128;
     }
diff --git a/lib/Target/PowerPC/PPCAsmPrinter.cpp b/lib/Target/PowerPC/PPCAsmPrinter.cpp
index 1b9e94a..abbcc57 100644
--- a/lib/Target/PowerPC/PPCAsmPrinter.cpp
+++ b/lib/Target/PowerPC/PPCAsmPrinter.cpp
@@ -647,11 +647,13 @@
     }
   }
 
-  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";
+  if (TAI->getWeakRefDirective()) {
+    if (ExtWeakSymbols.begin() != ExtWeakSymbols.end())
+      SwitchToDataSection("");
+    for (std::set<std::string>::iterator i = ExtWeakSymbols.begin(),
+         e = ExtWeakSymbols.end(); i != e; ++i) {
+      O << TAI->getWeakRefDirective() << *i << "\n";
+    }
   }
 
   bool isPPC64 = TD->getPointerSizeInBits() == 64;
diff --git a/lib/Target/PowerPC/PPCTargetAsmInfo.cpp b/lib/Target/PowerPC/PPCTargetAsmInfo.cpp
index f8848f5..1e38009 100644
--- a/lib/Target/PowerPC/PPCTargetAsmInfo.cpp
+++ b/lib/Target/PowerPC/PPCTargetAsmInfo.cpp
@@ -33,6 +33,7 @@
   StaticCtorsSection = ".mod_init_func";
   StaticDtorsSection = ".mod_term_func";
   UsedDirective = "\t.no_dead_strip\t";
+  WeakRefDirective = "\t.weak_reference\t";
   InlineAsmStart = "# InlineAsm Start";
   InlineAsmEnd = "# InlineAsm End";
   
diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp
index 2b4f2f7..8b818fb 100644
--- a/lib/Target/TargetAsmInfo.cpp
+++ b/lib/Target/TargetAsmInfo.cpp
@@ -61,6 +61,7 @@
   COMMDirectiveTakesAlignment(true),
   HasDotTypeDotSizeDirective(true),
   UsedDirective(0),
+  WeakRefDirective(0),
   HasLEB128(false),
   HasDotLoc(false),
   HasDotFile(false),
diff --git a/lib/Target/X86/X86AsmPrinter.cpp b/lib/Target/X86/X86AsmPrinter.cpp
index b92a087..7226975 100644
--- a/lib/Target/X86/X86AsmPrinter.cpp
+++ b/lib/Target/X86/X86AsmPrinter.cpp
@@ -278,16 +278,12 @@
     O << "\t.ascii \" -export:" << *i << "\"\n";
   }    
 
-  if (!Subtarget->isTargetCygwin()) {
-    // There is no external weak linkage on Mingw32 platform.
-    // Defaulting to external
+  if (TAI->getWeakRefDirective()) {
     if (ExtWeakSymbols.begin() != ExtWeakSymbols.end())
       SwitchToDataSection("");
-
     for (std::set<std::string>::iterator i = ExtWeakSymbols.begin(),
          e = ExtWeakSymbols.end(); i != e; ++i) {
-      O << (Subtarget->isTargetDarwin() ? "\t.weak_reference" : "\t.weak")
-        << " " << *i << "\n";
+      O << TAI->getWeakRefDirective() << *i << "\n";
     }
   }
   
diff --git a/lib/Target/X86/X86TargetAsmInfo.cpp b/lib/Target/X86/X86TargetAsmInfo.cpp
index 4d44b7d..ed9f1ac 100644
--- a/lib/Target/X86/X86TargetAsmInfo.cpp
+++ b/lib/Target/X86/X86TargetAsmInfo.cpp
@@ -62,6 +62,7 @@
     InlineAsmEnd = "# InlineAsm End";
     SetDirective = "\t.set";
     UsedDirective = "\t.no_dead_strip\t";
+    WeakRefDirective = "\t.weak_reference\t";
     
     NeedsSet = true;
     DwarfAbbrevSection = ".section __DWARF,__debug_abbrev,regular,debug";
@@ -86,6 +87,7 @@
     // HasDotFile - True if target asm supports .file directives.
     // bool HasDotFile; // Defaults to false.
     PrivateGlobalPrefix = ".";  // Prefix for private global symbols
+    WeakRefDirective = "\t.weak\t";
     DwarfRequiresFrameSection = false;
     DwarfAbbrevSection =  "\t.section\t.debug_abbrev,\"\",@progbits";
     DwarfInfoSection =    "\t.section\t.debug_info,\"\",@progbits";