aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/llvm/CodeGen/AsmPrinter.h5
-rw-r--r--lib/CodeGen/AsmPrinter.cpp52
-rwxr-xr-xlib/Target/X86/X86IntelAsmPrinter.cpp28
-rwxr-xr-xlib/Target/X86/X86IntelAsmPrinter.h1
4 files changed, 46 insertions, 40 deletions
diff --git a/include/llvm/CodeGen/AsmPrinter.h b/include/llvm/CodeGen/AsmPrinter.h
index 8a13873..a40185b 100644
--- a/include/llvm/CodeGen/AsmPrinter.h
+++ b/include/llvm/CodeGen/AsmPrinter.h
@@ -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
diff --git a/lib/CodeGen/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter.cpp
index aad0232..1753160 100644
--- a/lib/CodeGen/AsmPrinter.cpp
+++ b/lib/CodeGen/AsmPrinter.cpp
@@ -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';
+ }
}
}
diff --git a/lib/Target/X86/X86IntelAsmPrinter.cpp b/lib/Target/X86/X86IntelAsmPrinter.cpp
index 900f67e..747d576 100755
--- a/lib/Target/X86/X86IntelAsmPrinter.cpp
+++ b/lib/Target/X86/X86IntelAsmPrinter.cpp
@@ -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) {
diff --git a/lib/Target/X86/X86IntelAsmPrinter.h b/lib/Target/X86/X86IntelAsmPrinter.h
index 34a7110..b408ea3 100755
--- a/lib/Target/X86/X86IntelAsmPrinter.h
+++ b/lib/Target/X86/X86IntelAsmPrinter.h
@@ -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;
};