aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGExprConstant.cpp
diff options
context:
space:
mode:
authorNuno Lopes <nunoplopes@sapo.pt>2008-06-06 16:41:08 +0000
committerNuno Lopes <nunoplopes@sapo.pt>2008-06-06 16:41:08 +0000
commit77e1dfcffe9ed0078b015418182784b56532998c (patch)
treeddcad987f74337ec4e6085fe3ded74a468f44181 /lib/CodeGen/CGExprConstant.cpp
parent6a5a34c0e5587263df719c62030761cf59d27fe4 (diff)
implement constant expr. sub ptr ptr
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@52049 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGExprConstant.cpp')
-rw-r--r--lib/CodeGen/CGExprConstant.cpp16
1 files changed, 13 insertions, 3 deletions
diff --git a/lib/CodeGen/CGExprConstant.cpp b/lib/CodeGen/CGExprConstant.cpp
index be9eaad9ac..58b1884817 100644
--- a/lib/CodeGen/CGExprConstant.cpp
+++ b/lib/CodeGen/CGExprConstant.cpp
@@ -447,9 +447,19 @@ public:
// int - int
return llvm::ConstantExpr::getSub(LHS, RHS);
}
-
- assert(0 && "Unhandled bin sub case!");
- return 0;
+
+ assert(isa<llvm::PointerType>(LHS->getType()));
+
+ const llvm::Type *ResultType = ConvertType(E->getType());
+ const QualType Type = E->getLHS()->getType();
+ const QualType ElementType = Type->getAsPointerType()->getPointeeType();
+
+ LHS = llvm::ConstantExpr::getPtrToInt(LHS, ResultType);
+ RHS = llvm::ConstantExpr::getPtrToInt(RHS, ResultType);
+
+ llvm::Constant *sub = llvm::ConstantExpr::getSub(LHS, RHS);
+ llvm::Constant *size = EmitSizeAlignOf(ElementType, E->getType(), true);
+ return llvm::ConstantExpr::getSDiv(sub, size);
}
llvm::Constant *VisitBinShl(const BinaryOperator *E) {