ldc/driver/main.d
Martin Kinkelin 3044e5c228
Speculatively fix linkability of LDC and LDMD on Android (#3128)
An issue since eliminating the previous D main() functions in LDC v1.15.
Should work according to
https://forum.dlang.org/post/caqgnbgynlqdrnomtzfq@forum.dlang.org.
2019-08-10 15:22:52 +02:00

76 lines
1.9 KiB
D
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//===-- driver/main.d - D entry point -----------------------------*- D -*-===//
//
// LDC the LLVM D compiler
//
// This file is distributed under the BSD-style LDC license. See the LICENSE
// file for details.
//
//===----------------------------------------------------------------------===//
//
// D entry point for LDC/LDMD, just forwarding to cppmain().
//
//===----------------------------------------------------------------------===//
module driver.main;
// In driver/main.cpp or driver/ldmd.cpp
extern(C++) int cppmain();
/+ We use this manual D main for druntime initialization via a manual
+ _d_run_main() call in the C main() in driver/{main,ldmd}.cpp.
+/
extern(C) int _Dmain(string[])
{
version (Windows)
switchConsoleCodePageToUTF8();
return cppmain();
}
// We use UTF-8 for narrow strings, on Windows too.
version (Windows)
{
import core.sys.windows.wincon;
import core.sys.windows.windef : UINT;
private:
__gshared UINT originalCP, originalOutputCP;
void switchConsoleCodePageToUTF8()
{
import core.stdc.stdlib : atexit;
import core.sys.windows.winnls : CP_UTF8;
originalCP = GetConsoleCP();
originalOutputCP = GetConsoleOutputCP();
SetConsoleCP(CP_UTF8);
SetConsoleOutputCP(CP_UTF8);
// atexit handlers are also called when exiting via exit() etc.;
// that's the reason this isn't a RAII struct.
atexit(&resetConsoleCodePage);
}
extern(C) void resetConsoleCodePage()
{
SetConsoleCP(originalCP);
SetConsoleOutputCP(originalOutputCP);
}
}
// TLS bracketing symbols required for our custom TLS emulation on Android
// as we don't have a D main() function for LDC and LDMD.
version (Android)
{
import ldc.attributes;
extern(C) __gshared
{
@section(".tdata")
int _tlsstart = 0;
@section(".tcommon")
int _tlsend = 0;
}
}