Switch over to using ARMConstantPoolConstant for global variables, functions,

and block addresses.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@140936 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Bill Wendling 2011-10-01 08:00:54 +00:00
parent 3e944e38ea
commit 5bb779976a
6 changed files with 39 additions and 34 deletions

View File

@ -849,9 +849,11 @@ EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) {
OS << MAI->getPrivateGlobalPrefix() << "_LSDA_" << getFunctionNumber(); OS << MAI->getPrivateGlobalPrefix() << "_LSDA_" << getFunctionNumber();
MCSym = OutContext.GetOrCreateSymbol(OS.str()); MCSym = OutContext.GetOrCreateSymbol(OS.str());
} else if (ACPV->isBlockAddress()) { } else if (ACPV->isBlockAddress()) {
MCSym = GetBlockAddressSymbol(ACPV->getBlockAddress()); const BlockAddress *BA =
cast<ARMConstantPoolConstant>(ACPV)->getBlockAddress();
MCSym = GetBlockAddressSymbol(BA);
} else if (ACPV->isGlobalValue()) { } else if (ACPV->isGlobalValue()) {
const GlobalValue *GV = ACPV->getGV(); const GlobalValue *GV = cast<ARMConstantPoolConstant>(ACPV)->getGV();
MCSym = GetARMGVSymbol(GV); MCSym = GetARMGVSymbol(GV);
} else if (ACPV->isMachineBasicBlock()) { } else if (ACPV->isMachineBasicBlock()) {
const MachineBasicBlock *MBB = ACPV->getMBB(); const MachineBasicBlock *MBB = ACPV->getMBB();

View File

@ -1054,17 +1054,19 @@ static unsigned duplicateCPV(MachineFunction &MF, unsigned &CPI) {
// instructions, so that's probably OK, but is PIC always correct when // instructions, so that's probably OK, but is PIC always correct when
// we get here? // we get here?
if (ACPV->isGlobalValue()) if (ACPV->isGlobalValue())
NewCPV = new ARMConstantPoolValue(ACPV->getGV(), PCLabelId, NewCPV = ARMConstantPoolConstant::
ARMCP::CPValue, 4); Create(cast<ARMConstantPoolConstant>(ACPV)->getGV(), PCLabelId,
ARMCP::CPValue, 4);
else if (ACPV->isExtSymbol()) else if (ACPV->isExtSymbol())
NewCPV = new ARMConstantPoolValue(MF.getFunction()->getContext(), NewCPV = new ARMConstantPoolValue(MF.getFunction()->getContext(),
ACPV->getSymbol(), PCLabelId, 4); ACPV->getSymbol(), PCLabelId, 4);
else if (ACPV->isBlockAddress()) else if (ACPV->isBlockAddress())
NewCPV = new ARMConstantPoolValue(ACPV->getBlockAddress(), PCLabelId, NewCPV = ARMConstantPoolConstant::
ARMCP::CPBlockAddress, 4); Create(cast<ARMConstantPoolConstant>(ACPV)->getBlockAddress(), PCLabelId,
ARMCP::CPBlockAddress, 4);
else if (ACPV->isLSDA()) else if (ACPV->isLSDA())
NewCPV = new ARMConstantPoolValue(MF.getFunction(), PCLabelId, NewCPV = ARMConstantPoolConstant::Create(MF.getFunction(), PCLabelId,
ARMCP::CPLSDA, 4); ARMCP::CPLSDA, 4);
else if (ACPV->isMachineBasicBlock()) else if (ACPV->isMachineBasicBlock())
NewCPV = new ARMConstantPoolValue(MF.getFunction()->getContext(), NewCPV = new ARMConstantPoolValue(MF.getFunction()->getContext(),
ACPV->getMBB(), PCLabelId, ACPV->getMBB(), PCLabelId,

View File

@ -636,7 +636,7 @@ void ARMCodeEmitter::emitConstPoolInstruction(const MachineInstr &MI) {
<< (void*)MCE.getCurrentPCValue() << " " << *ACPV << '\n'); << (void*)MCE.getCurrentPCValue() << " " << *ACPV << '\n');
assert(ACPV->isGlobalValue() && "unsupported constant pool value"); assert(ACPV->isGlobalValue() && "unsupported constant pool value");
const GlobalValue *GV = ACPV->getGV(); const GlobalValue *GV = cast<ARMConstantPoolConstant>(ACPV)->getGV();
if (GV) { if (GV) {
Reloc::Model RelocM = TM.getRelocationModel(); Reloc::Model RelocM = TM.getRelocationModel();
emitGlobalAddress(GV, ARM::reloc_arm_machine_cp_entry, emitGlobalAddress(GV, ARM::reloc_arm_machine_cp_entry,

View File

@ -31,7 +31,7 @@ ARMConstantPoolValue::ARMConstantPoolValue(Type *Ty, unsigned id,
unsigned char PCAdj, unsigned char PCAdj,
ARMCP::ARMCPModifier modifier, ARMCP::ARMCPModifier modifier,
bool addCurrentAddress) bool addCurrentAddress)
: MachineConstantPoolValue(Ty), S(NULL), LabelId(id), Kind(kind), : MachineConstantPoolValue(Ty), MBB(NULL), S(NULL), LabelId(id), Kind(kind),
PCAdjust(PCAdj), Modifier(modifier), PCAdjust(PCAdj), Modifier(modifier),
AddCurrentAddress(addCurrentAddress) {} AddCurrentAddress(addCurrentAddress) {}
@ -113,8 +113,7 @@ int ARMConstantPoolValue::getExistingMachineCPValue(MachineConstantPool *CP,
(Constants[i].getAlignment() & AlignMask) == 0) { (Constants[i].getAlignment() & AlignMask) == 0) {
ARMConstantPoolValue *CPV = ARMConstantPoolValue *CPV =
(ARMConstantPoolValue *)Constants[i].Val.MachineCPVal; (ARMConstantPoolValue *)Constants[i].Val.MachineCPVal;
if (CPV->CVal == CVal && if (CPV->LabelId == LabelId &&
CPV->LabelId == LabelId &&
CPV->PCAdjust == PCAdjust && CPV->PCAdjust == PCAdjust &&
CPV_streq(CPV->S, S) && CPV_streq(CPV->S, S) &&
CPV->Modifier == Modifier) CPV->Modifier == Modifier)
@ -131,7 +130,6 @@ ARMConstantPoolValue::~ARMConstantPoolValue() {
void void
ARMConstantPoolValue::addSelectionDAGCSEId(FoldingSetNodeID &ID) { ARMConstantPoolValue::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
ID.AddPointer(CVal);
ID.AddPointer(S); ID.AddPointer(S);
ID.AddInteger(LabelId); ID.AddInteger(LabelId);
ID.AddInteger(PCAdjust); ID.AddInteger(PCAdjust);
@ -140,7 +138,6 @@ ARMConstantPoolValue::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
bool bool
ARMConstantPoolValue::hasSameValue(ARMConstantPoolValue *ACPV) { ARMConstantPoolValue::hasSameValue(ARMConstantPoolValue *ACPV) {
if (ACPV->Kind == Kind && if (ACPV->Kind == Kind &&
ACPV->CVal == CVal &&
ACPV->PCAdjust == PCAdjust && ACPV->PCAdjust == PCAdjust &&
CPV_streq(ACPV->S, S) && CPV_streq(ACPV->S, S) &&
ACPV->Modifier == Modifier) { ACPV->Modifier == Modifier) {

View File

@ -598,8 +598,9 @@ unsigned ARMFastISel::ARMMaterializeGV(const GlobalValue *GV, EVT VT) {
// Grab index. // Grab index.
unsigned PCAdj = (RelocM != Reloc::PIC_) ? 0 : (Subtarget->isThumb() ? 4 : 8); unsigned PCAdj = (RelocM != Reloc::PIC_) ? 0 : (Subtarget->isThumb() ? 4 : 8);
unsigned Id = AFI->createPICLabelUId(); unsigned Id = AFI->createPICLabelUId();
ARMConstantPoolValue *CPV = new ARMConstantPoolValue(GV, Id, ARMConstantPoolValue *CPV = ARMConstantPoolConstant::Create(GV, Id,
ARMCP::CPValue, PCAdj); ARMCP::CPValue,
PCAdj);
unsigned Idx = MCP.getConstantPoolIndex(CPV, Align); unsigned Idx = MCP.getConstantPoolIndex(CPV, Align);
// Load value. // Load value.

View File

@ -1410,9 +1410,9 @@ ARMTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
const GlobalValue *GV = G->getGlobal(); const GlobalValue *GV = G->getGlobal();
// Create a constant pool entry for the callee address // Create a constant pool entry for the callee address
unsigned ARMPCLabelIndex = AFI->createPICLabelUId(); unsigned ARMPCLabelIndex = AFI->createPICLabelUId();
ARMConstantPoolValue *CPV = new ARMConstantPoolValue(GV, ARMConstantPoolValue *CPV =
ARMPCLabelIndex, ARMConstantPoolConstant::Create(GV, ARMPCLabelIndex, ARMCP::CPValue, 0);
ARMCP::CPValue, 0);
// Get the address of the callee into a register // Get the address of the callee into a register
SDValue CPAddr = DAG.getTargetConstantPool(CPV, getPointerTy(), 4); SDValue CPAddr = DAG.getTargetConstantPool(CPV, getPointerTy(), 4);
CPAddr = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, CPAddr); CPAddr = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, CPAddr);
@ -1447,9 +1447,8 @@ ARMTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
// tBX takes a register source operand. // tBX takes a register source operand.
if (isARMFunc && Subtarget->isThumb1Only() && !Subtarget->hasV5TOps()) { if (isARMFunc && Subtarget->isThumb1Only() && !Subtarget->hasV5TOps()) {
unsigned ARMPCLabelIndex = AFI->createPICLabelUId(); unsigned ARMPCLabelIndex = AFI->createPICLabelUId();
ARMConstantPoolValue *CPV = new ARMConstantPoolValue(GV, ARMConstantPoolValue *CPV =
ARMPCLabelIndex, ARMConstantPoolConstant::Create(GV, ARMPCLabelIndex, ARMCP::CPValue, 4);
ARMCP::CPValue, 4);
SDValue CPAddr = DAG.getTargetConstantPool(CPV, getPointerTy(), 4); SDValue CPAddr = DAG.getTargetConstantPool(CPV, getPointerTy(), 4);
CPAddr = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, CPAddr); CPAddr = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, CPAddr);
Callee = DAG.getLoad(getPointerTy(), dl, Callee = DAG.getLoad(getPointerTy(), dl,
@ -1946,9 +1945,9 @@ SDValue ARMTargetLowering::LowerBlockAddress(SDValue Op,
} else { } else {
unsigned PCAdj = Subtarget->isThumb() ? 4 : 8; unsigned PCAdj = Subtarget->isThumb() ? 4 : 8;
ARMPCLabelIndex = AFI->createPICLabelUId(); ARMPCLabelIndex = AFI->createPICLabelUId();
ARMConstantPoolValue *CPV = new ARMConstantPoolValue(BA, ARMPCLabelIndex, ARMConstantPoolValue *CPV =
ARMCP::CPBlockAddress, ARMConstantPoolConstant::Create(BA, ARMPCLabelIndex,
PCAdj); ARMCP::CPBlockAddress, PCAdj);
CPAddr = DAG.getTargetConstantPool(CPV, PtrVT, 4); CPAddr = DAG.getTargetConstantPool(CPV, PtrVT, 4);
} }
CPAddr = DAG.getNode(ARMISD::Wrapper, DL, PtrVT, CPAddr); CPAddr = DAG.getNode(ARMISD::Wrapper, DL, PtrVT, CPAddr);
@ -1972,8 +1971,8 @@ ARMTargetLowering::LowerToTLSGeneralDynamicModel(GlobalAddressSDNode *GA,
ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>(); ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
unsigned ARMPCLabelIndex = AFI->createPICLabelUId(); unsigned ARMPCLabelIndex = AFI->createPICLabelUId();
ARMConstantPoolValue *CPV = ARMConstantPoolValue *CPV =
new ARMConstantPoolValue(GA->getGlobal(), ARMPCLabelIndex, ARMConstantPoolConstant::Create(GA->getGlobal(), ARMPCLabelIndex,
ARMCP::CPValue, PCAdj, ARMCP::TLSGD, true); ARMCP::CPValue, PCAdj, ARMCP::TLSGD, true);
SDValue Argument = DAG.getTargetConstantPool(CPV, PtrVT, 4); SDValue Argument = DAG.getTargetConstantPool(CPV, PtrVT, 4);
Argument = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, Argument); Argument = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, Argument);
Argument = DAG.getLoad(PtrVT, dl, DAG.getEntryNode(), Argument, Argument = DAG.getLoad(PtrVT, dl, DAG.getEntryNode(), Argument,
@ -2019,8 +2018,9 @@ ARMTargetLowering::LowerToTLSExecModels(GlobalAddressSDNode *GA,
// Initial exec model. // Initial exec model.
unsigned char PCAdj = Subtarget->isThumb() ? 4 : 8; unsigned char PCAdj = Subtarget->isThumb() ? 4 : 8;
ARMConstantPoolValue *CPV = ARMConstantPoolValue *CPV =
new ARMConstantPoolValue(GA->getGlobal(), ARMPCLabelIndex, ARMConstantPoolConstant::Create(GA->getGlobal(), ARMPCLabelIndex,
ARMCP::CPValue, PCAdj, ARMCP::GOTTPOFF, true); ARMCP::CPValue, PCAdj, ARMCP::GOTTPOFF,
true);
Offset = DAG.getTargetConstantPool(CPV, PtrVT, 4); Offset = DAG.getTargetConstantPool(CPV, PtrVT, 4);
Offset = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, Offset); Offset = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, Offset);
Offset = DAG.getLoad(PtrVT, dl, Chain, Offset, Offset = DAG.getLoad(PtrVT, dl, Chain, Offset,
@ -2036,7 +2036,8 @@ ARMTargetLowering::LowerToTLSExecModels(GlobalAddressSDNode *GA,
false, false, 0); false, false, 0);
} else { } else {
// local exec model // local exec model
ARMConstantPoolValue *CPV = new ARMConstantPoolValue(GV, ARMCP::TPOFF); ARMConstantPoolValue *CPV =
ARMConstantPoolConstant::Create(GV, ARMCP::TPOFF);
Offset = DAG.getTargetConstantPool(CPV, PtrVT, 4); Offset = DAG.getTargetConstantPool(CPV, PtrVT, 4);
Offset = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, Offset); Offset = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, Offset);
Offset = DAG.getLoad(PtrVT, dl, Chain, Offset, Offset = DAG.getLoad(PtrVT, dl, Chain, Offset,
@ -2072,7 +2073,8 @@ SDValue ARMTargetLowering::LowerGlobalAddressELF(SDValue Op,
if (RelocM == Reloc::PIC_) { if (RelocM == Reloc::PIC_) {
bool UseGOTOFF = GV->hasLocalLinkage() || GV->hasHiddenVisibility(); bool UseGOTOFF = GV->hasLocalLinkage() || GV->hasHiddenVisibility();
ARMConstantPoolValue *CPV = ARMConstantPoolValue *CPV =
new ARMConstantPoolValue(GV, UseGOTOFF ? ARMCP::GOTOFF : ARMCP::GOT); ARMConstantPoolConstant::Create(GV,
UseGOTOFF ? ARMCP::GOTOFF : ARMCP::GOT);
SDValue CPAddr = DAG.getTargetConstantPool(CPV, PtrVT, 4); SDValue CPAddr = DAG.getTargetConstantPool(CPV, PtrVT, 4);
CPAddr = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, CPAddr); CPAddr = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, CPAddr);
SDValue Result = DAG.getLoad(PtrVT, dl, DAG.getEntryNode(), SDValue Result = DAG.getLoad(PtrVT, dl, DAG.getEntryNode(),
@ -2141,7 +2143,8 @@ SDValue ARMTargetLowering::LowerGlobalAddressDarwin(SDValue Op,
ARMPCLabelIndex = AFI->createPICLabelUId(); ARMPCLabelIndex = AFI->createPICLabelUId();
unsigned PCAdj = (RelocM != Reloc::PIC_) ? 0 : (Subtarget->isThumb()?4:8); unsigned PCAdj = (RelocM != Reloc::PIC_) ? 0 : (Subtarget->isThumb()?4:8);
ARMConstantPoolValue *CPV = ARMConstantPoolValue *CPV =
new ARMConstantPoolValue(GV, ARMPCLabelIndex, ARMCP::CPValue, PCAdj); ARMConstantPoolConstant::Create(GV, ARMPCLabelIndex, ARMCP::CPValue,
PCAdj);
CPAddr = DAG.getTargetConstantPool(CPV, PtrVT, 4); CPAddr = DAG.getTargetConstantPool(CPV, PtrVT, 4);
} }
CPAddr = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, CPAddr); CPAddr = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, CPAddr);
@ -2230,8 +2233,8 @@ ARMTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG,
unsigned PCAdj = (RelocM != Reloc::PIC_) unsigned PCAdj = (RelocM != Reloc::PIC_)
? 0 : (Subtarget->isThumb() ? 4 : 8); ? 0 : (Subtarget->isThumb() ? 4 : 8);
ARMConstantPoolValue *CPV = ARMConstantPoolValue *CPV =
new ARMConstantPoolValue(MF.getFunction(), ARMPCLabelIndex, ARMConstantPoolConstant::Create(MF.getFunction(), ARMPCLabelIndex,
ARMCP::CPLSDA, PCAdj); ARMCP::CPLSDA, PCAdj);
CPAddr = DAG.getTargetConstantPool(CPV, PtrVT, 4); CPAddr = DAG.getTargetConstantPool(CPV, PtrVT, 4);
CPAddr = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, CPAddr); CPAddr = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, CPAddr);
SDValue Result = SDValue Result =