De-virtualize SwitchSection.
authorJeff Cohen <jeffc@jolt-lang.org>
Tue, 2 May 2006 03:58:45 +0000 (03:58 +0000)
committerJeff Cohen <jeffc@jolt-lang.org>
Tue, 2 May 2006 03:58:45 +0000 (03:58 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28047 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/AsmPrinter.h
lib/CodeGen/AsmPrinter.cpp
lib/Target/X86/X86IntelAsmPrinter.cpp
lib/Target/X86/X86IntelAsmPrinter.h

index 8a13873bc2a984d3f8e5ec78f23a325250a0b157..a40185b2d7b26924e53ab4341d91a88b4007f592 100644 (file)
@@ -26,12 +26,10 @@ namespace llvm {
   class GlobalVariable;
 
   class AsmPrinter : public MachineFunctionPass {
-  protected:
     /// CurrentSection - The current section we are emitting to.  This is
     /// controlled and used by the SwitchSection method.
     std::string CurrentSection;
     
-  private:
     /// FunctionNumber - This provides a unique ID for each function emitted in
     /// this translation unit.  It is autoincremented by SetupMachineFunction,
     /// and can be accessed with getFunctionNumber() and 
@@ -139,6 +137,7 @@ namespace llvm {
     /// emit a global to an arbitrary section.  The section name is emited after
     /// this.
     const char *SwitchToSectionDirective;  // Defaults to "\t.section\t"
+    bool MLSections;  // True if Microsoft ML assembler is targetted
     
     /// ConstantPoolSection - This is the section that we SwitchToSection right
     /// before emitting the constant pool for a function.
@@ -188,7 +187,7 @@ namespace llvm {
     /// If the new section is an empty string, this method forgets what the
     /// current section is, but does not emit a .section directive.
     ///
-    virtual void SwitchSection(const char *NewSection, const GlobalValue *GV);
+    void SwitchSection(const char *NewSection, const GlobalValue *GV);
 
     /// getPreferredAlignmentLog - Return the preferred alignment of the
     /// specified global, returned in log form.  This includes an explicitly
index aad02327c64cedd62b7705dc716770400f3bfaa2..1753160e1f0020b45af7fcb169742d3fc78e29bf 100644 (file)
@@ -47,6 +47,7 @@ AsmPrinter::AsmPrinter(std::ostream &o, TargetMachine &tm)
   AlignDirective("\t.align\t"),
   AlignmentIsInBytes(true),
   SwitchToSectionDirective("\t.section\t"),
+  MLSections(false),
   ConstantPoolSection("\t.section .rodata\n"),
   JumpTableSection("\t.section .rodata\n"),
   StaticCtorsSection("\t.section .ctors,\"aw\",@progbits"),
@@ -63,16 +64,47 @@ AsmPrinter::AsmPrinter(std::ostream &o, TargetMachine &tm)
 ///
 void AsmPrinter::SwitchSection(const char *NewSection, const GlobalValue *GV) {
   std::string NS;
-  
-  if (GV && GV->hasSection())
-    NS = SwitchToSectionDirective + GV->getSection();
-  else
-    NS = std::string("\t")+NewSection;
-  
-  if (CurrentSection != NS) {
-    CurrentSection = NS;
-    if (!CurrentSection.empty())
-      O << CurrentSection << '\n';
+
+  // Microsoft ML/MASM has a fundamentally different approach to handling
+  // sections.
+
+  if (MLSections) {
+    if (*NewSection == 0) {
+      // Simply end the current section, if any.
+      if (CurrentSection != "") {
+        O << CurrentSection << "\tends\n";
+        CurrentSection = "";
+      }
+      return;
+    }
+
+    bool isData = strcmp(NewSection , ".data") == 0;
+
+    if (GV && GV->hasSection())
+      NS = GV->getSection();
+    else if (isData)
+      NS = "_data";
+    else
+      NS = "_text";
+
+    if (CurrentSection != NS) {
+      if (CurrentSection != "")
+        O << CurrentSection << "\tends\n";
+      CurrentSection = NS;
+      O << CurrentSection << (isData ? "\tsegment 'DATA'\n"
+                                     : "\tsegment 'CODE'\n");
+    }
+  } else {
+    if (GV && GV->hasSection())
+      NS = SwitchToSectionDirective + GV->getSection();
+    else
+      NS = std::string("\t")+NewSection;
+    
+    if (CurrentSection != NS) {
+      CurrentSection = NS;
+      if (!CurrentSection.empty())
+        O << CurrentSection << '\n';
+    }
   }
 }
 
index 900f67e9b8edb75ed2934ced6eea3fd902eea76a..747d576695df444f610c5a637ea4c0ad3928735e 100755 (executable)
@@ -28,6 +28,7 @@ X86IntelAsmPrinter::X86IntelAsmPrinter(std::ostream &O, X86TargetMachine &TM)
   GlobalPrefix = "_";
   PrivateGlobalPrefix = "$";
   AlignDirective = "\talign\t";
+  MLSections = true;
   ZeroDirective = "\tdb\t";
   ZeroDirectiveSuffix = " dup(0)";
   AsciiDirective = "\tdb\t";
@@ -443,36 +444,11 @@ bool X86IntelAsmPrinter::doInitialization(Module &M) {
 
 bool X86IntelAsmPrinter::doFinalization(Module &M) {
   X86SharedAsmPrinter::doFinalization(M);
-  if (CurrentSection != "")
-    O << CurrentSection << "\tends\n";
+  SwitchSection("", 0);
   O << "\tend\n";
   return false;
 }
 
-void X86IntelAsmPrinter::SwitchSection(const char *NewSection,
-                                       const GlobalValue *GV) {
-  if (*NewSection == 0)
-    return;
-  
-  std::string NS;
-  bool isData = strcmp(NewSection , ".data") == 0;
-
-  if (GV && GV->hasSection())
-    NS = GV->getSection();
-  else if (isData)
-    NS = "_data";
-  else
-    NS = "_text";
-
-  if (CurrentSection != NS) {
-    if (CurrentSection != "")
-      O << CurrentSection << "\tends\n";
-    CurrentSection = NS;
-    O << CurrentSection << (isData ? "\tsegment 'DATA'\n"
-                                   : "\tsegment 'CODE'\n");
-  }
-}
-
 void X86IntelAsmPrinter::EmitString(const ConstantArray *CVA) const {
   unsigned NumElts = CVA->getNumOperands();
   if (NumElts) {
index 34a7110d5875580da113fc3d6bbd3e6617e83e3c..b408ea3903b5718067f7e995830736842e9a1111 100755 (executable)
@@ -92,7 +92,6 @@ struct X86IntelAsmPrinter : public X86SharedAsmPrinter {
   bool doInitialization(Module &M);
   bool doFinalization(Module &M);
 
-  virtual void SwitchSection(const char *NewSection, const GlobalValue *GV);
   virtual void EmitString(const ConstantArray *CVA) const;
 };