eliminate TargetLoweringObjectFileSparc in favor of a TAI hook.
A TAI hook is appropriate in this case because this is just an
asm syntax issue, not a semantic difference. TLOF should model
the semantics of the section.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78498 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/Sparc/SparcISelLowering.cpp b/lib/Target/Sparc/SparcISelLowering.cpp
index 4f6a79e..b560b73 100644
--- a/lib/Target/Sparc/SparcISelLowering.cpp
+++ b/lib/Target/Sparc/SparcISelLowering.cpp
@@ -549,34 +549,8 @@
   }
 }
 
-namespace {
-
-class TargetLoweringObjectFileSparc : public TargetLoweringObjectFileELF {
-public:
-  void getSectionFlagsAsString(SectionKind Kind,
-                               SmallVectorImpl<char> &Str) const {
-    if (Kind.isMergeableConst() || Kind.isMergeableCString())
-      return TargetLoweringObjectFileELF::getSectionFlagsAsString(Kind, Str);
-    
-    // FIXME: Inefficient.
-    std::string Res;
-    if (!Kind.isMetadata())
-      Res += ",#alloc";
-    if (Kind.isText())
-      Res += ",#execinstr";
-    if (Kind.isWriteable())
-      Res += ",#write";
-    if (Kind.isThreadLocal())
-      Res += ",#tls";
-    
-    Str.append(Res.begin(), Res.end());
-  }
-};
-
-}
-
 SparcTargetLowering::SparcTargetLowering(TargetMachine &TM)
-  : TargetLowering(TM, new TargetLoweringObjectFileSparc()) {
+  : TargetLowering(TM, new TargetLoweringObjectFileELF()) {
 
   // Set up the register classes.
   addRegisterClass(MVT::i32, SP::IntRegsRegisterClass);
diff --git a/lib/Target/Sparc/SparcTargetAsmInfo.cpp b/lib/Target/Sparc/SparcTargetAsmInfo.cpp
index 4a5f66c..6ec74e6 100644
--- a/lib/Target/Sparc/SparcTargetAsmInfo.cpp
+++ b/lib/Target/Sparc/SparcTargetAsmInfo.cpp
@@ -22,6 +22,8 @@
   ZeroDirective = "\t.skip\t";
   CommentString = "!";
   COMMDirectiveTakesAlignment = true;
+  
+  SunStyleELFSectionSwitchSyntax = true;
 }
 
 
diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp
index b59e140..5ec36b6 100644
--- a/lib/Target/TargetAsmInfo.cpp
+++ b/lib/Target/TargetAsmInfo.cpp
@@ -49,6 +49,7 @@
   Data16bitsDirective = "\t.short\t";
   Data32bitsDirective = "\t.long\t";
   Data64bitsDirective = "\t.quad\t";
+  SunStyleELFSectionSwitchSyntax = false;
   AlignDirective = "\t.align\t";
   AlignmentIsInBytes = true;
   TextAlignFillValue = 0;
diff --git a/lib/Target/TargetLoweringObjectFile.cpp b/lib/Target/TargetLoweringObjectFile.cpp
index 8a60086..eabd626 100644
--- a/lib/Target/TargetLoweringObjectFile.cpp
+++ b/lib/Target/TargetLoweringObjectFile.cpp
@@ -18,8 +18,9 @@
 #include "llvm/GlobalVariable.h"
 #include "llvm/MC/MCContext.h"
 #include "llvm/MC/MCSection.h"
-#include "llvm/Target/TargetMachine.h"
+#include "llvm/Target/TargetAsmInfo.h"
 #include "llvm/Target/TargetData.h"
+#include "llvm/Target/TargetMachine.h"
 #include "llvm/Target/TargetOptions.h"
 #include "llvm/Support/Mangler.h"
 #include "llvm/ADT/StringExtras.h"
@@ -407,7 +408,25 @@
       
       
 void TargetLoweringObjectFileELF::
-getSectionFlagsAsString(SectionKind Kind, SmallVectorImpl<char> &Str) const {
+getSectionFlagsAsString(SectionKind Kind, SmallVectorImpl<char> &Str,
+                        const TargetAsmInfo &TAI) const {
+  // Handle the weird solaris syntax if desired.
+  if (TAI.usesSunStyleELFSectionSwitchSyntax() &&
+      !Kind.isMergeableConst() && !Kind.isMergeableCString()) {
+    // FIXME: Inefficient.
+    std::string Res;
+    if (!Kind.isMetadata())
+      Res += ",#alloc";
+    if (Kind.isText())
+      Res += ",#execinstr";
+    if (Kind.isWriteable())
+      Res += ",#write";
+    if (Kind.isThreadLocal())
+      Res += ",#tls";
+    Str.append(Res.begin(), Res.end());
+    return;    
+  }
+  
   Str.push_back(',');
   Str.push_back('"');
   
@@ -848,7 +867,8 @@
 
 
 void TargetLoweringObjectFileCOFF::
-getSectionFlagsAsString(SectionKind Kind, SmallVectorImpl<char> &Str) const {
+getSectionFlagsAsString(SectionKind Kind, SmallVectorImpl<char> &Str,
+                        const TargetAsmInfo &TAI) const {
   // FIXME: Inefficient.
   std::string Res = ",\"";
   if (Kind.isText())