On Saturday, 23 March 2013 at 19:57:52 UTC, Chris Cain wrote:
On Saturday, 23 March 2013 at 10:01:19 UTC, Moritz Maxeiner
wrote:
No problem at all. There is an example quoted in the README
and how to compile it, so without further information form
your side I don't know what the problem is. To get the example
from the README working:
- Download/Clone the github repo into a folder (let's say
llvm-d)
- cd into that folder
- execute rdmd -L-ldl sample/multithreaded.d
The need for the -dl flag is only for POSIX platforms and will
be gone with the next commit as I have included a lib pragma.
If the above doesn't help could you please tell me what
exactly you have done and at which point you have the problems?
-- Moritz
Thanks so much.
I had dub upgrade the llvm-d package and now I have different
problems. That said, I do have a working example (as long as
rdmd is used).
I have updated the gist (with repro steps):
https://gist.github.com/Zshazz/c7dbd6eee0b6b242252b
Regarding the two warnings:
The second one for line 346 has been fixed.
I have no idea how you could get the first one as the statement
is - at least according to my logic - reachable: It should be
reached if the "isSizedDerivedType" is used on a StructType
instance. I'll look into that shortly.
Other than that, the link time errors appear because the dl
library (which allows for loading of dynamic libraries at
runtime) did not get linked in. That should not be possible as
llvm.util.shlib contains a lib pragma that ensures the dl library
does get linked in.
Also, you're giving d string to c function which expect c
strings. Not a good idea (c strings are \0 terminated, d strings
aren't). Use std.string.toStringz (which allocates GC memory,
though and the c strings may dissappear while LLVM is using them
as D collects them, because the GC doesn't know about any use on
the C side) or use llvm.util.memory.toCString (which does the
same thing as toStringz, only it doesn't allocate GC memory, but
"unmanaged" memory).
And you don't need the two lines with the lib directory if you
have LLVM installed. That exists in the README sample only to
show how it is done for people who wish to ship the LLLVM library
together with their program inside a subfolder, I've removed them
from the README example since it seems to cause confusion and
also added the fibonacci example to the README to showcase
something more complex.
I'm running LLVM 3.2, so the example given in the README
doesn't work. But the code in the gist works as long as you run
'dub --rdmd', so that's some progress! Not really sure about
the linking problems without rdmd. This is sufficient to start
some work with it to really try some things out, though.
There another example now available under samples/fibonacci.d
that shows a complex example that works with LLVM 3.2.
I'll keep messing around with it. It seems like you already
know that JIT doesn't work because we need
InitializeNativeTarget.
It does work, that is precisely what I reimplemented
LLVMInitializeNativeTarget and LLVMInitializeAllTargets in D for.
See llvm.c.functions.
That all said, the tutorials, instructions, and documentation
for the C API of LLVM is pretty sparse. The best I've seen to
figure out how things work is to go through
http://llvm.org/doxygen/modules.html and piece together (very
slowly) how something might work. I'm also having to cross
reference tutorials made for the C++ API and figure out how to
make it work in C by reading the raw source code to get the
equivalent calls. Fortunately I did find that one post that
gave a close-to-complete example in C. Is there any better way
to do this at this point?
You just pretty much described what I've been doing myself, I
don't know of a better way at present, sorry. I'm trying to
advance the D API to a point where it's usable and then I'll add
decent documentation to the D API, but until then you'll have to
suffer through the doxygen "documentation" the same way I do^^
- Moritz