[cfe-commits] r52049 - in /cfe/trunk: lib/CodeGen/CGExprConstant.cpp test/CodeGen/struct-init.c
Nuno Lopes
nunoplopes at sapo.pt
Fri Jun 6 09:41:09 PDT 2008
Author: nlopes
Date: Fri Jun 6 11:41:08 2008
New Revision: 52049
URL: http://llvm.org/viewvc/llvm-project?rev=52049&view=rev
Log:
implement constant expr. sub ptr ptr
Added:
cfe/trunk/test/CodeGen/struct-init.c
Modified:
cfe/trunk/lib/CodeGen/CGExprConstant.cpp
Modified: cfe/trunk/lib/CodeGen/CGExprConstant.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprConstant.cpp?rev=52049&r1=52048&r2=52049&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGExprConstant.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExprConstant.cpp Fri Jun 6 11:41:08 2008
@@ -447,9 +447,19 @@
// 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) {
Added: cfe/trunk/test/CodeGen/struct-init.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/struct-init.c?rev=52049&view=auto
==============================================================================
--- cfe/trunk/test/CodeGen/struct-init.c (added)
+++ cfe/trunk/test/CodeGen/struct-init.c Fri Jun 6 11:41:08 2008
@@ -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)},
+};
More information about the cfe-commits
mailing list