[LLVMdev] non-pointer gcroot
Gordon Henriksen
gordonhenriksen at me.com
Fri Nov 7 18:40:19 PST 2008
On Nov 7, 2008, at 15:29, Scott Graham wrote:
> I'm getting an assert in LowerIntrinsics::InsertRootInitializers
> because I'm gcroot'ing an alloca to a non-pointer.
>
> I was hoping to modify InsertRootInitializers to memset the
> structure in the case that it's not a pointer, but I'm not sure how
> to. Can anyone suggest what should go at "todo; something here"?
>
> ...
> for (AllocaInst **I = Roots, **E = Roots + Count; I != E; ++I)
> if (!InitedRoots.count(*I)) {
> const Type* Ty = cast<PointerType>((*I)->getType())-
> >getElementType();
> if (Ty->getTypeID() == Type::PointerTyID) {
> new StoreInst(ConstantPointerNull::get(cast<PointerType>(Ty)),
> *I, IP);
> } else {
> // todo; something here
> }
> MadeChange = true;
> }
> ...
Hi Scott,
Using the new support for first-class aggregate values, you should be
able to rewrite the above code to use Constant::getNullValue
regardless of the type of the alloca. There needn't be a special-case
for !isa<PointerType>((*I)->getType()->getElementType()).
However, I hesitate to recommend this route; I think it boxes in from
supporting escape analysis (where pointer fields within a stack-
allocated struct would need to be initialized). I'd suggest you gcroot
pointers to your fat pointers instead. This needn't imply any changes
to your fat pointers in the heap, and constitutes a trivial change to
a stalk walker.
— Gordon
P.S. — Avoid using Type::getTypeID; it's an implementation detail for
the templates in llvm/support/Casing.h: isa<>, cast<>, dyn_cast<>, etc.
More information about the llvm-dev
mailing list