From 95799d2a775db62707380e14621555e7074f6a5e Mon Sep 17 00:00:00 2001 From: JinShil Date: Sun, 25 Aug 2019 14:41:49 +0900 Subject: [PATCH] Add core.internal.entrypoint to move C main generation logic out of the compiler and into druntime --- mak/COPY | 1 + mak/SRCS | 1 + mak/WINDOWS | 3 +++ src/core/internal/entrypoint.d | 37 ++++++++++++++++++++++++++++++++++ src/object.d | 3 +++ 5 files changed, 45 insertions(+) create mode 100644 src/core/internal/entrypoint.d diff --git a/mak/COPY b/mak/COPY index 2962e567e4..3bf5aeac77 100644 --- a/mak/COPY +++ b/mak/COPY @@ -27,6 +27,7 @@ COPY=\ $(IMPDIR)\core\internal\attributes.d \ $(IMPDIR)\core\internal\convert.d \ $(IMPDIR)\core\internal\dassert.d \ + $(IMPDIR)\core\internal\entrypoint.d \ $(IMPDIR)\core\internal\hash.d \ $(IMPDIR)\core\internal\parseoptions.d \ $(IMPDIR)\core\internal\spinlock.d \ diff --git a/mak/SRCS b/mak/SRCS index e744d0c992..9d5bb5b6e9 100644 --- a/mak/SRCS +++ b/mak/SRCS @@ -26,6 +26,7 @@ SRCS=\ src\core\internal\atomic.d \ src\core\internal\convert.d \ src\core\internal\dassert.d \ + src\core\internal\entrypoint.d \ src\core\internal\hash.d \ src\core\internal\parseoptions.d \ src\core\internal\spinlock.d \ diff --git a/mak/WINDOWS b/mak/WINDOWS index cccb5cc480..d5ecb2263e 100644 --- a/mak/WINDOWS +++ b/mak/WINDOWS @@ -135,6 +135,9 @@ $(IMPDIR)\core\internal\convert.d : src\core\internal\convert.d $(IMPDIR)\core\internal\dassert.d : src\core\internal\dassert.d copy $** $@ +$(IMPDIR)\core\internal\entrypoint.d : src\core\internal\entrypoint.d + copy $** $@ + $(IMPDIR)\core\internal\hash.d : src\core\internal\hash.d copy $** $@ diff --git a/src/core/internal/entrypoint.d b/src/core/internal/entrypoint.d new file mode 100644 index 0000000000..cf6e755bd0 --- /dev/null +++ b/src/core/internal/entrypoint.d @@ -0,0 +1,37 @@ +module core.internal.entrypoint; + +/** +A template containing C main and any call(s) to initialize druntime and +call D main. Any module containing a D main function declaration will +cause the compiler to generate a `mixin _d_cmain();` statement to inject +this code into the module. +*/ +template _d_cmain() +{ + extern(C) + { + // `pragma(mangle, ...)`s are necessary due to https://issues.dlang.org/show_bug.cgi?id=20012 + + pragma(mangle, "_d_run_main") + int _d_run_main(int argc, char **argv, void* mainFunc); + + pragma(mangle, "_Dmain") + int _Dmain(char[][] args); + + pragma(mangle, "main") + int main(int argc, char **argv) + { + return _d_run_main(argc, argv, &_Dmain); + } + + // Solaris, for unknown reasons, requires both a main() and an _main() + version (Solaris) + { + pragma(mangle, "_main") + int _main(int argc, char** argv) + { + return main(argc, argv); + } + } + } +} diff --git a/src/object.d b/src/object.d index 2a75db61b2..291d1b2f71 100644 --- a/src/object.d +++ b/src/object.d @@ -38,6 +38,9 @@ alias dstring = immutable(dchar)[]; version (D_ObjectiveC) public import core.attribute : selector; +/// See $(REF _d_cmain, core,internal,entrypoint) +public import core.internal.entrypoint : _d_cmain; + /// See $(REF _d_arrayappendTImpl, core,internal,array,appending) public import core.internal.array.appending : _d_arrayappendTImpl; /// See $(REF _d_arrayappendcTXImpl, core,internal,array,appending)