diff options
author | Robert Lytton <robert@xmos.com> | 2014-01-06 14:20:32 +0000 |
---|---|---|
committer | Robert Lytton <robert@xmos.com> | 2014-01-06 14:20:32 +0000 |
commit | bc4d976152cad4e40640f7ad49e9026e21fd3943 (patch) | |
tree | 23c7edc51667ee4083ce381ee1a2b0e8c37f2ffc /llvm/lib/Target | |
parent | a3e6e2b2866f7a3cbc8ed37c955ccfe625bacc22 (diff) | |
download | bcm5719-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.cpp | 17 |
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); |