finish off codegen support for sub of pointer to functions,

finishing off rdar://6520707


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64295 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2009-02-11 07:21:43 +00:00
Родитель 8cb6fb3bd8
Коммит e5ed15195b
2 изменённых файлов: 14 добавлений и 2 удалений

Просмотреть файл

@ -965,8 +965,9 @@ Value *ScalarExprEmitter::EmitSub(const BinOpInfo &Ops) {
uint64_t ElementSize;
// Handle GCC extension for pointer arithmetic on void* types.
if (LHSElementType->isVoidType()) {
// Handle GCC extension for pointer arithmetic on void* and function pointer
// types.
if (LHSElementType->isVoidType() || LHSElementType->isFunctionType()) {
ElementSize = 1;
} else {
ElementSize = CGF.getContext().getTypeSize(LHSElementType) / 8;
@ -977,6 +978,10 @@ Value *ScalarExprEmitter::EmitSub(const BinOpInfo &Ops) {
RHS = Builder.CreatePtrToInt(RHS, ResultType, "sub.ptr.rhs.cast");
Value *BytesBetween = Builder.CreateSub(LHS, RHS, "sub.ptr.sub");
// Optimize out the shift for element size of 1.
if (ElementSize == 1)
return BytesBetween;
// HACK: LLVM doesn't have an divide instruction that 'knows' there is no
// remainder. As such, we handle common power-of-two cases here to generate
// better code. See PR2247.

Просмотреть файл

@ -52,3 +52,10 @@ void eMaisUma() {
if (*t)
return;
}
// rdar://6520707
void f0(void (*fp)(void), void (*fp2)(void)) {
int x = fp - fp2;
}