1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 19:23:23 +01:00

make isel decide whether to emit $stub's on darwin instead of asmprinter.

llvm-svn: 75107
This commit is contained in:
Chris Lattner 2009-07-09 05:27:35 +00:00
parent e144356fba
commit f42a8c82d9
3 changed files with 48 additions and 48 deletions

View File

@ -309,41 +309,25 @@ void X86ATTAsmPrinter::print_pcrel_imm(const MachineInstr *MI, unsigned OpNo) {
needCloseParen = true;
}
if (Subtarget->isPICStyleStub()) {
// DARWIN/X86-32 in != static mode.
// Link-once, declaration, or Weakly-linked global variables need
// non-lazily-resolved stubs
if (GV->isDeclaration() || GV->isWeakForLinker()) {
// Dynamically-resolved functions need a stub for the function.
assert(isa<Function>(GV));
// Function stubs are no longer needed for Mac OS X 10.5 and up.
if (Subtarget->isTargetDarwin() && Subtarget->getDarwinVers() >= 9) {
O << Name;
} else {
FnStubs.insert(Name);
printSuffixedName(Name, "$stub");
}
assert(MO.getTargetFlags() == 0);
} else {
O << Name;
}
// Handle dllimport linkage.
if (MO.getTargetFlags() == X86II::MO_DLLIMPORT)
O << "__imp_";
if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB) {
FnStubs.insert(Name);
printSuffixedName(Name, "$stub");
} else {
// Handle dllimport linkage.
if (MO.getTargetFlags() == X86II::MO_DLLIMPORT)
O << "__imp_";
O << Name;
// Assemble call via PLT for externally visible symbols.
if (MO.getTargetFlags() == X86II::MO_PLT)
O << "@PLT";
if (Subtarget->isTargetCygMing() && GV->isDeclaration())
// Save function name for later type emission
CygMingStubs.insert(Name);
}
// Assemble call via PLT for externally visible symbols.
if (MO.getTargetFlags() == X86II::MO_PLT)
O << "@PLT";
if (Subtarget->isTargetCygMing() && GV->isDeclaration())
// Save function name for later type emission
CygMingStubs.insert(Name);
printOffset(MO.getOffset());
if (needCloseParen)
@ -355,15 +339,7 @@ void X86ATTAsmPrinter::print_pcrel_imm(const MachineInstr *MI, unsigned OpNo) {
bool needCloseParen = false;
std::string Name(TAI->getGlobalPrefix());
Name += MO.getSymbolName();
// Print function stub suffix unless it's Mac OS X 10.5 and up.
if (Subtarget->isPICStyleStub() &&
// DARWIN/X86-32 in != static mode.
Subtarget->getDarwinVers() < 9) {
FnStubs.insert(Name);
printSuffixedName(Name, "$stub");
return;
}
if (Name[0] == '$') {
// The name begins with a dollar-sign. In order to avoid having it look
// like an integer immediate to the assembler, enclose it in parens.
@ -371,7 +347,12 @@ void X86ATTAsmPrinter::print_pcrel_imm(const MachineInstr *MI, unsigned OpNo) {
needCloseParen = true;
}
O << Name;
if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB) {
FnStubs.insert(Name);
printSuffixedName(Name, "$stub");
} else {
O << Name;
}
if (MO.getTargetFlags() == X86II::MO_GOT_ABSOLUTE_ADDRESS) {
O << " + [.-";

View File

@ -1900,8 +1900,8 @@ SDValue X86TargetLowering::LowerCALL(SDValue Op, SelectionDAG &DAG) {
if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) {
// We should use extra load for direct calls to dllimported functions in
// non-JIT mode.
if (!Subtarget->GVRequiresExtraLoad(G->getGlobal(),
getTargetMachine(), true)) {
GlobalValue *GV = G->getGlobal();
if (!Subtarget->GVRequiresExtraLoad(GV, getTargetMachine(), true)) {
unsigned char OpFlags = 0;
// On ELF targets, in both X86-64 and X86-32 mode, direct calls to
@ -1910,11 +1910,18 @@ SDValue X86TargetLowering::LowerCALL(SDValue Op, SelectionDAG &DAG) {
// we don't need to use the PLT - we can directly call it.
if (Subtarget->isTargetELF() &&
getTargetMachine().getRelocationModel() == Reloc::PIC_ &&
G->getGlobal()->hasDefaultVisibility() &&
!G->getGlobal()->hasLocalLinkage())
GV->hasDefaultVisibility() && !GV->hasLocalLinkage()) {
OpFlags = X86II::MO_PLT;
} else if (Subtarget->isPICStyleStub() &&
(GV->isDeclaration() || GV->isWeakForLinker()) &&
Subtarget->getDarwinVers() < 9) {
// PC-relative references to external symbols should go through $stub,
// unless we're building with the leopard linker or later, which
// automatically synthesizes these stubs.
OpFlags = X86II::MO_DARWIN_STUB;
}
Callee = DAG.getTargetGlobalAddress(G->getGlobal(), getPointerTy(),
Callee = DAG.getTargetGlobalAddress(GV, getPointerTy(),
G->getOffset(), OpFlags);
}
} else if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(Callee)) {
@ -1923,9 +1930,16 @@ SDValue X86TargetLowering::LowerCALL(SDValue Op, SelectionDAG &DAG) {
// On ELF targets, in either X86-64 or X86-32 mode, direct calls to external
// symbols should go through the PLT.
if (Subtarget->isTargetELF() &&
getTargetMachine().getRelocationModel() == Reloc::PIC_)
getTargetMachine().getRelocationModel() == Reloc::PIC_) {
OpFlags = X86II::MO_PLT;
} else if (Subtarget->isPICStyleStub() &&
Subtarget->getDarwinVers() < 9) {
// PC-relative references to external symbols should go through $stub,
// unless we're building with the leopard linker or later, which
// automatically synthesizes these stubs.
OpFlags = X86II::MO_DARWIN_STUB;
}
Callee = DAG.getTargetExternalSymbol(S->getSymbol(), getPointerTy(),
OpFlags);
} else if (IsTailCall) {

View File

@ -154,6 +154,11 @@ namespace X86II {
/// dllimport linkage on windows.
MO_DLLIMPORT = 12,
/// MO_DARWIN_STUB - On a symbol operand "FOO", this indicates that the
/// reference is actually to the "FOO$stub" symbol. This is used for calls
/// and jumps to external functions on Tiger and before.
MO_DARWIN_STUB = 13,
//===------------------------------------------------------------------===//
// Instruction encodings. These are the standard/most common forms for X86