diff options
-rw-r--r-- | include/llvm/CodeGen/AsmPrinter.h | 4 | ||||
-rwxr-xr-x | lib/Target/X86/X86IntelAsmPrinter.cpp | 51 | ||||
-rwxr-xr-x | lib/Target/X86/X86IntelAsmPrinter.h | 2 |
3 files changed, 53 insertions, 4 deletions
diff --git a/include/llvm/CodeGen/AsmPrinter.h b/include/llvm/CodeGen/AsmPrinter.h index 93c2f2b114..739c1a3ff0 100644 --- a/include/llvm/CodeGen/AsmPrinter.h +++ b/include/llvm/CodeGen/AsmPrinter.h @@ -26,10 +26,12 @@ 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 @@ -185,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. /// - void SwitchSection(const char *NewSection, const GlobalValue *GV); + virtual 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/Target/X86/X86IntelAsmPrinter.cpp b/lib/Target/X86/X86IntelAsmPrinter.cpp index 18295f566c..112f496ead 100755 --- a/lib/Target/X86/X86IntelAsmPrinter.cpp +++ b/lib/Target/X86/X86IntelAsmPrinter.cpp @@ -36,8 +36,6 @@ X86IntelAsmPrinter::X86IntelAsmPrinter(std::ostream &O, X86TargetMachine &TM) Data32bitsDirective = "\t.dd\t"; Data64bitsDirective = "\t.dq\t"; HasDotTypeDotSizeDirective = false; - - O << "\t.686\n\t.model flat\n\toption dotname\n"; } /// runOnMachineFunction - This uses the printMachineInstruction() @@ -57,7 +55,7 @@ bool X86IntelAsmPrinter::runOnMachineFunction(MachineFunction &MF) { EmitConstantPool(MF.getConstantPool()); // Print out labels for the function. - SwitchSection(".code\n", MF.getFunction()); + SwitchSection(".code", MF.getFunction()); EmitAlignment(4); if (MF.getFunction()->getLinkage() == GlobalValue::ExternalLinkage) O << "\tpublic " << CurrentFnName << "\n"; @@ -424,9 +422,56 @@ void X86IntelAsmPrinter::printMachineInstruction(const MachineInstr *MI) { bool X86IntelAsmPrinter::doInitialization(Module &M) { X86SharedAsmPrinter::doInitialization(M); Mang->markCharUnacceptable('.'); + PrivateGlobalPrefix = "$"; // need this here too :( + O << "\t.686\n\t.model flat\n\n"; + + // Emit declarations for external functions. + for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) + if (I->isExternal()) + O << "\textern " << Mang->getValueName(I) << ":near\n"; + + // Emit declarations for external globals. + for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); + I != E; ++I) { + if (I->isExternal()) + O << "\textern " << Mang->getValueName(I) << ":byte\n"; + } + + return false; +} + +bool X86IntelAsmPrinter::doFinalization(Module &M) { + X86SharedAsmPrinter::doFinalization(M); + if (CurrentSection != "") + O << CurrentSection << "\tends\n"; + 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::EmitZeros(uint64_t NumZeros) const { if (NumZeros) { O << "\tdb " << NumZeros << " dup(0)\n"; diff --git a/lib/Target/X86/X86IntelAsmPrinter.h b/lib/Target/X86/X86IntelAsmPrinter.h index c6ad898d1d..7c81923ed6 100755 --- a/lib/Target/X86/X86IntelAsmPrinter.h +++ b/lib/Target/X86/X86IntelAsmPrinter.h @@ -90,7 +90,9 @@ struct X86IntelAsmPrinter : public X86SharedAsmPrinter { void printPICLabel(const MachineInstr *MI, unsigned Op); bool runOnMachineFunction(MachineFunction &F); bool doInitialization(Module &M); + bool doFinalization(Module &M); + virtual void SwitchSection(const char *NewSection, const GlobalValue *GV); virtual void EmitZeros(uint64_t NumZeros) const; virtual void EmitString(const ConstantArray *CVA) const; }; |