} else {
GVStubs.insert(Name);
O << "L" << Name << "$non_lazy_ptr";
- if (TM.getRelocationModel() == Reloc::PIC)
- O << "-\"L" << getFunctionNumber() << "$pb\"";
}
} else {
O << Mang->getValueName(GV);
- }
- } else
+ }
+ if (!isCallOp && TM.getRelocationModel() == Reloc::PIC)
+ O << "-\"L" << getFunctionNumber() << "$pb\"";
+ } else
O << Mang->getValueName(MO.getGlobal());
int Offset = MO.getOffset();
if (Offset > 0)
(forDarwin && I->hasExternalLinkage() && !I->hasSection()))) {
if (Size == 0) Size = 1; // .comm Foo, 0 is undefined, avoid it.
if (I->hasExternalLinkage()) {
- O << "\t.global\t" << name << "\n";
+ O << "\t.globl\t" << name << "\n";
O << "\t.zerofill __DATA__, __common, " << name << ", "
<< Size << ", " << Align;
} else {
if (COMMDirectiveTakesAlignment)
O << "," << (AlignmentIsInBytes ? (1 << Align) : Align);
}
- O << "\t\t" << CommentString << " " << I->getName() << "\n";
}
+ O << "\t\t" << CommentString << " " << I->getName() << "\n";
} else {
switch (I->getLinkage()) {
case GlobalValue::LinkOnceLinkage:
}
break;
+ case X86ISD::TGAWrapper:
+ if (AM.GV == 0) {
+ AM.GV = cast<GlobalAddressSDNode>(N.getOperand(0))->getGlobal();
+ return false;
+ }
+ break;
+
case ISD::Constant:
AM.Disp += cast<ConstantSDNode>(N)->getValue();
return false;
// addl $8, %ecx
// use
// leal 8(%eax), %ecx.
+ // FIXME: If the other uses ended up being scheduled ahead of the leal
+ // then it would have been better to use the addl. The proper way to
+ // handle this is with using X86InstrInfo::convertToThreeAddress hook.
+ // From an email:
+ // BTW, this problem is the one that inspired the
+ // "X86InstrInfo::convertToThreeAddress" hook (which would handle this
+ // the "right" way). Unfortunately the X86 implementation of this is
+ // disabled, because we don't currently have enough information handy to
+ // know that the flags from the add is dead when the hook is called (from
+ // the register allocator).
if (AM.Base.Reg.Val->use_size() > 1)
Complexity++;
if (Complexity <= 1)
switch (Opcode) {
default: break;
+ case X86ISD::TGAWrapper: {
+ GlobalValue *GV = cast<GlobalAddressSDNode>(N.getOperand(0))->getGlobal();
+ SDOperand TGA = CurDAG->getTargetGlobalAddress(GV, MVT::i32);
+ Result = CodeGenMap[N] =
+ SDOperand(CurDAG->getTargetNode(X86::MOV32ri, MVT::i32, TGA), 0);
+ return;
+ }
case ISD::MULHU:
case ISD::MULHS: {
if (Opcode == ISD::MULHU)
SDOperand Result =
DAG.getTargetConstantPool(CP->get(), getPointerTy(), CP->getAlignment());
// Only lower ConstantPool on Darwin.
- if (getTargetMachine().
- getSubtarget<X86Subtarget>().isTargetDarwin()) {
+ if (getTargetMachine().getSubtarget<X86Subtarget>().isTargetDarwin()) {
// With PIC, the address is actually $g + Offset.
if (getTargetMachine().getRelocationModel() == Reloc::PIC)
Result = DAG.getNode(ISD::ADD, getPointerTy(),
if (getTargetMachine().
getSubtarget<X86Subtarget>().isTargetDarwin()) {
GlobalValue *GV = cast<GlobalAddressSDNode>(Op)->getGlobal();
- SDOperand Addr = DAG.getTargetGlobalAddress(GV, getPointerTy());
+ Result = DAG.getNode(X86ISD::TGAWrapper, getPointerTy(),
+ DAG.getTargetGlobalAddress(GV, getPointerTy()));
// With PIC, the address is actually $g + Offset.
if (getTargetMachine().getRelocationModel() == Reloc::PIC)
- Addr = DAG.getNode(ISD::ADD, getPointerTy(),
- DAG.getNode(X86ISD::GlobalBaseReg, getPointerTy()), Addr);
+ Result = DAG.getNode(ISD::ADD, getPointerTy(),
+ DAG.getNode(X86ISD::GlobalBaseReg, getPointerTy()), Result);
// For Darwin, external and weak symbols are indirect, so we want to load
// the value at address GV, not the value of GV itself. This means that
(GV->hasWeakLinkage() || GV->hasLinkOnceLinkage() ||
(GV->isExternal() && !GV->hasNotBeenReadFromBytecode())))
Result = DAG.getLoad(MVT::i32, DAG.getEntryNode(),
- Addr, DAG.getSrcValue(NULL));
+ Result, DAG.getSrcValue(NULL));
}
return Result;
case X86ISD::REP_MOVS: return "X86ISD::RET_MOVS";
case X86ISD::LOAD_PACK: return "X86ISD::LOAD_PACK";
case X86ISD::GlobalBaseReg: return "X86ISD::GlobalBaseReg";
+ case X86ISD::TGAWrapper: return "X86ISD::TGAWrapper";
}
}
/// GlobalBaseReg - On Darwin, this node represents the result of the popl
/// at function entry, used for PIC code.
GlobalBaseReg,
+
+ /// TGAWrapper - A wrapper node for TargetGlobalAddress, only used on
+ /// Darwin.
+ TGAWrapper,
};
// X86 specific condition code. These correspond to X86_*_COND in
def X86loadp : SDNode<"X86ISD::LOAD_PACK", SDTLoad,
[SDNPHasChain]>;
+def X86TGAWrapper : SDNode<"X86ISD::TGAWrapper", SDTIntUnaryOp>;
+
//===----------------------------------------------------------------------===//
// X86 Operand Definitions.
//
} else {
GVStubs.insert(Name);
O << "L" << Name << "$non_lazy_ptr";
- if (TM.getRelocationModel() == Reloc::PIC)
- O << "-\"L" << getFunctionNumber() << "$pb\"";
}
} else {
O << Mang->getValueName(GV);
}
+ if (!isCallOp && TM.getRelocationModel() == Reloc::PIC)
+ O << "-\"L" << getFunctionNumber() << "$pb\"";
} else
O << Mang->getValueName(MO.getGlobal());
int Offset = MO.getOffset();