Eliminate textual section switching from the x86 backend, one
authorChris Lattner <sabre@nondot.org>
Mon, 3 Aug 2009 21:53:27 +0000 (21:53 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 3 Aug 2009 21:53:27 +0000 (21:53 +0000)
more step towards "semantics sections"

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78002 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/TargetLoweringObjectFile.h
lib/Target/TargetLoweringObjectFile.cpp
lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp

index c81cdc46387be3899a2ca18499807d1aced06368..76cf2aeec1af2424a2b51e9e0f1af9b67a47e2ee 100644 (file)
@@ -26,7 +26,6 @@ namespace llvm {
   class Mangler;
   class TargetMachine;
   
 class TargetLoweringObjectFile {
   MCContext *Ctx;
 protected:
@@ -250,6 +249,11 @@ public:
   /// FIXME: REMOVE this (rdar://7071300)
   virtual bool shouldEmitUsedDirectiveFor(const GlobalValue *GV,
                                           Mangler *) const;
+
+  /// getMachOSection - Return the MCSection for the specified mach-o section.
+  /// FIXME: Switch this to a semantic view eventually.
+  const MCSection *getMachOSection(const char *Name, bool isDirective,
+                                   SectionKind K);
 };
 
 
@@ -264,6 +268,11 @@ public:
   virtual const MCSection *
   SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
                          Mangler *Mang, const TargetMachine &TM) const;
+
+  /// getCOFFSection - Return the MCSection for the specified COFF section.
+  /// FIXME: Switch this to a semantic view eventually.
+  const MCSection *getCOFFSection(const char *Name, bool isDirective,
+                                  SectionKind K);
 };
 
 } // end namespace llvm
index cb950af82cda7641acfc2f617384291f696c13af..ab4e24fea64b82144f3ed8aa43e8e62861638004 100644 (file)
@@ -532,6 +532,14 @@ getSectionForConstant(SectionKind Kind) const {
 //                                 MachO
 //===----------------------------------------------------------------------===//
 
+const MCSection *TargetLoweringObjectFileMachO::
+getMachOSection(const char *Name, bool isDirective, SectionKind K) {
+  // FOR NOW, Just forward.
+  return getOrCreateSection(Name, isDirective, K);  
+}
+
+
+
 void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
                                                const TargetMachine &TM) {
   TargetLoweringObjectFile::Initialize(Ctx, TM);
@@ -733,6 +741,11 @@ shouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const {
 //                                  COFF
 //===----------------------------------------------------------------------===//
 
+const MCSection *TargetLoweringObjectFileCOFF::
+getCOFFSection(const char *Name, bool isDirective, SectionKind K) {
+  return getOrCreateSection(Name, isDirective, K);
+}
+
 void TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx,
                                               const TargetMachine &TM) {
   TargetLoweringObjectFile::Initialize(Ctx, TM);
index 577d312ccadb89ab6da14922c13442109e6fb421..0be7f351d7b9523e004eb828d61f5032183bf8ef 100644 (file)
@@ -899,8 +899,9 @@ bool X86ATTAsmPrinter::doFinalization(Module &M) {
   }
 
   if (Subtarget->isTargetDarwin()) {
-    //TargetLoweringObjectFileMachO &TLOFMacho = 
-    //  static_cast<TargetLoweringObjectFileMachO &>(getObjFileLowering());
+    // All darwin targets use mach-o.
+    TargetLoweringObjectFileMachO &TLOFMacho = 
+      static_cast<TargetLoweringObjectFileMachO &>(getObjFileLowering());
     
     // Add the (possibly multiple) personalities to the set of global value
     // stubs.  Only referenced functions get into the Personalities list.
@@ -916,8 +917,11 @@ bool X86ATTAsmPrinter::doFinalization(Module &M) {
 
     // Output stubs for dynamically-linked functions
     if (!FnStubs.empty()) {
-      SwitchToDataSection("\t.section __IMPORT,__jump_table,symbol_stubs,"
-                          "self_modifying_code+pure_instructions,5", 0);
+      const MCSection *TheSection = 
+      TLOFMacho.getMachOSection("\t.section __IMPORT,__jump_table,symbol_stubs,"
+                                "self_modifying_code+pure_instructions,5", true,
+                                SectionKind::getMetadata());
+      SwitchToSection(TheSection);
       for (StringMap<std::string>::iterator I = FnStubs.begin(),
            E = FnStubs.end(); I != E; ++I)
         O << I->getKeyData() << ":\n" << "\t.indirect_symbol " << I->second
@@ -927,8 +931,11 @@ bool X86ATTAsmPrinter::doFinalization(Module &M) {
 
     // Output stubs for external and common global variables.
     if (!GVStubs.empty()) {
-      SwitchToDataSection(
-                    "\t.section __IMPORT,__pointers,non_lazy_symbol_pointers");
+      const MCSection *TheSection = 
+        TLOFMacho.getMachOSection("\t.section __IMPORT,__pointers,"
+                                  "non_lazy_symbol_pointers", true,
+                                  SectionKind::getMetadata());
+      SwitchToSection(TheSection);
       for (StringMap<std::string>::iterator I = GVStubs.begin(),
            E = GVStubs.end(); I != E; ++I)
         O << I->getKeyData() << ":\n\t.indirect_symbol "
@@ -963,16 +970,17 @@ bool X86ATTAsmPrinter::doFinalization(Module &M) {
   
   
   // Output linker support code for dllexported globals on windows.
-  if (!DLLExportedGVs.empty()) {
-    SwitchToDataSection(".section .drectve");
+  if (!DLLExportedGVs.empty() || !DLLExportedFns.empty()) {
+    // dllexport symbols only exist on coff targets.
+    TargetLoweringObjectFileCOFF &TLOFMacho = 
+      static_cast<TargetLoweringObjectFileCOFF&>(getObjFileLowering());
+    
+    SwitchToSection(TLOFMacho.getCOFFSection(".section .drectve", true,
+                                             SectionKind::getMetadata()));
   
     for (StringSet<>::iterator i = DLLExportedGVs.begin(),
          e = DLLExportedGVs.end(); i != e; ++i)
       O << "\t.ascii \" -export:" << i->getKeyData() << ",data\"\n";
-  }
-  
-  if (!DLLExportedFns.empty()) {
-    SwitchToDataSection(".section .drectve");
   
     for (StringSet<>::iterator i = DLLExportedFns.begin(),
          e = DLLExportedFns.end();