[llvm-commits] CVS: llvm/lib/CodeGen/AsmPrinter.cpp

Jeff Cohen jeffc at jolt-lang.org
Mon May 1 20:58:59 PDT 2006



Changes in directory llvm/lib/CodeGen:

AsmPrinter.cpp updated: 1.62 -> 1.63
---
Log message:

De-virtualize SwitchSection.

---
Diffs of the changes:  (+42 -10)

 AsmPrinter.cpp |   52 ++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 42 insertions(+), 10 deletions(-)


Index: llvm/lib/CodeGen/AsmPrinter.cpp
diff -u llvm/lib/CodeGen/AsmPrinter.cpp:1.62 llvm/lib/CodeGen/AsmPrinter.cpp:1.63
--- llvm/lib/CodeGen/AsmPrinter.cpp:1.62	Mon May  1 22:46:13 2006
+++ llvm/lib/CodeGen/AsmPrinter.cpp	Mon May  1 22:58:45 2006
@@ -47,6 +47,7 @@
   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\", at progbits"),
@@ -63,16 +64,47 @@
 ///
 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';
+    }
   }
 }
 






More information about the llvm-commits mailing list