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

Reply via email to