natris at centrum.cz
2012-May-04 15:43 UTC
[LLVMdev] Any way how to instantiate templates even when it is not necessary for the compilation?
Hello, I am working on a tool which takes c++ header files 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 IMyEnumerator { virtual HRESULT GetCurrent(T*item) = 0; }; class IWhateverInterface { virtual IMyEnumerator & GetEnumerator() = 0; }; And here lies the problem - since the template IMyEnumerator does not have to be instantiated for clang to compile the headers, this Specialization is not instantiated and the XML does not contain full CXXRecord of the class. I however need to know the full structure 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). Thank you, Ondrej
Nathan Jeffords
2012-May-05 16:11 UTC
[LLVMdev] Any way how to instantiate templates even when it is not necessary for the compilation?
How would clang know what type to instantiate it with? Would it make sense to replace T with object, or create a CSharp generic instead in you translation process? On Fri, May 4, 2012 at 8:43 AM, <natris at centrum.cz> wrote:> Hello, > I am working on a tool which takes c++ header files 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 > IMyEnumerator { > virtual HRESULT GetCurrent(T*item) = 0; > }; > class IWhateverInterface { > virtual IMyEnumerator & GetEnumerator() = 0; > }; > And here lies the problem - since the template IMyEnumerator does not have > to be instantiated for clang to compile the headers, this Specialization is > not instantiated and the XML does not contain full CXXRecord of the class. > I however need to know the full structure 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). > > Thank you, > Ondrej > > _______________________________________________ > 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/20120505/eb6a7bec/attachment.html>
Possibly Parallel Threads
- [LLVMdev] Any way how to instantiate templates even when it is not necessary for the compilation?
- [LLVMdev] Any way how to instantiate templates even when it is not necessary for the compilation?
- GSOC Projects
- instantiate record in single table inheritance
- Reload instance data on instantiate