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);
}
// 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;
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,
// 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()) {
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,
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
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(),
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);
// 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);
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
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.
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".