[Reposted from llvm-bugs mailing list. Also has an updated, hopefully better, patch associated with it.] Hi, The following program causes the LLVM GCC4 front end to ICE: struct A { virtual ~A(); }; template <typename Ty> struct B : public A { ~B () { delete [] val; } private: Ty* val; }; template <typename Ty> struct C : public A { C (); ~C (); }; template <typename Ty> struct D : public A { D () {} private: B<C<Ty> > blocks; }; template class D<double>; I'm far from an expert on this area of the code base, so I'm submitting this as a proposed fix: Index: gcc/llvm-convert.cpp ==================================================================--- gcc/llvm-convert.cpp (revision 166) +++ gcc/llvm-convert.cpp (working copy) @@ -2202,18 +2202,23 @@ // Figure out how large the element pointed to is. const Type *ElTy = cast<PointerType>(LHS->getType())- >getElementType(); - int64_t EltSize = TD.getTypeSize(ElTy); + + if (!ElTy->isAbstract()) { + // We can only get the type size (and thus convert to using a GEP instr) + // if the type isn't abstract + int64_t EltSize = TD.getTypeSize(ElTy); - // If EltSize exactly divides Offset, then we know that we can turn this - // into a getelementptr instruction. - int64_t EltOffset = Offset/EltSize; - if (EltOffset*EltSize == Offset) { - // If this is a subtract, we want to step backwards. - if (Opc == Instruction::Sub) - EltOffset = -EltOffset; - Constant *C = ConstantSInt::get(Type::LongTy, EltOffset); - Value *V = new GetElementPtrInst(LHS, C, "tmp", CurBB); - return CastToType(V, TREE_TYPE(exp)); + // If EltSize exactly divides Offset, then we know that we can turn + // this into a getelementptr instruction. + int64_t EltOffset = Offset/EltSize; + if (EltOffset*EltSize == Offset) { + // If this is a subtract, we want to step backwards. + if (Opc == Instruction::Sub) + EltOffset = -EltOffset; + Constant *C = ConstantSInt::get(Type::LongTy, EltOffset); + Value *V = new GetElementPtrInst(LHS, C, "tmp", CurBB); + return CastToType(V, TREE_TYPE(exp)); + } } }
On Mon, 11 Sep 2006, Bill Wendling wrote:> I'm far from an expert on this area of the code base, so I'm > submitting this as a proposed fix:Patch looks great. I switched it to use "if (ElTy->isSized())" instead of checking to see if it's abstract. Types like "{ opaque* }" are considered abstract (because they contain an opaque type in the type graph) but they have a size (in this case, sizeof(pointer)). Thanks for tracking this down! I've applied the fix. -Chris> Index: gcc/llvm-convert.cpp > ==================================================================> --- gcc/llvm-convert.cpp (revision 166) > +++ gcc/llvm-convert.cpp (working copy) > @@ -2202,18 +2202,23 @@ > > // Figure out how large the element pointed to is. > const Type *ElTy = cast<PointerType>(LHS->getType())- > >getElementType(); > - int64_t EltSize = TD.getTypeSize(ElTy); > + > + if (!ElTy->isAbstract()) { > + // We can only get the type size (and thus convert to using a > GEP instr) > + // if the type isn't abstract > + int64_t EltSize = TD.getTypeSize(ElTy); > > - // If EltSize exactly divides Offset, then we know that we can > turn this > - // into a getelementptr instruction. > - int64_t EltOffset = Offset/EltSize; > - if (EltOffset*EltSize == Offset) { > - // If this is a subtract, we want to step backwards. > - if (Opc == Instruction::Sub) > - EltOffset = -EltOffset; > - Constant *C = ConstantSInt::get(Type::LongTy, EltOffset); > - Value *V = new GetElementPtrInst(LHS, C, "tmp", CurBB); > - return CastToType(V, TREE_TYPE(exp)); > + // If EltSize exactly divides Offset, then we know that we can > turn > + // this into a getelementptr instruction. > + int64_t EltOffset = Offset/EltSize; > + if (EltOffset*EltSize == Offset) { > + // If this is a subtract, we want to step backwards. > + if (Opc == Instruction::Sub) > + EltOffset = -EltOffset; > + Constant *C = ConstantSInt::get(Type::LongTy, EltOffset); > + Value *V = new GetElementPtrInst(LHS, C, "tmp", CurBB); > + return CastToType(V, TREE_TYPE(exp)); > + } > } > } > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >-Chris -- http://nondot.org/sabre/ http://llvm.org/