llvm-d

deadalnix deadalnix at gmail.com
Wed Mar 27 22:04:41 PDT 2013


On Wednesday, 27 March 2013 at 21:28:42 UTC, Moritz Maxeiner 
wrote:
> 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.

Ok, that sound reasonable.

Second question, why do you do stuff like :

enum Foo {
    FooA,
    FooB,
    FooC,
}

when you would do

enum Foo {
     A,
     B,
     C,
}

?

D enums introduce a scope, when C's don't. So C need to prefix 
enums entries manually, when in D it isn't required. The C to D 
translation goes as follow : FooA => Foo.A instead of Foo.FooA .

If the goal isn't to follow LLVM's source as closely as possible, 
I think this is the way to go.


More information about the Digitalmars-d-announce mailing list