From 70532b9f008b5aa88d15470d7b46070304a1dc11 Mon Sep 17 00:00:00 2001 From: Nate Begeman Date: Fri, 8 Jul 2005 00:23:26 +0000 Subject: [PATCH] Add support for assembling .s files on mac os x for intel Add support for running bugpoint on mac os x for intel llvm-svn: 22351 --- lib/Support/ToolRunner.cpp | 2 +- lib/Target/PowerPC/PowerPCAsmPrinter.cpp | 1 - lib/Target/X86/X86ATTAsmPrinter.cpp | 37 +++++++++++++++ lib/Target/X86/X86AsmPrinter.cpp | 59 +++++++++++++++++++++--- lib/Target/X86/X86AsmPrinter.h | 5 ++ 5 files changed, 96 insertions(+), 8 deletions(-) diff --git a/lib/Support/ToolRunner.cpp b/lib/Support/ToolRunner.cpp index 4a08e1adc76..3cea3386dbb 100644 --- a/lib/Support/ToolRunner.cpp +++ b/lib/Support/ToolRunner.cpp @@ -441,7 +441,7 @@ int GCC::MakeSharedObject(const std::string &InputFile, FileType fileType, InputFile.c_str(), // Specify the input filename... #if defined(sparc) || defined(__sparc__) || defined(__sparcv9) "-G", // Compile a shared library, `-G' for Sparc -#elif (defined(__POWERPC__) || defined(__ppc__)) && defined(__APPLE__) +#elif defined(__APPLE__) "-single_module", // link all source files into a single module "-dynamiclib", // `-dynamiclib' for MacOS X/PowerPC "-undefined", // in data segment, rather than generating diff --git a/lib/Target/PowerPC/PowerPCAsmPrinter.cpp b/lib/Target/PowerPC/PowerPCAsmPrinter.cpp index 80a59d751b6..d9a818b6bd0 100644 --- a/lib/Target/PowerPC/PowerPCAsmPrinter.cpp +++ b/lib/Target/PowerPC/PowerPCAsmPrinter.cpp @@ -44,7 +44,6 @@ namespace { struct PowerPCAsmPrinter : public AsmPrinter { std::set FnStubs, GVStubs, LinkOnceStubs; - std::set Strings; PowerPCAsmPrinter(std::ostream &O, TargetMachine &TM) : AsmPrinter(O, TM), LabelNumber(0) {} diff --git a/lib/Target/X86/X86ATTAsmPrinter.cpp b/lib/Target/X86/X86ATTAsmPrinter.cpp index a7e6729141d..05dff4094f2 100755 --- a/lib/Target/X86/X86ATTAsmPrinter.cpp +++ b/lib/Target/X86/X86ATTAsmPrinter.cpp @@ -86,6 +86,37 @@ void X86ATTAsmPrinter::printOp(const MachineOperand &MO, bool isCallOp) { abort (); return; case MachineOperand::MO_GlobalAddress: { + // Darwin block shameless ripped from PowerPCAsmPrinter.cpp + if (forDarwin) { + if (!isCallOp) O << '$'; + GlobalValue *GV = MO.getGlobal(); + std::string Name = Mang->getValueName(GV); + + // Dynamically-resolved functions need a stub for the function. Be + // wary however not to output $stub for external functions whose addresses + // are taken. Those should be emitted as $non_lazy_ptr below. + Function *F = dyn_cast(GV); + if (F && isCallOp && F->isExternal()) { + FnStubs.insert(Name); + O << "L" << Name << "$stub"; + return; + } + + // Link-once, External, or Weakly-linked global variables need + // non-lazily-resolved stubs + if (GV->hasLinkOnceLinkage()) { + LinkOnceStubs.insert(Name); + O << "L" << Name << "$non_lazy_ptr"; + return; + } + if (GV->isExternal() || GV->hasWeakLinkage()) { + GVStubs.insert(Name); + O << "L" << Name << "$non_lazy_ptr"; + return; + } + O << Mang->getValueName(GV); + return; + } if (!isCallOp) O << '$'; O << Mang->getValueName(MO.getGlobal()); int Offset = MO.getOffset(); @@ -96,6 +127,12 @@ void X86ATTAsmPrinter::printOp(const MachineOperand &MO, bool isCallOp) { return; } case MachineOperand::MO_ExternalSymbol: + if (isCallOp && forDarwin) { + std::string Name(GlobalPrefix); Name += MO.getSymbolName(); + FnStubs.insert(Name); + O << "L" << Name << "$stub"; + return; + } if (!isCallOp) O << '$'; O << GlobalPrefix << MO.getSymbolName(); return; diff --git a/lib/Target/X86/X86AsmPrinter.cpp b/lib/Target/X86/X86AsmPrinter.cpp index 332dda0daea..072eca383c5 100644 --- a/lib/Target/X86/X86AsmPrinter.cpp +++ b/lib/Target/X86/X86AsmPrinter.cpp @@ -50,7 +50,7 @@ bool X86SharedAsmPrinter::doInitialization(Module& M) { } else if (TT.empty()) { #if defined(__CYGWIN__) || defined(__MINGW32__) forCygwin = true; - #elif defined(__MACOSX__) + #elif defined(__APPLE__) forDarwin = true; #elif defined(_WIN32) leadingUnderscore = true; @@ -79,7 +79,10 @@ void X86SharedAsmPrinter::printConstantPool(MachineConstantPool *MCP) { if (CP.empty()) return; for (unsigned i = 0, e = CP.size(); i != e; ++i) { - O << "\t.section .rodata\n"; + if (forDarwin) + O << "\t.data\n"; + else + O << "\t.section .rodata\n"; emitAlignment(TD.getTypeAlignmentShift(CP[i]->getType())); O << ".CPI" << CurrentFnName << "_" << i << ":\t\t\t\t\t" << CommentString << *CP[i] << "\n"; @@ -104,10 +107,13 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) { (I->hasLinkOnceLinkage() || I->hasInternalLinkage() || I->hasWeakLinkage() /* FIXME: Verify correct */)) { SwitchSection(O, CurSection, ".data"); - if (!forCygwin && I->hasInternalLinkage()) - O << "\t.local " << name << "\n"; - O << "\t.comm " << name << "," << TD.getTypeSize(C->getType()); - if (!forCygwin) + if (!forCygwin && !forDarwin && I->hasInternalLinkage()) + O << "\t.local " << name << "\n"; + if (forDarwin && I->hasInternalLinkage()) + O << "\t.lcomm " << name << "," << Size << "," << Align; + else + O << "\t.comm " << name << "," << Size; + if (!forCygwin && !forDarwin) O << "," << (1 << Align); O << "\t\t# "; WriteAsOperand(O, I, true, true, &M); @@ -152,6 +158,47 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) { emitGlobalConstant(C); } } + + if (forDarwin) { + // Output stubs for dynamically-linked functions + unsigned j = 1; + for (std::set::iterator i = FnStubs.begin(), e = FnStubs.end(); + i != e; ++i, ++j) + { + O << "\t.symbol_stub\n"; + O << "L" << *i << "$stub:\n"; + O << "\t.indirect_symbol " << *i << "\n"; + O << "\tjmp\t*L" << j << "$lz\n"; + O << "L" << *i << "$stub_binder:\n"; + O << "\tpushl\t$L" << j << "$lz\n"; + O << "\tjmp\tdyld_stub_binding_helper\n"; + O << "\t.section __DATA, __la_sym_ptr3,lazy_symbol_pointers\n"; + O << "L" << j << "$lz:\n"; + O << "\t.indirect_symbol " << *i << "\n"; + O << "\t.long\tL" << *i << "$stub_binder\n"; + } + + O << "\n"; + + // Output stubs for external global variables + if (GVStubs.begin() != GVStubs.end()) + O << ".data\n.non_lazy_symbol_pointer\n"; + for (std::set::iterator i = GVStubs.begin(), e = GVStubs.end(); + i != e; ++i) { + O << "L" << *i << "$non_lazy_ptr:\n"; + O << "\t.indirect_symbol " << *i << "\n"; + O << "\t.long\t0\n"; + } + + // Output stubs for link-once variables + if (LinkOnceStubs.begin() != LinkOnceStubs.end()) + O << ".data\n.align 2\n"; + for (std::set::iterator i = LinkOnceStubs.begin(), + e = LinkOnceStubs.end(); i != e; ++i) { + O << "L" << *i << "$non_lazy_ptr:\n" + << "\t.long\t" << *i << '\n'; + } + } AsmPrinter::doFinalization(M); return false; // success diff --git a/lib/Target/X86/X86AsmPrinter.h b/lib/Target/X86/X86AsmPrinter.h index 3b05ed96f92..4f53de8fb58 100755 --- a/lib/Target/X86/X86AsmPrinter.h +++ b/lib/Target/X86/X86AsmPrinter.h @@ -19,6 +19,8 @@ #include "X86.h" #include "llvm/CodeGen/AsmPrinter.h" #include "llvm/ADT/Statistic.h" +#include + namespace llvm { namespace x86 { @@ -36,6 +38,9 @@ struct X86SharedAsmPrinter : public AsmPrinter { bool forCygwin; bool forDarwin; + // Necessary for Darwin to print out the apprioriate types of linker stubs + std::set FnStubs, GVStubs, LinkOnceStubs; + inline static bool isScale(const MachineOperand &MO) { return MO.isImmediate() && (MO.getImmedValue() == 1 || MO.getImmedValue() == 2 ||