diff options
| author | Bob Wilson <bob.wilson@apple.com> | 2009-11-02 20:59:23 +0000 |
|---|---|---|
| committer | Bob Wilson <bob.wilson@apple.com> | 2009-11-02 20:59:23 +0000 |
| commit | 907eebd5a6779e8539ef7bf63550a5b72de76ab2 (patch) | |
| tree | 78e3fcf8bc7c45a3549b7e6cd378eb052f4582f1 /lib/Target/ARM/ARMISelLowering.cpp | |
| parent | 60131c0d0bb04d0ae3c13cbd055616c71d86e8ea (diff) | |
Put BlockAddresses into ARM constant pools.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@85824 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/ARM/ARMISelLowering.cpp')
| -rw-r--r-- | lib/Target/ARM/ARMISelLowering.cpp | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/lib/Target/ARM/ARMISelLowering.cpp b/lib/Target/ARM/ARMISelLowering.cpp index 41a597a00f..d7e6642bd9 100644 --- a/lib/Target/ARM/ARMISelLowering.cpp +++ b/lib/Target/ARM/ARMISelLowering.cpp @@ -1209,9 +1209,26 @@ static SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) { SDValue ARMTargetLowering::LowerBlockAddress(SDValue Op, SelectionDAG &DAG) { DebugLoc DL = Op.getDebugLoc(); + EVT PtrVT = getPointerTy(); BlockAddress *BA = cast<BlockAddressSDNode>(Op)->getBlockAddress(); - SDValue Result = DAG.getBlockAddress(BA, DL, /*isTarget=*/true); - return DAG.getNode(ARMISD::Wrapper, DL, getPointerTy(), Result); + Reloc::Model RelocM = getTargetMachine().getRelocationModel(); + SDValue CPAddr; + if (RelocM == Reloc::Static) { + CPAddr = DAG.getTargetConstantPool(BA, PtrVT, 4); + } else { + unsigned PCAdj = Subtarget->isThumb() ? 4 : 8; + ARMConstantPoolValue *CPV = new ARMConstantPoolValue(BA, ARMPCLabelIndex, + ARMCP::CPBlockAddress, + PCAdj); + CPAddr = DAG.getTargetConstantPool(CPV, PtrVT, 4); + } + CPAddr = DAG.getNode(ARMISD::Wrapper, DL, PtrVT, CPAddr); + SDValue Result = DAG.getLoad(PtrVT, DL, DAG.getEntryNode(), CPAddr, + PseudoSourceValue::getConstantPool(), 0); + if (RelocM == Reloc::Static) + return Result; + SDValue PICLabel = DAG.getConstant(ARMPCLabelIndex++, MVT::i32); + return DAG.getNode(ARMISD::PIC_ADD, DL, PtrVT, Result, PICLabel); } // Lower ISD::GlobalTLSAddress using the "general dynamic" model |
