summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
authorRobert Lytton <robert@xmos.com>2014-01-06 14:20:32 +0000
committerRobert Lytton <robert@xmos.com>2014-01-06 14:20:32 +0000
commitbc4d976152cad4e40640f7ad49e9026e21fd3943 (patch)
tree23c7edc51667ee4083ce381ee1a2b0e8c37f2ffc /llvm/lib/Target
parenta3e6e2b2866f7a3cbc8ed37c955ccfe625bacc22 (diff)
downloadbcm5719-llvm-bc4d976152cad4e40640f7ad49e9026e21fd3943.tar.gz
bcm5719-llvm-bc4d976152cad4e40640f7ad49e9026e21fd3943.zip
XCore target: fix handling of unsized global arrays in large code model
llvm-svn: 198609
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r--llvm/lib/Target/XCore/XCoreISelLowering.cpp17
1 files changed, 13 insertions, 4 deletions
diff --git a/llvm/lib/Target/XCore/XCoreISelLowering.cpp b/llvm/lib/Target/XCore/XCoreISelLowering.cpp
index 668a2486396..c6cbf51202c 100644
--- a/llvm/lib/Target/XCore/XCoreISelLowering.cpp
+++ b/llvm/lib/Target/XCore/XCoreISelLowering.cpp
@@ -268,6 +268,18 @@ getGlobalAddressWrapper(SDValue GA, const GlobalValue *GV,
return DAG.getNode(XCoreISD::PCRelativeWrapper, dl, MVT::i32, GA);
}
+static bool IsSmallObject(const GlobalValue *GV, const XCoreTargetLowering &XTL) {
+ if (XTL.getTargetMachine().getCodeModel() == CodeModel::Small)
+ return true;
+
+ Type *ObjType = GV->getType()->getPointerElementType();
+ if (!ObjType->isSized())
+ return false;
+
+ unsigned ObjSize = XTL.getDataLayout()->getTypeAllocSize(ObjType);
+ return ObjSize < CodeModelLargeSize && ObjSize != 0;
+}
+
SDValue XCoreTargetLowering::
LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const
{
@@ -275,10 +287,7 @@ LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const
const GlobalValue *GV = GN->getGlobal();
SDLoc DL(GN);
int64_t Offset = GN->getOffset();
- Type *ObjType = GV->getType()->getPointerElementType();
- if (getTargetMachine().getCodeModel() == CodeModel::Small ||
- !ObjType->isSized() ||
- getDataLayout()->getTypeAllocSize(ObjType) < CodeModelLargeSize) {
+ if (IsSmallObject(GV, *this)) {
// We can only fold positive offsets that are a multiple of the word size.
int64_t FoldedOffset = std::max(Offset & ~3, (int64_t)0);
SDValue GA = DAG.getTargetGlobalAddress(GV, DL, MVT::i32, FoldedOffset);
OpenPOWER on IntegriCloud