aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Target/X86/X86AsmPrinter.cpp48
1 files changed, 37 insertions, 11 deletions
diff --git a/lib/Target/X86/X86AsmPrinter.cpp b/lib/Target/X86/X86AsmPrinter.cpp
index b0d27888fc..ce6d26e7d0 100644
--- a/lib/Target/X86/X86AsmPrinter.cpp
+++ b/lib/Target/X86/X86AsmPrinter.cpp
@@ -43,10 +43,12 @@ namespace {
struct X86SharedAsmPrinter : public AsmPrinter {
X86SharedAsmPrinter(std::ostream &O, TargetMachine &TM)
- : AsmPrinter(O, TM) { }
+ : AsmPrinter(O, TM), forCygwin(false) { }
+ bool doInitialization(Module &M);
void printConstantPool(MachineConstantPool *MCP);
bool doFinalization(Module &M);
+ bool forCygwin;
};
}
@@ -77,6 +79,24 @@ static void SwitchSection(std::ostream &OS, std::string &CurSection,
}
}
+/// doInitialization - determine
+bool X86SharedAsmPrinter::doInitialization(Module& M) {
+ forCygwin = false;
+ const std::string& TT = M.getTargetTriple();
+ if (TT.length() > 5)
+ forCygwin = TT.find("cygwin") != std::string::npos;
+ else if (TT.empty()) {
+#ifdef __CYGWIN__
+ forCygwin = true;
+#else
+ forCygwin = false;
+#endif
+ }
+ if (forCygwin)
+ GlobalPrefix = "_";
+ return AsmPrinter::doInitialization(M);
+}
+
/// printConstantPool - Print to the current output stream assembly
/// representations of the constants in the constant pool MCP. This is
/// used to print out constants which have been "spilled to memory" by
@@ -114,11 +134,12 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) {
(I->hasLinkOnceLinkage() || I->hasInternalLinkage() ||
I->hasWeakLinkage() /* FIXME: Verify correct */)) {
SwitchSection(O, CurSection, ".data");
- if (I->hasInternalLinkage())
+ if (!forCygwin && I->hasInternalLinkage())
O << "\t.local " << name << "\n";
- O << "\t.comm " << name << "," << TD.getTypeSize(C->getType())
- << "," << (1 << Align);
+ O << "\t.comm " << name << "," << TD.getTypeSize(C->getType());
+ if (!forCygwin)
+ O << "," << (1 << Align);
O << "\t\t# ";
WriteAsOperand(O, I, true, true, &M);
O << "\n";
@@ -150,8 +171,10 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) {
}
emitAlignment(Align);
- O << "\t.type " << name << ",@object\n";
- O << "\t.size " << name << "," << Size << "\n";
+ if (!forCygwin) {
+ O << "\t.type " << name << ",@object\n";
+ O << "\t.size " << name << "," << Size << "\n";
+ }
O << name << ":\t\t\t\t# ";
WriteAsOperand(O, I, true, true, &M);
O << " = ";
@@ -239,7 +262,8 @@ bool X86IntelAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
O << "\t.text\n";
emitAlignment(4);
O << "\t.globl\t" << CurrentFnName << "\n";
- O << "\t.type\t" << CurrentFnName << ", @function\n";
+ if (!forCygwin)
+ O << "\t.type\t" << CurrentFnName << ", @function\n";
O << CurrentFnName << ":\n";
// Print out code for the function.
@@ -306,7 +330,7 @@ void X86IntelAsmPrinter::printOp(const MachineOperand &MO,
return;
}
case MachineOperand::MO_ExternalSymbol:
- O << MO.getSymbolName();
+ O << GlobalPrefix << MO.getSymbolName();
return;
default:
O << "<unknown operand type>"; return;
@@ -462,7 +486,8 @@ bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
O << "\t.text\n";
emitAlignment(4);
O << "\t.globl\t" << CurrentFnName << "\n";
- O << "\t.type\t" << CurrentFnName << ", @function\n";
+ if (!forCygwin)
+ O << "\t.type\t" << CurrentFnName << ", @function\n";
O << CurrentFnName << ":\n";
// Print out code for the function.
@@ -523,7 +548,7 @@ void X86ATTAsmPrinter::printOp(const MachineOperand &MO, bool isCallOp) {
}
case MachineOperand::MO_ExternalSymbol:
if (!isCallOp) O << '$';
- O << MO.getSymbolName();
+ O << GlobalPrefix << MO.getSymbolName();
return;
default:
O << "<unknown operand type>"; return;
@@ -600,7 +625,8 @@ void X86ATTAsmPrinter::printMachineInstruction(const MachineInstr *MI) {
///
FunctionPass *llvm::createX86CodePrinterPass(std::ostream &o,TargetMachine &tm){
switch (AsmWriterFlavor) {
- default: assert(0 && "Unknown asm flavor!");
+ default:
+ assert(0 && "Unknown asm flavor!");
case intel:
return new X86IntelAsmPrinter(o, tm);
case att: