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).

Moritz

Reply via email to