[LLVMdev] [un]wrapping llvm:DITypeRef

Rodney M. Bates
Mon, 27 Jul 2015 15:59:34 -0000

On 07/25/2015 08:57 PM, Andrew Wilkins wrote:
> On Sun, 26 Jul 2015 at 06:48 Rodney M. Bates <rodney_bates at lcwb.coop
<mailto:rodney_bates at lcwb.coop>> wrote:
>
>     In trying to write a C binding for DIBuilder of llvm 3.6.1, I can't
see a way to unwrap
>     llvm::DITypeRef, declared in include/llvm/IR/DebugInfo.h.  This is a
class with one
>     data member, a pointer to Metadata.
>
>     If I try to make my C type a struct with one pointer, I can't cast
it to DITypeRef.
>     If I try to go inside the classes and use the pointer, I can cast, but
can't construct
>     a DITypeRef when unwrapping, as both its pointer field 'Val'
and the constructor are
>     private.
>
>
> I don't know if I'm understanding the problem exactly, so I'll
just point you to what the Go bindings are doing.
>
> First, define wrap/unwrap for llvm::Metadata (of which DIType is a
descendant):
> http://llvm.org/klaus/llvm/blob/master/bindings/go/llvm/IRBindings.h#L-63
>
> Then use wrapped llvm::Metadata in the C API:
> http://llvm.org/klaus/llvm/blob/master/bindings/go/llvm/DIBuilderBindings.h
>
> (You could have DIType-specific wrap/unwrap too, using the same method.)
>

My problem is not DIType, it's DITypeRef.  This was added sometime after
3.4.2 and
by 3.6.1.  It is used, e.g. for formal parameter Ty of
DIBuilder::createLocalVariable.
These Go bindings apparently have not been updated to 3.6.1, as they give DIType
in
such places.

However, in looking more carefully at DIType, with the intention of being able
to better
explain why DITypeRef gives me a problem that DIType does not, I find the way I
need
to construct a DITypeRef is actually declared in DIType:


class DIType : public DIScope {
  ...
  public:
   ...
   operator DITypeRef () const {
   ^^^^^^^^^^^^^^^^^^
     assert(isType() &&
            "constructing DITypeRef from an MDNode that is not a
type");
     return DITypeRef(&*getRef());
   }

This, through a series of specializations, befriendings, etc., is able to
get to the private constructor of DITypeRef.

This should help solve my problem, once I figure out how to construct a
properly equivalent DIType.

Thanks.

> HTH,
> Andrew