[LLVMdev] Any way how to instantiate templates even when it is not necessary for the compilation?

Nathan Jeffords blunted2night at gmail.com
Mon May 7 16:03:23 PDT 2012


Is the original definition of the template available in the XML file, not
just the reference to the specific instantiations (i.e.
IMyEnumerator<int>).

On Mon, May 7, 2012 at 12:08 PM, Ondrej Kolacek <natris1 at gmail.com> wrote:

> (another try from different mail account; I hope I was able to clarify
> my issue better. )
>
> Hello,
> I am working on a tool which takes c++ header files of a C++ DLL and
> based on "interfaces" defined in them generates csharp classes and
> glue layer for interop. For analyzing the c++ code I am currently
> using clang, which parses the headers and writes output into xml via
> -ast-print-xml (yes, this unfortunately means that it is a very old
> version of clang). I then use these xml files to generate the csharp
> code. Since the header files are written in consistent style, it works
> pretty well.
>
> But new version of headers contains templates. Nothing fancy, usually
> stuff like:
> template <typename T>
> IMyEnumerator {
> virtual HRESULT GetCurrent(T*item) = 0;
> };
> class IWhateverInterface {
> virtual IMyEnumerator<int> & GetEnumerator() = 0;
> };
> And here lies the problem - since the template IMyEnumerator<int> is
> only used in this declaration, this template specialization is not
> instantiated and the XML does not contain full CXXRecord of the class.
> I however need to know the full structure of the type because I need
> to generate the glue layer for the enumerator.
>
> It seems to me that this would be quite a common problem for similar
> tools and someone might have stumbled upon it already, and because of
> this I'd like to ask: is there any clean way how to force
> instantiation of templates that do not strictly have to be
> instantiated? Because if it isn't, this means that I will either have
> to somehow analyze the headers and generate code which forces the
> instantiation (which is not really trivial) or try to hack the code
> somehow to force the instantiation (probably possible but certainly
> not pretty).
>
> NOTE: one example of code which forces the instantiation is
> class Dummy : public IMyEnumerator<int>
> {
> };
>
> Thank you for any idea,
> Ondrej
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120507/30bf67de/attachment.html>


More information about the llvm-dev mailing list