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. -- Rodney Bates rodney.m.bates at acm.org
On Sun, 26 Jul 2015 at 06:48 Rodney M. Bates <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.) HTH, Andrew -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150726/2b53a0c4/attachment.html>
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-- Rodney Bates rodney.m.bates at acm.org
> On 2015-Jul-25, at 15:44, Rodney M. Bates <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.This was probably an oversight. Frankly, I'm not sure DITypeRef should really be in the DIBuilder API -- frontends should probably just pass in a DIType. Note that in ToT, DITypeRef has completely changed; it's a typedef from `TypedDINodeRef<DIType>` and has a public constructor from `Metadata*`. I suggest you just make the constructor public in your local copy of LLVM; even better, work off of the LLVM 3.7 branch (better still, work off of ToT).
On 07/27/2015 10:55 PM, Duncan P. N. Exon Smith wrote:> >> On 2015-Jul-25, at 15:44, Rodney M. Bates <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. > > This was probably an oversight. Frankly, I'm not sure DITypeRef should > really be in the DIBuilder API -- frontends should probably just pass > in a DIType. > > Note that in ToT, DITypeRef has completely changed; it's a typedef from > `TypedDINodeRef<DIType>` and has a public constructor from `Metadata*`. > > I suggest you just make the constructor public in your local copy of > LLVM; even better, work off of the LLVM 3.7 branch (better still, work > off of ToT). >Thanks, that helps. -- Rodney Bates rodney.m.bates at acm.org