llvm-d

Jens Mueller jens.k.mueller at gmx.de
Sat Mar 23 21:33:29 PDT 2013


Moritz Maxeiner wrote:
> On Saturday, 23 March 2013 at 21:24:50 UTC, Jens Mueller wrote:
> >Moritz Maxeiner wrote:
> >>On Saturday, 23 March 2013 at 16:37:35 UTC, Jens Mueller wrote:
> >>>Moritz Maxeiner wrote:
> >>>>On Saturday, 23 March 2013 at 10:31:30 UTC, Jens Mueller
> >>>>wrote:
> >>>>
> >>>>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?
> >>
> >>Afaict they rely on the fact that when you install llvm on your
> >>system you get the {/usr/include/}llvm/Config/Targets.def file,
> >>in
> >>which is set what targets LLVM was compiled with (it gets
> >>generated
> >>at LLVM compile-time). Then the Target.h, in which the
> >>LLVMInitializeAllTargets function rests, includes that file and
> >>does
> >>some of that macro-voodoo that makes C/C++ so "lovable" to only
> >>create calls for the targets enabled in the Targets.def file
> >>when
> >>LLVMInitalizeAllTargets gets inlined. Of course, that solution
> >>isn't
> >>viable because afaik you cannot access filesystem IO functions
> >>in D
> >>CTFE, meaning the Targets.def file is useless to you.
> >><rant>Hooray
> >>for the C/C++ preprocessor, may it die, die, die!</rant>
> >
> >If I knew the path to the Targets.def file at compile I could load
> >its
> >contents and use it.
> >http://dlang.org/expression.html#ImportExpression
> >Still have to find out how to get the path.
> >
> >Jens
> 
> Oh, I did not know that was possible, thanks for the link!
> Can't really help you with the path, though. On Linux it's probably
> either /usr/include/llvm/Config/Targets.def or
> /usr/local/include/llvm/Config/Targets.def, but some people might
> install it on /opt/llvm or other custom paths. You also have a
> problem when there's only a shared lib available for LLVM and no
> headers.. No idea about OSX though. And on Windows you'll probably
> only deal with a DLL and not have the headers available anyway - at
> least I do (I cross compile the LLVM dll on linux with a mingw64 gcc
> toolchain, so no headers on windows for me).

I think passing the path -J should work. But I don't know what to do
when there is no Targets.def.

Jens


More information about the Digitalmars-d-announce mailing list