LDC / BetterC / _d_run_main

Richard garlicbready at googlemail.com
Sat Mar 10 12:00:12 UTC 2018


On Saturday, 10 March 2018 at 07:54:33 UTC, Mike Franklin wrote:
> On Saturday, 10 March 2018 at 02:25:38 UTC, Richard wrote:
>> Hi,
>> I've been trying to see if I can get an mbed project to work 
>> with Dlang
>> basically compiling D code for use on a Cortex-M Proccessor
>
> You might be interested in the following, if you're not already 
> aware:
>  * https://github.com/JinShil/stm32f42_discovery_demo
>  * https://bitbucket.org/timosi/minlibd
>
> The STM32 demo only supports GDC right now, but I'll be 
> updating it to support LDC when 2.079.0 lands there.  2.079.0 
> removes some coupling of the compiler to the runtime, so I 
> should be able to avoid the following bugs:
>
> https://github.com/ldc-developers/ldc/issues/created_by/JinShil
>
>> so I tried this instead
>> ```
>> extern (C) int _d_run_main(int argc, char **argv, void* 
>> mainFunc) {
>>     MainFuncType mFunc = cast(MainFuncType) mainFunc;
>>     return mFunc(null);
>> }
>> ```
>>
>> but nope that didn't seem to work ether, compiles okay but the 
>> code in main() (D space) isn't called
>> I'd imagine this should be a simple thing, anyone got any 
>> ideas?
>
> The following worked fine for me on my x64 Linux desktop with 
> LDC version 1.8.0 (DMD v2.078.3, LLVM 5.0.1)
>
> ``` main.d
> import core.stdc.stdio;
>
> private alias extern(C) int function(char[][] args) 
> MainFuncType;
> extern (C) int _d_run_main(int argc, char **argv, void* 
> mainFunc)
> {
>     MainFuncType mFunc = cast(MainFuncType) mainFunc;
>     return mFunc(null);
> }
>
> void main()
> {
>     printf("Hello, World!\n");
> }
> ```
>
> Compile with: ldc2 -defaultlib= -debuglib= -betterC main.d
>
> Mike


Based on the above this seems to work fine so I'll use this since 
it's the simplest option.
```
extern(C) int main(int argc, char** argv) {
     return d_main();
}

int d_main() {
   // Do stuff
}
```


This compiles but main() is never called btw
```
import core.stdc.stdio;

private alias extern(C) int function(char[][] args) MainFuncType;
extern (C) int _d_run_main(int argc, char **argv, void* mainFunc)
{
     MainFuncType mFunc = cast(MainFuncType) mainFunc;
     return mFunc(null);
}

int main() {
   // Do stuff
}
```
I tried compiling with
ldc2 -defaultlib= -debuglib= -mtriple=thumb-none-linux-eabi 
-mcpu=cortex-m3 --od=. -c -betterC main.d



More information about the Digitalmars-d-learn mailing list