On Wednesday, 27 March 2013 at 15:29:19 UTC, deadalnix wrote:
On Sunday, 24 March 2013 at 02:37:52 UTC, Moritz Maxeiner wrote:
On Sunday, 24 March 2013 at 01:35:28 UTC, Chris Cain wrote:
On Saturday, 23 March 2013 at 21:19:14 UTC, Moritz Maxeiner wrote:

TLDR: Your example should now work, provided you fix what I previously mentioned. You can also look at sample/fibonacci.d which I used instead of your fac to confirm that you gist now works.

- Moritz

Awesome. Indeed, it now fully works (and JIT does work after all! Thanks for showing me how to use that). Thanks for the more interesting example in the README, it's extremely helpful. And also thank you for taking some time to help with the issues I was having.

No problem, writing that fibonacci example forced me to read up Stuff about LLVM I need to know anyway (for making the D API)^^ Just one thing I forgot to mention: When you're using llvm.util.memory.toCString you'll need to take care of the allocated memory yourself, or you'll get memory leaks. The example is a special case as all the c strings need to be kept aroound until program termination, anyway (since LLVM's global context exists until then and all the c strings used by LLVM internally), but that's not the case with all LLVM C functions with c string args.


Question : why did you reorganize the modules ? They don't match LLVM's .h filenames.

Is that intended , if yes, why ?

Yes it is intended to be that way. Regarding the reasons for that decision:

Short answer:

Because in the case of the LLVM C API it makes things a lot easier and simpler to maintain, as well as trivial to add new parts for new LLVM versions.

Long answer:

1) The LLVM C API has headers which have very few lines of actual code (e.g. Linker.h which only contains one enum and one functions), making those into D modules seems wasteful.

2) Over versions of the LLVM C API headers appear and dissappear (e.g. Linker.h exists since 3.2, EnhancedDissassembly.h has been removed in trunk 3.3) and having them all around as D modules makes maintenence a lot more complicated.

3) Having all functions in a single compile time enum makes the runtime loading process a lot easier as you can generate all three steps ( 1. function pointer alias for every C function 2. function pointer variable for every function pointer alias 3. loading of the shared lib symbol into the function pointer for every function pointer) with but a few lines of codes, instead of having to write the names of all C functions three times. And since you can encode more information in that enum (an associative array in this case) adding more function is trivial: Simply add the function to the array in this manner: "NAME" : ["SIGNATURE", "+", "VERSION"] and that's it (and if the function has been removed in said VERSION, change "+" into "-"). Since the MixinMap template (a CTFE version of the map function designed to get an array as its list and create D code for each of the items of said array based on a delegate function f) is used for the three steps described above no further code is needed.

TLDR: Supporting different versions of the LLVM C API takes considerably less effort this way and if there is a disadvantage to this approach big enough to outweigh that I can't see it.

Reply via email to