summaryrefslogtreecommitdiffstats
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
commit9b07b7b099ceed6f2ac98eb157fc213302b65b07 (patch)
treeaff162bd133fd2610128193135563a6c314c8738
parentf7647e432cb1d87fb325b3302542690916fe448d (diff)
downloadbcm5719-llvm-9b07b7b099ceed6f2ac98eb157fc213302b65b07.tar.gz
bcm5719-llvm-9b07b7b099ceed6f2ac98eb157fc213302b65b07.zip
implement constant expr. sub ptr ptr
llvm-svn: 52049
-rw-r--r--clang/lib/CodeGen/CGExprConstant.cpp16
-rw-r--r--clang/test/CodeGen/struct-init.c13
2 files changed, 26 insertions, 3 deletions
diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp
index be9eaad9acf..58b18848171 100644
--- a/clang/lib/CodeGen/CGExprConstant.cpp
+++ b/clang/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) {
diff --git a/clang/test/CodeGen/struct-init.c b/clang/test/CodeGen/struct-init.c
new file mode 100644
index 00000000000..5b815de3998
--- /dev/null
+++ b/clang/test/CodeGen/struct-init.c
@@ -0,0 +1,13 @@
+// RUN: clang %s -emit-llvm
+
+typedef struct _zend_ini_entry zend_ini_entry;
+struct _zend_ini_entry {
+ void *mh_arg1;
+};
+
+char a;
+
+const zend_ini_entry ini_entries[] = {
+ { ((char*)&((zend_ini_entry*)0)->mh_arg1 - (char*)(void*)0)},
+ { ((long long*)&a - (long long*)(void*)2)},
+};
OpenPOWER on IntegriCloud