From e2f524f176df37bca2dea1ade78e0c303ed3c766 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 10 Jul 2009 20:47:30 +0000 Subject: [PATCH] add a couple of predicates to test for "stub style pic in PIC mode" and "stub style pic in dynamic-no-pic" mode. llvm-svn: 75273 --- .../X86/AsmPrinter/X86ATTAsmPrinter.cpp | 15 ++++------ llvm/lib/Target/X86/X86FastISel.cpp | 8 ++--- llvm/lib/Target/X86/X86ISelLowering.cpp | 30 ++++++++----------- llvm/lib/Target/X86/X86Subtarget.cpp | 13 +++++++- llvm/lib/Target/X86/X86Subtarget.h | 8 +++-- 5 files changed, 40 insertions(+), 34 deletions(-) diff --git a/llvm/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp b/llvm/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp index afde3a847f25..33aef4005dc1 100644 --- a/llvm/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp +++ b/llvm/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp @@ -603,15 +603,12 @@ void X86ATTAsmPrinter::printPICJumpTableEntry(const MachineJumpTableInfo *MJTI, O << JTEntryDirective << ' '; - if (TM.getRelocationModel() == Reloc::PIC_) { - if (Subtarget->isPICStyleRIPRel() || Subtarget->isPICStyleStub()) { - O << TAI->getPrivateGlobalPrefix() << getFunctionNumber() - << '_' << uid << "_set_" << MBB->getNumber(); - } else if (Subtarget->isPICStyleGOT()) { - printBasicBlockLabel(MBB, false, false, false); - O << "@GOTOFF"; - } else - assert(0 && "Don't know how to print MBB label for this PIC mode"); + if (Subtarget->isPICStyleRIPRel() || Subtarget->isPICStyleStubPIC(TM)) { + O << TAI->getPrivateGlobalPrefix() << getFunctionNumber() + << '_' << uid << "_set_" << MBB->getNumber(); + } else if (Subtarget->isPICStyleGOT()) { + printBasicBlockLabel(MBB, false, false, false); + O << "@GOTOFF"; } else printBasicBlockLabel(MBB, false, false, false); } diff --git a/llvm/lib/Target/X86/X86FastISel.cpp b/llvm/lib/Target/X86/X86FastISel.cpp index 4b0ff7b114f3..2864cd062866 100644 --- a/llvm/lib/Target/X86/X86FastISel.cpp +++ b/llvm/lib/Target/X86/X86FastISel.cpp @@ -578,8 +578,7 @@ bool X86FastISel::X86SelectCallAddress(Value *V, X86AddressMode &AM) { // base and index registers are unused. assert(AM.Base.Reg == 0 && AM.IndexReg == 0); AM.Base.Reg = X86::RIP; - } else if (Subtarget->isPICStyleStub() && - TM.getRelocationModel() == Reloc::PIC_) { + } else if (Subtarget->isPICStyleStubPIC(TM)) { AM.GVOpFlags = X86II::MO_PIC_BASE_OFFSET; } else if (Subtarget->isPICStyleGOT()) { AM.GVOpFlags = X86II::MO_GOTOFF; @@ -1413,7 +1412,7 @@ bool X86FastISel::X86SelectCall(Instruction *I) { TM.getRelocationModel() == Reloc::PIC_ && GV->hasDefaultVisibility() && !GV->hasLocalLinkage()) { OpFlags = X86II::MO_PLT; - } else if (Subtarget->isPICStyleStub() && + } else if (Subtarget->isPICStyleStubAny() && (GV->isDeclaration() || GV->isWeakForLinker()) && Subtarget->getDarwinVers() < 9) { // PC-relative references to external symbols should go through $stub, @@ -1621,8 +1620,7 @@ unsigned X86FastISel::TargetMaterializeConstant(Constant *C) { // x86-32 PIC requires a PIC base register for constant pools. unsigned PICBase = 0; unsigned char OpFlag = 0; - if (Subtarget->isPICStyleStub() && - TM.getRelocationModel() == Reloc::PIC_) { // Not dynamic-no-pic + if (Subtarget->isPICStyleStubPIC(TM)) { // Not dynamic-no-pic OpFlag = X86II::MO_PIC_BASE_OFFSET; PICBase = getInstrInfo()->getGlobalBaseReg(&MF); } else if (Subtarget->isPICStyleGOT()) { diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 11a759669556..af4d405bce36 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -1913,7 +1913,7 @@ SDValue X86TargetLowering::LowerCALL(SDValue Op, SelectionDAG &DAG) { getTargetMachine().getRelocationModel() == Reloc::PIC_ && GV->hasDefaultVisibility() && !GV->hasLocalLinkage()) { OpFlags = X86II::MO_PLT; - } else if (Subtarget->isPICStyleStub() && + } else if (Subtarget->isPICStyleStubAny() && (GV->isDeclaration() || GV->isWeakForLinker()) && Subtarget->getDarwinVers() < 9) { // PC-relative references to external symbols should go through $stub, @@ -1933,7 +1933,7 @@ SDValue X86TargetLowering::LowerCALL(SDValue Op, SelectionDAG &DAG) { if (Subtarget->isTargetELF() && getTargetMachine().getRelocationModel() == Reloc::PIC_) { OpFlags = X86II::MO_PLT; - } else if (Subtarget->isPICStyleStub() && + } else if (Subtarget->isPICStyleStubAny() && Subtarget->getDarwinVers() < 9) { // PC-relative references to external symbols should go through $stub, // unless we're building with the leopard linker or later, which @@ -4454,14 +4454,12 @@ X86TargetLowering::LowerConstantPool(SDValue Op, SelectionDAG &DAG) { unsigned WrapperKind = X86ISD::Wrapper; if (Subtarget->is64Bit() && - getTargetMachine().getCodeModel() == CodeModel::Small) { + getTargetMachine().getCodeModel() == CodeModel::Small) WrapperKind = X86ISD::WrapperRIP; - } else if (Subtarget->isPICStyleGOT()) { + else if (Subtarget->isPICStyleGOT()) OpFlag = X86II::MO_GOTOFF; - } else if (Subtarget->isPICStyleStub() && - getTargetMachine().getRelocationModel() == Reloc::PIC_) { + else if (Subtarget->isPICStyleStubPIC(getTargetMachine())) OpFlag = X86II::MO_PIC_BASE_OFFSET; - } SDValue Result = DAG.getTargetConstantPool(CP->getConstVal(), getPointerTy(), CP->getAlignment(), @@ -4487,14 +4485,13 @@ SDValue X86TargetLowering::LowerJumpTable(SDValue Op, SelectionDAG &DAG) { unsigned char OpFlag = 0; unsigned WrapperKind = X86ISD::Wrapper; - if (Subtarget->is64Bit()) { + if (Subtarget->is64Bit() && + getTargetMachine().getCodeModel() == CodeModel::Small) WrapperKind = X86ISD::WrapperRIP; - } else if (Subtarget->isPICStyleGOT()) { + else if (Subtarget->isPICStyleGOT()) OpFlag = X86II::MO_GOTOFF; - } else if (Subtarget->isPICStyleStub() && - getTargetMachine().getRelocationModel() == Reloc::PIC_) { + else if (Subtarget->isPICStyleStubPIC(getTargetMachine())) OpFlag = X86II::MO_PIC_BASE_OFFSET; - } SDValue Result = DAG.getTargetJumpTable(JT->getIndex(), getPointerTy(), OpFlag); @@ -4520,14 +4517,13 @@ X86TargetLowering::LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) { // global base reg. unsigned char OpFlag = 0; unsigned WrapperKind = X86ISD::Wrapper; - if (Subtarget->is64Bit()) { + if (Subtarget->is64Bit() && + getTargetMachine().getCodeModel() == CodeModel::Small) WrapperKind = X86ISD::WrapperRIP; - } else if (Subtarget->isPICStyleGOT()) { + else if (Subtarget->isPICStyleGOT()) OpFlag = X86II::MO_GOTOFF; - } else if (Subtarget->isPICStyleStub() && - getTargetMachine().getRelocationModel() == Reloc::PIC_) { + else if (Subtarget->isPICStyleStubPIC(getTargetMachine())) OpFlag = X86II::MO_PIC_BASE_OFFSET; - } SDValue Result = DAG.getTargetExternalSymbol(Sym, getPointerTy(), OpFlag); diff --git a/llvm/lib/Target/X86/X86Subtarget.cpp b/llvm/lib/Target/X86/X86Subtarget.cpp index 6665c67bafc7..c68b29b00bb9 100644 --- a/llvm/lib/Target/X86/X86Subtarget.cpp +++ b/llvm/lib/Target/X86/X86Subtarget.cpp @@ -34,6 +34,17 @@ AsmWriterFlavor("x86-asm-syntax", cl::init(X86Subtarget::Unset), clEnumValN(X86Subtarget::Intel, "intel", "Emit Intel-style assembly"), clEnumValEnd)); +bool X86Subtarget::isPICStyleStubPIC(const TargetMachine &TM) const { + return PICStyle == PICStyles::Stub && + TM.getRelocationModel() == Reloc::PIC_; +} + +bool X86Subtarget::isPICStyleStubNoDynamic(const TargetMachine &TM) const { + return PICStyle == PICStyles::Stub && + TM.getRelocationModel() == Reloc::DynamicNoPIC; +} + + /// ClassifyGlobalReference - Classify a global variable reference for the /// current subtarget according to how we should reference it in a non-pcrel @@ -76,7 +87,7 @@ ClassifyGlobalReference(const GlobalValue *GV, const TargetMachine &TM) const { return X86II::MO_GOT; } - if (isPICStyleStub()) { + if (isPICStyleStubAny()) { // In Darwin/32, we have multiple different stub types, and we have both PIC // and -mdynamic-no-pic. Determine whether we have a stub reference // and/or whether the reference is relative to the PIC base or not. diff --git a/llvm/lib/Target/X86/X86Subtarget.h b/llvm/lib/Target/X86/X86Subtarget.h index e789a56b2a09..6509f04e33a2 100644 --- a/llvm/lib/Target/X86/X86Subtarget.h +++ b/llvm/lib/Target/X86/X86Subtarget.h @@ -184,10 +184,14 @@ public: bool isPICStyleSet() const { return PICStyle != PICStyles::None; } bool isPICStyleGOT() const { return PICStyle == PICStyles::GOT; } - bool isPICStyleStub() const { return PICStyle == PICStyles::Stub; } bool isPICStyleRIPRel() const { return PICStyle == PICStyles::RIPRel; } + + bool isPICStyleStubPIC(const TargetMachine &TM) const; + bool isPICStyleStubNoDynamic(const TargetMachine &TM) const; + bool isPICStyleStubAny() const { return PICStyle == PICStyles::Stub; } - /// getDarwinVers - Return the darwin version number, 8 = tiger, 9 = leopard. + /// getDarwinVers - Return the darwin version number, 8 = Tiger, 9 = Leopard, + /// 10 = Snow Leopard, etc. unsigned getDarwinVers() const { return DarwinVers; } /// isLinux - Return true if the target is "Linux".