[LLVMdev] [un]wrapping llvm:DITypeRef
David Blaikie
dblaikie at gmail.com
Mon Jul 27 13:12:26 PDT 2015
On Mon, Jul 27, 2015 at 1:05 PM, Rodney M. Bates <rodney_bates at lcwb.coop>
wrote:
>
>
> On 07/27/2015 10:59 AM, Rodney M. Bates wrote:
>
>>
>>
>> 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.
>>
>>
> I was mistaken. This does not solve my problem. The implicit conversion
> operator DITypeRef converts from a DIType, which can contain only an
> MDNode*,
> but I need to construct a DITypeRef, which can contain a Metadata*. The
> constructor I need is here:
>
> template <typename T> class DIRef {
> template <typename DescTy>
> friend DescTy DIDescriptor::getFieldAs(unsigned Elt) const;
> friend DIScopeRef DIScope::getContext() const;
> friend DIScopeRef DIScope::getRef() const;
> friend class DIType;
>
> /// \brief Val can be either a MDNode or a MDString.
> ///
> /// In the latter, MDString specifies the type identifier.
> const Metadata *Val;
> explicit DIRef(const Metadata *V);
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>
> but it is private. I am trying very hard to avoid in-llvm-tree
> modifications
> (we've been down that path with a gcc-derived back end.) Do I have any
> alternative?
> Would the project accept making this constructor public?
Have you found where it's called from yet? (perhaps by putting an
"assert(false)" or defining it as deleted ("= delete") and
recompiling/running tests) Then see about using the same mechanism for your
use case?
>
>
> Thanks.
>>
>> HTH,
>>> Andrew
>>>
>>
>>
> --
> Rodney Bates
> rodney.m.bates at acm.org
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150727/c8bef854/attachment.html>
More information about the llvm-dev
mailing list