implement constant expr. sub ptr ptr

llvm-svn: 52049
This commit is contained in:
Nuno Lopes 2008-06-06 16:41:08 +00:00
parent f7647e432c
commit 9b07b7b099
2 changed files with 26 additions and 3 deletions

View File

@ -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) {

View File

@ -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)},
};