1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
//===-- 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;
}
}
|