mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-29 14:40:25 +00:00
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:
parent
3e944e38ea
commit
5bb779976a
@ -849,9 +849,11 @@ EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) {
|
||||
OS << MAI->getPrivateGlobalPrefix() << "_LSDA_" << getFunctionNumber();
|
||||
MCSym = OutContext.GetOrCreateSymbol(OS.str());
|
||||
} else if (ACPV->isBlockAddress()) {
|
||||
MCSym = GetBlockAddressSymbol(ACPV->getBlockAddress());
|
||||
const BlockAddress *BA =
|
||||
cast<ARMConstantPoolConstant>(ACPV)->getBlockAddress();
|
||||
MCSym = GetBlockAddressSymbol(BA);
|
||||
} else if (ACPV->isGlobalValue()) {
|
||||
const GlobalValue *GV = ACPV->getGV();
|
||||
const GlobalValue *GV = cast<ARMConstantPoolConstant>(ACPV)->getGV();
|
||||
MCSym = GetARMGVSymbol(GV);
|
||||
} else if (ACPV->isMachineBasicBlock()) {
|
||||
const MachineBasicBlock *MBB = ACPV->getMBB();
|
||||
|
@ -1054,17 +1054,19 @@ static unsigned duplicateCPV(MachineFunction &MF, unsigned &CPI) {
|
||||
// instructions, so that's probably OK, but is PIC always correct when
|
||||
// we get here?
|
||||
if (ACPV->isGlobalValue())
|
||||
NewCPV = new ARMConstantPoolValue(ACPV->getGV(), PCLabelId,
|
||||
ARMCP::CPValue, 4);
|
||||
NewCPV = ARMConstantPoolConstant::
|
||||
Create(cast<ARMConstantPoolConstant>(ACPV)->getGV(), PCLabelId,
|
||||
ARMCP::CPValue, 4);
|
||||
else if (ACPV->isExtSymbol())
|
||||
NewCPV = new ARMConstantPoolValue(MF.getFunction()->getContext(),
|
||||
ACPV->getSymbol(), PCLabelId, 4);
|
||||
else if (ACPV->isBlockAddress())
|
||||
NewCPV = new ARMConstantPoolValue(ACPV->getBlockAddress(), PCLabelId,
|
||||
ARMCP::CPBlockAddress, 4);
|
||||
NewCPV = ARMConstantPoolConstant::
|
||||
Create(cast<ARMConstantPoolConstant>(ACPV)->getBlockAddress(), PCLabelId,
|
||||
ARMCP::CPBlockAddress, 4);
|
||||
else if (ACPV->isLSDA())
|
||||
NewCPV = new ARMConstantPoolValue(MF.getFunction(), PCLabelId,
|
||||
ARMCP::CPLSDA, 4);
|
||||
NewCPV = ARMConstantPoolConstant::Create(MF.getFunction(), PCLabelId,
|
||||
ARMCP::CPLSDA, 4);
|
||||
else if (ACPV->isMachineBasicBlock())
|
||||
NewCPV = new ARMConstantPoolValue(MF.getFunction()->getContext(),
|
||||
ACPV->getMBB(), PCLabelId,
|
||||
|
@ -636,7 +636,7 @@ void ARMCodeEmitter::emitConstPoolInstruction(const MachineInstr &MI) {
|
||||
<< (void*)MCE.getCurrentPCValue() << " " << *ACPV << '\n');
|
||||
|
||||
assert(ACPV->isGlobalValue() && "unsupported constant pool value");
|
||||
const GlobalValue *GV = ACPV->getGV();
|
||||
const GlobalValue *GV = cast<ARMConstantPoolConstant>(ACPV)->getGV();
|
||||
if (GV) {
|
||||
Reloc::Model RelocM = TM.getRelocationModel();
|
||||
emitGlobalAddress(GV, ARM::reloc_arm_machine_cp_entry,
|
||||
|
@ -31,7 +31,7 @@ ARMConstantPoolValue::ARMConstantPoolValue(Type *Ty, unsigned id,
|
||||
unsigned char PCAdj,
|
||||
ARMCP::ARMCPModifier modifier,
|
||||
bool addCurrentAddress)
|
||||
: MachineConstantPoolValue(Ty), S(NULL), LabelId(id), Kind(kind),
|
||||
: MachineConstantPoolValue(Ty), MBB(NULL), S(NULL), LabelId(id), Kind(kind),
|
||||
PCAdjust(PCAdj), Modifier(modifier),
|
||||
AddCurrentAddress(addCurrentAddress) {}
|
||||
|
||||
@ -113,8 +113,7 @@ int ARMConstantPoolValue::getExistingMachineCPValue(MachineConstantPool *CP,
|
||||
(Constants[i].getAlignment() & AlignMask) == 0) {
|
||||
ARMConstantPoolValue *CPV =
|
||||
(ARMConstantPoolValue *)Constants[i].Val.MachineCPVal;
|
||||
if (CPV->CVal == CVal &&
|
||||
CPV->LabelId == LabelId &&
|
||||
if (CPV->LabelId == LabelId &&
|
||||
CPV->PCAdjust == PCAdjust &&
|
||||
CPV_streq(CPV->S, S) &&
|
||||
CPV->Modifier == Modifier)
|
||||
@ -131,7 +130,6 @@ ARMConstantPoolValue::~ARMConstantPoolValue() {
|
||||
|
||||
void
|
||||
ARMConstantPoolValue::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
|
||||
ID.AddPointer(CVal);
|
||||
ID.AddPointer(S);
|
||||
ID.AddInteger(LabelId);
|
||||
ID.AddInteger(PCAdjust);
|
||||
@ -140,7 +138,6 @@ ARMConstantPoolValue::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
|
||||
bool
|
||||
ARMConstantPoolValue::hasSameValue(ARMConstantPoolValue *ACPV) {
|
||||
if (ACPV->Kind == Kind &&
|
||||
ACPV->CVal == CVal &&
|
||||
ACPV->PCAdjust == PCAdjust &&
|
||||
CPV_streq(ACPV->S, S) &&
|
||||
ACPV->Modifier == Modifier) {
|
||||
|
@ -598,8 +598,9 @@ unsigned ARMFastISel::ARMMaterializeGV(const GlobalValue *GV, EVT VT) {
|
||||
// Grab index.
|
||||
unsigned PCAdj = (RelocM != Reloc::PIC_) ? 0 : (Subtarget->isThumb() ? 4 : 8);
|
||||
unsigned Id = AFI->createPICLabelUId();
|
||||
ARMConstantPoolValue *CPV = new ARMConstantPoolValue(GV, Id,
|
||||
ARMCP::CPValue, PCAdj);
|
||||
ARMConstantPoolValue *CPV = ARMConstantPoolConstant::Create(GV, Id,
|
||||
ARMCP::CPValue,
|
||||
PCAdj);
|
||||
unsigned Idx = MCP.getConstantPoolIndex(CPV, Align);
|
||||
|
||||
// Load value.
|
||||
|
@ -1410,9 +1410,9 @@ ARMTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||
const GlobalValue *GV = G->getGlobal();
|
||||
// Create a constant pool entry for the callee address
|
||||
unsigned ARMPCLabelIndex = AFI->createPICLabelUId();
|
||||
ARMConstantPoolValue *CPV = new ARMConstantPoolValue(GV,
|
||||
ARMPCLabelIndex,
|
||||
ARMCP::CPValue, 0);
|
||||
ARMConstantPoolValue *CPV =
|
||||
ARMConstantPoolConstant::Create(GV, ARMPCLabelIndex, ARMCP::CPValue, 0);
|
||||
|
||||
// Get the address of the callee into a register
|
||||
SDValue CPAddr = DAG.getTargetConstantPool(CPV, getPointerTy(), 4);
|
||||
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.
|
||||
if (isARMFunc && Subtarget->isThumb1Only() && !Subtarget->hasV5TOps()) {
|
||||
unsigned ARMPCLabelIndex = AFI->createPICLabelUId();
|
||||
ARMConstantPoolValue *CPV = new ARMConstantPoolValue(GV,
|
||||
ARMPCLabelIndex,
|
||||
ARMCP::CPValue, 4);
|
||||
ARMConstantPoolValue *CPV =
|
||||
ARMConstantPoolConstant::Create(GV, ARMPCLabelIndex, ARMCP::CPValue, 4);
|
||||
SDValue CPAddr = DAG.getTargetConstantPool(CPV, getPointerTy(), 4);
|
||||
CPAddr = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, CPAddr);
|
||||
Callee = DAG.getLoad(getPointerTy(), dl,
|
||||
@ -1946,9 +1945,9 @@ SDValue ARMTargetLowering::LowerBlockAddress(SDValue Op,
|
||||
} else {
|
||||
unsigned PCAdj = Subtarget->isThumb() ? 4 : 8;
|
||||
ARMPCLabelIndex = AFI->createPICLabelUId();
|
||||
ARMConstantPoolValue *CPV = new ARMConstantPoolValue(BA, ARMPCLabelIndex,
|
||||
ARMCP::CPBlockAddress,
|
||||
PCAdj);
|
||||
ARMConstantPoolValue *CPV =
|
||||
ARMConstantPoolConstant::Create(BA, ARMPCLabelIndex,
|
||||
ARMCP::CPBlockAddress, PCAdj);
|
||||
CPAddr = DAG.getTargetConstantPool(CPV, PtrVT, 4);
|
||||
}
|
||||
CPAddr = DAG.getNode(ARMISD::Wrapper, DL, PtrVT, CPAddr);
|
||||
@ -1972,8 +1971,8 @@ ARMTargetLowering::LowerToTLSGeneralDynamicModel(GlobalAddressSDNode *GA,
|
||||
ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||
unsigned ARMPCLabelIndex = AFI->createPICLabelUId();
|
||||
ARMConstantPoolValue *CPV =
|
||||
new ARMConstantPoolValue(GA->getGlobal(), ARMPCLabelIndex,
|
||||
ARMCP::CPValue, PCAdj, ARMCP::TLSGD, true);
|
||||
ARMConstantPoolConstant::Create(GA->getGlobal(), ARMPCLabelIndex,
|
||||
ARMCP::CPValue, PCAdj, ARMCP::TLSGD, true);
|
||||
SDValue Argument = DAG.getTargetConstantPool(CPV, PtrVT, 4);
|
||||
Argument = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, Argument);
|
||||
Argument = DAG.getLoad(PtrVT, dl, DAG.getEntryNode(), Argument,
|
||||
@ -2019,8 +2018,9 @@ ARMTargetLowering::LowerToTLSExecModels(GlobalAddressSDNode *GA,
|
||||
// Initial exec model.
|
||||
unsigned char PCAdj = Subtarget->isThumb() ? 4 : 8;
|
||||
ARMConstantPoolValue *CPV =
|
||||
new ARMConstantPoolValue(GA->getGlobal(), ARMPCLabelIndex,
|
||||
ARMCP::CPValue, PCAdj, ARMCP::GOTTPOFF, true);
|
||||
ARMConstantPoolConstant::Create(GA->getGlobal(), ARMPCLabelIndex,
|
||||
ARMCP::CPValue, PCAdj, ARMCP::GOTTPOFF,
|
||||
true);
|
||||
Offset = DAG.getTargetConstantPool(CPV, PtrVT, 4);
|
||||
Offset = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, Offset);
|
||||
Offset = DAG.getLoad(PtrVT, dl, Chain, Offset,
|
||||
@ -2036,7 +2036,8 @@ ARMTargetLowering::LowerToTLSExecModels(GlobalAddressSDNode *GA,
|
||||
false, false, 0);
|
||||
} else {
|
||||
// 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.getNode(ARMISD::Wrapper, dl, MVT::i32, Offset);
|
||||
Offset = DAG.getLoad(PtrVT, dl, Chain, Offset,
|
||||
@ -2072,7 +2073,8 @@ SDValue ARMTargetLowering::LowerGlobalAddressELF(SDValue Op,
|
||||
if (RelocM == Reloc::PIC_) {
|
||||
bool UseGOTOFF = GV->hasLocalLinkage() || GV->hasHiddenVisibility();
|
||||
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);
|
||||
CPAddr = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, CPAddr);
|
||||
SDValue Result = DAG.getLoad(PtrVT, dl, DAG.getEntryNode(),
|
||||
@ -2141,7 +2143,8 @@ SDValue ARMTargetLowering::LowerGlobalAddressDarwin(SDValue Op,
|
||||
ARMPCLabelIndex = AFI->createPICLabelUId();
|
||||
unsigned PCAdj = (RelocM != Reloc::PIC_) ? 0 : (Subtarget->isThumb()?4:8);
|
||||
ARMConstantPoolValue *CPV =
|
||||
new ARMConstantPoolValue(GV, ARMPCLabelIndex, ARMCP::CPValue, PCAdj);
|
||||
ARMConstantPoolConstant::Create(GV, ARMPCLabelIndex, ARMCP::CPValue,
|
||||
PCAdj);
|
||||
CPAddr = DAG.getTargetConstantPool(CPV, PtrVT, 4);
|
||||
}
|
||||
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_)
|
||||
? 0 : (Subtarget->isThumb() ? 4 : 8);
|
||||
ARMConstantPoolValue *CPV =
|
||||
new ARMConstantPoolValue(MF.getFunction(), ARMPCLabelIndex,
|
||||
ARMCP::CPLSDA, PCAdj);
|
||||
ARMConstantPoolConstant::Create(MF.getFunction(), ARMPCLabelIndex,
|
||||
ARMCP::CPLSDA, PCAdj);
|
||||
CPAddr = DAG.getTargetConstantPool(CPV, PtrVT, 4);
|
||||
CPAddr = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, CPAddr);
|
||||
SDValue Result =
|
||||
|
Loading…
Reference in New Issue
Block a user