From 47ccf1af3a8d0f960fc965b527fd3197c4bca7d5 Mon Sep 17 00:00:00 2001 From: Anton Korobeynikov Date: Fri, 22 Feb 2008 10:08:31 +0000 Subject: Provide __main hooks for cygwin & mingw32 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47479 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/System/Win32/DynamicLibrary.inc | 44 +++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 17 deletions(-) (limited to 'lib/System/Win32') diff --git a/lib/System/Win32/DynamicLibrary.inc b/lib/System/Win32/DynamicLibrary.inc index 0bb59c9..5b4d5a5 100644 --- a/lib/System/Win32/DynamicLibrary.inc +++ b/lib/System/Win32/DynamicLibrary.inc @@ -44,10 +44,17 @@ static std::vector OpenedHandles; #endif extern "C" { +#if !defined(_MSC_VER) || _MSC_VER < 1500 static BOOL CALLBACK ELM_Callback(PSTR ModuleName, ModuleBaseType ModuleBase, ULONG ModuleSize, PVOID UserContext) +#else + static BOOL CALLBACK ELM_Callback(PCSTR ModuleName, + ModuleBaseType ModuleBase, + ULONG ModuleSize, + PVOID UserContext) +#endif { // Ignore VC++ runtimes prior to 7.1. Somehow some of them get loaded // into the process. @@ -93,23 +100,6 @@ DynamicLibrary::~DynamicLibrary() { } } } - -// Stack probing routines are in the support library (e.g. libgcc), but we don't -// have dynamic linking on windows. Provide a hook. -#if defined(__MINGW32__) || defined (_MSC_VER) - #define EXPLICIT_SYMBOL(SYM) \ - if (!strcmp(symbolName, #SYM)) return (void*)&SYM - #define EXPLICIT_SYMBOL2(SYMFROM, SYMTO) \ - if (!strcmp(symbolName, #SYMFROM)) return (void*)&SYMTO - #define EXPLICIT_SYMBOL_DEF(SYM) \ - extern "C" { extern void *SYM; } - - #if defined(__MINGW32__) - EXPLICIT_SYMBOL_DEF(_alloca); - #elif defined(_MSC_VER) - EXPLICIT_SYMBOL_DEF(_alloca_probe); - #endif -#endif bool DynamicLibrary::LoadLibraryPermanently(const char *filename, std::string *ErrMsg) { @@ -131,6 +121,24 @@ bool DynamicLibrary::LoadLibraryPermanently(const char *filename, return false; } +// Stack probing routines are in the support library (e.g. libgcc), but we don't +// have dynamic linking on windows. Provide a hook. +#if defined(__MINGW32__) || defined (_MSC_VER) + #define EXPLICIT_SYMBOL(SYM) \ + if (!strcmp(symbolName, #SYM)) return (void*)&SYM + #define EXPLICIT_SYMBOL2(SYMFROM, SYMTO) \ + if (!strcmp(symbolName, #SYMFROM)) return (void*)&SYMTO + #define EXPLICIT_SYMBOL_DEF(SYM) \ + extern "C" { extern void *SYM; } + + #if defined(__MINGW32__) + EXPLICIT_SYMBOL_DEF(_alloca); + EXPLICIT_SYMBOL_DEF(__main); + #elif defined(_MSC_VER) + EXPLICIT_SYMBOL_DEF(_alloca_probe); + #endif +#endif + void* DynamicLibrary::SearchForAddressOfSymbol(const char* symbolName) { // First check symbols added via AddSymbol(). std::map::iterator I = g_symbols.find(symbolName); @@ -148,6 +156,8 @@ void* DynamicLibrary::SearchForAddressOfSymbol(const char* symbolName) { #if defined(__MINGW32__) { EXPLICIT_SYMBOL(_alloca); + EXPLICIT_SYMBOL(__main); + EXPLICIT_SYMBOL2(alloca, _alloca); #undef EXPLICIT_SYMBOL #undef EXPLICIT_SYMBOL2 -- cgit v1.1