mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-21 03:29:40 +00:00
Remove ARMPCLabelIndex from ARMISelLowering. Use ARMFunctionInfo::createConstPoolEntryUId() instead.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@86294 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
82ebca15a8
commit
e7e0d62efd
@ -133,7 +133,7 @@ static TargetLoweringObjectFile *createTLOF(TargetMachine &TM) {
|
||||
}
|
||||
|
||||
ARMTargetLowering::ARMTargetLowering(TargetMachine &TM)
|
||||
: TargetLowering(TM, createTLOF(TM)), ARMPCLabelIndex(0) {
|
||||
: TargetLowering(TM, createTLOF(TM)) {
|
||||
Subtarget = &TM.getSubtarget<ARMSubtarget>();
|
||||
|
||||
if (Subtarget->isTargetDarwin()) {
|
||||
@ -1004,6 +1004,8 @@ ARMTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||
bool isDirect = false;
|
||||
bool isARMFunc = false;
|
||||
bool isLocalARMFunc = false;
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||
if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) {
|
||||
GlobalValue *GV = G->getGlobal();
|
||||
isDirect = true;
|
||||
@ -1015,6 +1017,7 @@ ARMTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||
isLocalARMFunc = !Subtarget->isThumb() && !isExt;
|
||||
// tBX takes a register source operand.
|
||||
if (isARMFunc && Subtarget->isThumb1Only() && !Subtarget->hasV5TOps()) {
|
||||
unsigned ARMPCLabelIndex = AFI->createConstPoolEntryUId();
|
||||
ARMConstantPoolValue *CPV = new ARMConstantPoolValue(GV,
|
||||
ARMPCLabelIndex,
|
||||
ARMCP::CPValue, 4);
|
||||
@ -1023,7 +1026,7 @@ ARMTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||
Callee = DAG.getLoad(getPointerTy(), dl,
|
||||
DAG.getEntryNode(), CPAddr,
|
||||
PseudoSourceValue::getConstantPool(), 0);
|
||||
SDValue PICLabel = DAG.getConstant(ARMPCLabelIndex++, MVT::i32);
|
||||
SDValue PICLabel = DAG.getConstant(ARMPCLabelIndex, MVT::i32);
|
||||
Callee = DAG.getNode(ARMISD::PIC_ADD, dl,
|
||||
getPointerTy(), Callee, PICLabel);
|
||||
} else
|
||||
@ -1036,6 +1039,7 @@ ARMTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||
// tBX takes a register source operand.
|
||||
const char *Sym = S->getSymbol();
|
||||
if (isARMFunc && Subtarget->isThumb1Only() && !Subtarget->hasV5TOps()) {
|
||||
unsigned ARMPCLabelIndex = AFI->createConstPoolEntryUId();
|
||||
ARMConstantPoolValue *CPV = new ARMConstantPoolValue(*DAG.getContext(),
|
||||
Sym, ARMPCLabelIndex, 4);
|
||||
SDValue CPAddr = DAG.getTargetConstantPool(CPV, getPointerTy(), 4);
|
||||
@ -1043,7 +1047,7 @@ ARMTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||
Callee = DAG.getLoad(getPointerTy(), dl,
|
||||
DAG.getEntryNode(), CPAddr,
|
||||
PseudoSourceValue::getConstantPool(), 0);
|
||||
SDValue PICLabel = DAG.getConstant(ARMPCLabelIndex++, MVT::i32);
|
||||
SDValue PICLabel = DAG.getConstant(ARMPCLabelIndex, MVT::i32);
|
||||
Callee = DAG.getNode(ARMISD::PIC_ADD, dl,
|
||||
getPointerTy(), Callee, PICLabel);
|
||||
} else
|
||||
@ -1208,6 +1212,9 @@ static SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) {
|
||||
}
|
||||
|
||||
SDValue ARMTargetLowering::LowerBlockAddress(SDValue Op, SelectionDAG &DAG) {
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||
unsigned ARMPCLabelIndex = 0;
|
||||
DebugLoc DL = Op.getDebugLoc();
|
||||
EVT PtrVT = getPointerTy();
|
||||
BlockAddress *BA = cast<BlockAddressSDNode>(Op)->getBlockAddress();
|
||||
@ -1217,6 +1224,7 @@ SDValue ARMTargetLowering::LowerBlockAddress(SDValue Op, SelectionDAG &DAG) {
|
||||
CPAddr = DAG.getTargetConstantPool(BA, PtrVT, 4);
|
||||
} else {
|
||||
unsigned PCAdj = Subtarget->isThumb() ? 4 : 8;
|
||||
ARMPCLabelIndex = AFI->createConstPoolEntryUId();
|
||||
ARMConstantPoolValue *CPV = new ARMConstantPoolValue(BA, ARMPCLabelIndex,
|
||||
ARMCP::CPBlockAddress,
|
||||
PCAdj);
|
||||
@ -1227,7 +1235,7 @@ SDValue ARMTargetLowering::LowerBlockAddress(SDValue Op, SelectionDAG &DAG) {
|
||||
PseudoSourceValue::getConstantPool(), 0);
|
||||
if (RelocM == Reloc::Static)
|
||||
return Result;
|
||||
SDValue PICLabel = DAG.getConstant(ARMPCLabelIndex++, MVT::i32);
|
||||
SDValue PICLabel = DAG.getConstant(ARMPCLabelIndex, MVT::i32);
|
||||
return DAG.getNode(ARMISD::PIC_ADD, DL, PtrVT, Result, PICLabel);
|
||||
}
|
||||
|
||||
@ -1238,6 +1246,9 @@ ARMTargetLowering::LowerToTLSGeneralDynamicModel(GlobalAddressSDNode *GA,
|
||||
DebugLoc dl = GA->getDebugLoc();
|
||||
EVT PtrVT = getPointerTy();
|
||||
unsigned char PCAdj = Subtarget->isThumb() ? 4 : 8;
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||
unsigned ARMPCLabelIndex = AFI->createConstPoolEntryUId();
|
||||
ARMConstantPoolValue *CPV =
|
||||
new ARMConstantPoolValue(GA->getGlobal(), ARMPCLabelIndex,
|
||||
ARMCP::CPValue, PCAdj, "tlsgd", true);
|
||||
@ -1247,7 +1258,7 @@ ARMTargetLowering::LowerToTLSGeneralDynamicModel(GlobalAddressSDNode *GA,
|
||||
PseudoSourceValue::getConstantPool(), 0);
|
||||
SDValue Chain = Argument.getValue(1);
|
||||
|
||||
SDValue PICLabel = DAG.getConstant(ARMPCLabelIndex++, MVT::i32);
|
||||
SDValue PICLabel = DAG.getConstant(ARMPCLabelIndex, MVT::i32);
|
||||
Argument = DAG.getNode(ARMISD::PIC_ADD, dl, PtrVT, Argument, PICLabel);
|
||||
|
||||
// call __tls_get_addr.
|
||||
@ -1279,7 +1290,10 @@ ARMTargetLowering::LowerToTLSExecModels(GlobalAddressSDNode *GA,
|
||||
SDValue ThreadPointer = DAG.getNode(ARMISD::THREAD_POINTER, dl, PtrVT);
|
||||
|
||||
if (GV->isDeclaration()) {
|
||||
// initial exec model
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||
unsigned ARMPCLabelIndex = AFI->createConstPoolEntryUId();
|
||||
// Initial exec model.
|
||||
unsigned char PCAdj = Subtarget->isThumb() ? 4 : 8;
|
||||
ARMConstantPoolValue *CPV =
|
||||
new ARMConstantPoolValue(GA->getGlobal(), ARMPCLabelIndex,
|
||||
@ -1290,7 +1304,7 @@ ARMTargetLowering::LowerToTLSExecModels(GlobalAddressSDNode *GA,
|
||||
PseudoSourceValue::getConstantPool(), 0);
|
||||
Chain = Offset.getValue(1);
|
||||
|
||||
SDValue PICLabel = DAG.getConstant(ARMPCLabelIndex++, MVT::i32);
|
||||
SDValue PICLabel = DAG.getConstant(ARMPCLabelIndex, MVT::i32);
|
||||
Offset = DAG.getNode(ARMISD::PIC_ADD, dl, PtrVT, Offset, PICLabel);
|
||||
|
||||
Offset = DAG.getLoad(PtrVT, dl, Chain, Offset,
|
||||
@ -1355,6 +1369,9 @@ SDValue ARMTargetLowering::LowerGlobalAddressELF(SDValue Op,
|
||||
|
||||
SDValue ARMTargetLowering::LowerGlobalAddressDarwin(SDValue Op,
|
||||
SelectionDAG &DAG) {
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||
unsigned ARMPCLabelIndex = 0;
|
||||
EVT PtrVT = getPointerTy();
|
||||
DebugLoc dl = Op.getDebugLoc();
|
||||
GlobalValue *GV = cast<GlobalAddressSDNode>(Op)->getGlobal();
|
||||
@ -1363,6 +1380,7 @@ SDValue ARMTargetLowering::LowerGlobalAddressDarwin(SDValue Op,
|
||||
if (RelocM == Reloc::Static)
|
||||
CPAddr = DAG.getTargetConstantPool(GV, PtrVT, 4);
|
||||
else {
|
||||
ARMPCLabelIndex = AFI->createConstPoolEntryUId();
|
||||
unsigned PCAdj = (RelocM != Reloc::PIC_) ? 0 : (Subtarget->isThumb()?4:8);
|
||||
ARMConstantPoolValue *CPV =
|
||||
new ARMConstantPoolValue(GV, ARMPCLabelIndex, ARMCP::CPValue, PCAdj);
|
||||
@ -1375,7 +1393,7 @@ SDValue ARMTargetLowering::LowerGlobalAddressDarwin(SDValue Op,
|
||||
SDValue Chain = Result.getValue(1);
|
||||
|
||||
if (RelocM == Reloc::PIC_) {
|
||||
SDValue PICLabel = DAG.getConstant(ARMPCLabelIndex++, MVT::i32);
|
||||
SDValue PICLabel = DAG.getConstant(ARMPCLabelIndex, MVT::i32);
|
||||
Result = DAG.getNode(ARMISD::PIC_ADD, dl, PtrVT, Result, PICLabel);
|
||||
}
|
||||
|
||||
@ -1390,6 +1408,9 @@ SDValue ARMTargetLowering::LowerGLOBAL_OFFSET_TABLE(SDValue Op,
|
||||
SelectionDAG &DAG){
|
||||
assert(Subtarget->isTargetELF() &&
|
||||
"GLOBAL OFFSET TABLE not implemented for non-ELF targets");
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||
unsigned ARMPCLabelIndex = AFI->createConstPoolEntryUId();
|
||||
EVT PtrVT = getPointerTy();
|
||||
DebugLoc dl = Op.getDebugLoc();
|
||||
unsigned PCAdj = Subtarget->isThumb() ? 4 : 8;
|
||||
@ -1400,7 +1421,7 @@ SDValue ARMTargetLowering::LowerGLOBAL_OFFSET_TABLE(SDValue Op,
|
||||
CPAddr = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, CPAddr);
|
||||
SDValue Result = DAG.getLoad(PtrVT, dl, DAG.getEntryNode(), CPAddr,
|
||||
PseudoSourceValue::getConstantPool(), 0);
|
||||
SDValue PICLabel = DAG.getConstant(ARMPCLabelIndex++, MVT::i32);
|
||||
SDValue PICLabel = DAG.getConstant(ARMPCLabelIndex, MVT::i32);
|
||||
return DAG.getNode(ARMISD::PIC_ADD, dl, PtrVT, Result, PICLabel);
|
||||
}
|
||||
|
||||
@ -1416,6 +1437,8 @@ ARMTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) {
|
||||
}
|
||||
case Intrinsic::eh_sjlj_lsda: {
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||
unsigned ARMPCLabelIndex = AFI->createConstPoolEntryUId();
|
||||
EVT PtrVT = getPointerTy();
|
||||
DebugLoc dl = Op.getDebugLoc();
|
||||
Reloc::Model RelocM = getTargetMachine().getRelocationModel();
|
||||
@ -1433,7 +1456,7 @@ ARMTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) {
|
||||
SDValue Chain = Result.getValue(1);
|
||||
|
||||
if (RelocM == Reloc::PIC_) {
|
||||
SDValue PICLabel = DAG.getConstant(ARMPCLabelIndex++, MVT::i32);
|
||||
SDValue PICLabel = DAG.getConstant(ARMPCLabelIndex, MVT::i32);
|
||||
Result = DAG.getNode(ARMISD::PIC_ADD, dl, PtrVT, Result, PICLabel);
|
||||
}
|
||||
return Result;
|
||||
|
@ -199,7 +199,7 @@ namespace {
|
||||
if (ACPV->hasModifier()) O << "(" << ACPV->getModifier() << ")";
|
||||
if (ACPV->getPCAdjustment() != 0) {
|
||||
O << "-(" << MAI->getPrivateGlobalPrefix() << "PC"
|
||||
<< ACPV->getLabelId()
|
||||
<< getFunctionNumber() << "_" << ACPV->getLabelId()
|
||||
<< "+" << (unsigned)ACPV->getPCAdjustment();
|
||||
if (ACPV->mustAddCurrentAddress())
|
||||
O << "-.";
|
||||
@ -844,7 +844,8 @@ void ARMAsmPrinter::printSBitModifierOperand(const MachineInstr *MI, int OpNum){
|
||||
|
||||
void ARMAsmPrinter::printPCLabel(const MachineInstr *MI, int OpNum) {
|
||||
int Id = (int)MI->getOperand(OpNum).getImm();
|
||||
O << MAI->getPrivateGlobalPrefix() << "PC" << Id;
|
||||
O << MAI->getPrivateGlobalPrefix()
|
||||
<< "PC" << getFunctionNumber() << "_" << Id;
|
||||
}
|
||||
|
||||
void ARMAsmPrinter::printRegisterList(const MachineInstr *MI, int OpNum) {
|
||||
@ -1364,7 +1365,8 @@ void ARMAsmPrinter::printInstructionThroughMCStreamer(const MachineInstr *MI) {
|
||||
// FIXME: MOVE TO SHARED PLACE.
|
||||
unsigned Id = (unsigned)MI->getOperand(2).getImm();
|
||||
const char *Prefix = MAI->getPrivateGlobalPrefix();
|
||||
MCSymbol *Label =OutContext.GetOrCreateSymbol(Twine(Prefix)+"PC"+Twine(Id));
|
||||
MCSymbol *Label =OutContext.GetOrCreateSymbol(Twine(Prefix)
|
||||
+ "PC" + Twine(getFunctionNumber()) + "_" + Twine(Id));
|
||||
OutStreamer.EmitLabel(Label);
|
||||
|
||||
|
||||
|
@ -40,14 +40,14 @@ define i32 @test1() {
|
||||
|
||||
; DarwinPIC: _test1:
|
||||
; DarwinPIC: ldr r0, LCPI1_0
|
||||
; DarwinPIC: LPC0:
|
||||
; DarwinPIC: LPC1_0:
|
||||
; DarwinPIC: ldr r0, [pc, +r0]
|
||||
; DarwinPIC: ldr r0, [r0]
|
||||
; DarwinPIC: bx lr
|
||||
|
||||
; DarwinPIC: .align 2
|
||||
; DarwinPIC: LCPI1_0:
|
||||
; DarwinPIC: .long L_G$non_lazy_ptr-(LPC0+8)
|
||||
; DarwinPIC: .long L_G$non_lazy_ptr-(LPC1_0+8)
|
||||
|
||||
; DarwinPIC: .section __DATA,__nl_symbol_ptr,non_lazy_symbol_pointers
|
||||
; DarwinPIC: .align 2
|
||||
@ -61,7 +61,7 @@ define i32 @test1() {
|
||||
; LinuxPIC: ldr r0, .LCPI1_0
|
||||
; LinuxPIC: ldr r1, .LCPI1_1
|
||||
|
||||
; LinuxPIC: .LPC0:
|
||||
; LinuxPIC: .LPC1_0:
|
||||
; LinuxPIC: add r0, pc, r0
|
||||
; LinuxPIC: ldr r0, [r1, +r0]
|
||||
; LinuxPIC: ldr r0, [r0]
|
||||
@ -69,7 +69,7 @@ define i32 @test1() {
|
||||
|
||||
; LinuxPIC: .align 2
|
||||
; LinuxPIC: .LCPI1_0:
|
||||
; LinuxPIC: .long _GLOBAL_OFFSET_TABLE_-(.LPC0+8)
|
||||
; LinuxPIC: .long _GLOBAL_OFFSET_TABLE_-(.LPC1_0+8)
|
||||
; LinuxPIC: .align 2
|
||||
; LinuxPIC: .LCPI1_1:
|
||||
; LinuxPIC: .long G(GOT)
|
||||
|
Loading…
Reference in New Issue
Block a user