diff options
author | Nuno Lopes <nunoplopes@sapo.pt> | 2008-06-06 16:41:08 +0000 |
---|---|---|
committer | Nuno Lopes <nunoplopes@sapo.pt> | 2008-06-06 16:41:08 +0000 |
commit | 77e1dfcffe9ed0078b015418182784b56532998c (patch) | |
tree | ddcad987f74337ec4e6085fe3ded74a468f44181 /lib/CodeGen/CGExprConstant.cpp | |
parent | 6a5a34c0e5587263df719c62030761cf59d27fe4 (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.cpp | 16 |
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) { |