Moritz Maxeiner wrote: > On Saturday, 23 March 2013 at 10:31:30 UTC, Jens Mueller wrote: > >Moritz Maxeiner wrote: > >>On Saturday, 23 March 2013 at 09:30:07 UTC, Jens Mueller wrote: > >>>Moritz Maxeiner wrote: > >>>>A couple of more things I forgot to mention: > >>>> > >>>>- You will need to additionally add bindings for all the > >>>>>>LLVMInitialize"TARGET_NAME"{TargetInfo,Target,TargetMC,AsmParser,AsmPrinter,Disassembler} > >>>>functions. They reside inside the target libraries and not > >>>>inside > >>>>llvm-c, which is why only translating the C API won't get you > >>>>them. > >>>>The LLVMInitializeNativeTarget function , which is necessary > >>>>to > >>>>use > >>>>LLVM for jitting - otherwise you'll only have access to > >>>>interpreting, which is horribly slow - uses them, but it is a > >>>>static > >>>>inline function and as such does not get exposed because LLVM > >>>>builds > >>>>with the option to hide all inline functions. That is not a > >>>>problem > >>>>for C, as this function gets defined in the header, but for > >>>>D it > >>>>is > >>>>a big problem, because you cannot access > >>>>LLVMInitializeNativeTarget. > >>>>You need to recreate it in D by using all the functions it > >>>>references. Of course, you'll also have to accomodate the > >>>>fact > >>>>that > >>>>these referenced functions may or may not be compiled in > >>>>depending > >>>>on which target where selected when compiling LLVM. > >>> > >>>Do you happen to know why these functions are not declared in > >>>the > >>>header > >>>files. I mean when using the C interface in C I wouldn't even > >>>know > >>>that > >>>these functions exist. > >> > >>I suspect it is because of LLVM's internal structure. Each > >>supported > >>target is presented by its own directory and they are afaict > >>mutually independent from one another, "so their initialiation > >>routines should be part of them themselves" I would guess, but I > >>don't know, sorry. > >>Also, when using the C interface in C there is little need to > >>know > >>them because they get encapsulated in LLVMInitializeAllTargets > >>and > >>LLVMInitializeNativeTarget. > > > >Not sure whether this fixes the problem completely. Can you check > >https://github.com/jkm/deimos-llvm/blob/master/deimos/llvm/c/target.d#L157 > >I came up with this solution to replace the macros in the C > >binding. > > It looks mostly okay to me with one problem: Afaict the code > enforces the presence of the initialization routines of all targets, > e.g. if one target is missing LLVMInitializeAllTargets will not > link, as there are undefined references for that missing target, but > LLVM may or may not be compiled with that target so you cannot > enforce its presence in the bindings. For runtime loading the > solution I used was to check the function pointer for null; for > linking you have this problem: When using linking, knowing which > targets are available happens at link time (when the LLVM libraries > are linked in), which means you cannot use any compile time tricks > for automatic detection of which targets are available. > The only solution for that problem I can think of would be to use > runtime reflection and check at runtime for each initialiation > routine if it is a callable function, but afaik D only has compile > time reflection.
I wonder how they do it in C. Don't you have to set a macro? I could add some version identifiers. > PS: All your recent posts seem to create new threads, I don't know > why, though, just mentioning it because some people not interested > in this might get annoyed. Don't know either. I'm using the mail interface. Jens