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 | 9b07b7b099ceed6f2ac98eb157fc213302b65b07 (patch) | |
tree | aff162bd133fd2610128193135563a6c314c8738 | |
parent | f7647e432cb1d87fb325b3302542690916fe448d (diff) | |
download | bcm5719-llvm-9b07b7b099ceed6f2ac98eb157fc213302b65b07.tar.gz bcm5719-llvm-9b07b7b099ceed6f2ac98eb157fc213302b65b07.zip |
implement constant expr. sub ptr ptr
llvm-svn: 52049
-rw-r--r-- | clang/lib/CodeGen/CGExprConstant.cpp | 16 | ||||
-rw-r--r-- | clang/test/CodeGen/struct-init.c | 13 |
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)}, +}; |