llvm-d

Moritz Maxeiner moritz at ucworks.org
Mon Mar 18 05:18:05 PDT 2013


On Sunday, 17 March 2013 at 20:05:09 UTC, Jens Mueller wrote:
> Deimos just provides a plain D interface for C libraries.
> What do you mean?
> You can do static or dynamic linking.
> With dynamic linking it will be loaded at startup time by the 
> loader.
> But you can also load it at runtime using some system API which 
> I assume
> you do. I started ddl (http://jkm.github.com/ddl/ddl.html) 
> which does
> work with Deimos to some extent. A limiting factor is 
> compilation speed.

Technically deimos provides extern(C) functions, which by 
themselves have - as  you said - to be linked 
statically/dynamically and cannot be loaded at runtime.
Normally to load at runtime you need a function pointer to give 
the OS functions to load from the shared lib and afaict you're 
using ctfe to extract the functions from deimos and create those 
functions pointers from them to circumvent that problem - kudos 
by the way, never even thought about that possibility.
Now to the real problem: When you're creating a shared lib on 
windows (32bit) it's going to be COFF, normally. But optlink 
can't link with that, only with OMF - which is one of the reason, 
I believe, why support for the MSLinker was added to windows 
64bit versions of dmd. You can use import libs to make dmd on 
win32 work with COFF shared libs, but again, that is extra work 
on the user of llvm-d, which I do not want. The solution for me 
was simply to cut out the middle man reponsible for that hassle 
(optlink) from the process.

On another note:
- Afaict ddl doesn't have OS X support, so I can't use it as a 
replacement for what I already have. If you want to add that to 
ddl you could just look at llvm/util/shlib.d in llvm-d, it's done 
there, missing support for one of the three majors is a big no-no 
for me.
- Another problem would be that I want to keep things compatible 
with dub, which would become very difficult seing as ddl doesn't 
have support for dub at present.
- Moreover, ddl doesn't seem to have support for loading from a 
specific directory (such as "lib"), or at least I can't find it
- There are functions in the LLVM C API, which are not available 
in every LLVM shared lib: The target specific ones. That means 
that - depending on which targets where selected when compiling 
th shared lib - these functions may or may not be in the shared 
lib and trying to load them from the shared lib MUST NOT throw an 
exception. If loading fails it simply means the shared lib 
doesn't have support for that specific target; ddl however, 
always throws an exception when it can't load a symbol.

Only with those issues resolved in ddl would it be even feasible 
for me to do a split into say llvm-d + (deimos)llvm and have 
llvm-d depend on ddl.
And even then llvm-d would depend on 2 projects (ddl and 
(deimos)llvm) instead of 0 like now and more dependencies for 
very little to no functionality increase is a very big argument 
against doing so for me.

> Even though I understand your arguments. Technically, they are 
> different
> projects. As you say built on LLVM's C API. One could use git 
> submodules
> to ease building the higher level API.

By that same argument, however, you could also claim that the D 
runtime core should be split into more projects - one who only 
imports the necessary C functions from the libc, and the other 
who does all the D stuff.
Not the best example, I know, but the point still stands: When 
the D OOP API is done, the llvm-d user should have no more need 
to use the C functions by themselves. Also LLVM A API functions 
often do strange things you wouldn't expect and the documentation 
is sometimes just simply wrong; using the LLVM C API from D with 
D's GC without something in between that takes care of the 
GC/NonGC gap is dangerous at best, I believe.

> In sum you want to load libraries at runtime and have a higher 
> level
> API. Both are fine. But I question that it is a good decision 
> to do the
> loading at runtime for each C library.

Not that I advocate doing it for every C library, but if one 
really wants to what would be the real downside? The program 
startup time would suffer, of course, but with current computer 
architectures would it really be by an amount that actually 
hurts? And would the comfort of not having to worry about 
different library formats and linkers  on different OS's outweigh 
that? It's not like it is actually calculation-heavy stuff, only 
loading symbols. You could even parallelise it if it's more than 
a couple of hundred.

> I would use Deimos bindings. I even started one myself.
> https://github.com/jkm/deimos-llvm/
> But I cannot devote much time on it.

That would make it one for and one somewhat against^^
In all seriousness, though: Even if I were to split llvm-d into 
the two parts, I can't do it right now, as only the C API stuff 
exists at present, so splitting would leave me with one empty 
github repository right now.
What I could do, however, is copying the C parts from llvm-d 
instead of splitting them. If I were to do that, I'd need to know 
how to get it in the deimos "D programming" group, though.

To sum it up: I'd much rather make a copy of the C stuff from 
llvm-d, make it a deimos project, but leave llvm-d untouched then 
to do a split and deal with the consequences. It might seem 
contraproductive, but the actual effort to support two very 
similar projects with updates is less than to deal with problems 
arising from the split.

- Moritz


More information about the Digitalmars-d-announce mailing list