llvm-6502/lib/System/Win32/DynamicLibrary.inc
Chuck Rose III 0ccb93034a This change does a couple of things. First it gets the Visual Studio builds working.
I added the lexing files to the VStudio projects and removed the .l files from the 
VStudio projects.  There was a problem with use of strtoll in TGLexer.cpp and Chris
suggested switching to strtol, so that's included here.

Additionally, this checkin adds minimal x64 builds to the VStudio builds.  Build issues
related to x64 in the windows specific files for DynamicLibrary.inc and Singals.inc
are worked around, but not ultimately solved.  Binaries used to be stored in

...\win32\{Debug|Release}

but are now kept in

...\win32\bin\{win32|x64}\{Debug|Release}

intermediate files will continue to be stored in the individual project directories under 
win32.  

Some names will likely change in the future to reflect that the vstudio projects
are no longer 32-bit only, but I wanted to get things up and running today so kept away
from bigger restructuring.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44260 91177308-0d34-0410-b5e6-96231b3b80d8
2007-11-21 00:37:56 +00:00

176 lines
5.1 KiB
C++

//===- Win32/DynamicLibrary.cpp - Win32 DL Implementation -------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file was developed by Jeff Cohen and is distributed under the
// University of Illinois Open Source License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file provides the Win32 specific implementation of DynamicLibrary.
//
//===----------------------------------------------------------------------===//
#include "Win32.h"
#ifdef __MINGW32__
#include <imagehlp.h>
#else
#include <dbghelp.h>
#endif
#ifdef __MINGW32__
#if (HAVE_LIBIMAGEHLP != 1)
#error "libimagehlp.a should be present"
#endif
#else
#pragma comment(lib, "dbghelp.lib")
#endif
namespace llvm {
using namespace sys;
//===----------------------------------------------------------------------===//
//=== WARNING: Implementation here must contain only Win32 specific code
//=== and must not be UNIX code.
//===----------------------------------------------------------------------===//
static std::vector<HMODULE> OpenedHandles;
#ifdef _WIN64
typedef DWORD64 ModuleBaseType;
#else
typedef ULONG ModuleBaseType;
#endif
extern "C" {
static BOOL CALLBACK ELM_Callback(PSTR ModuleName,
ModuleBaseType ModuleBase,
ULONG ModuleSize,
PVOID UserContext)
{
// Ignore VC++ runtimes prior to 7.1. Somehow some of them get loaded
// into the process.
if (stricmp(ModuleName, "msvci70") != 0 &&
stricmp(ModuleName, "msvcirt") != 0 &&
stricmp(ModuleName, "msvcp50") != 0 &&
stricmp(ModuleName, "msvcp60") != 0 &&
stricmp(ModuleName, "msvcp70") != 0 &&
stricmp(ModuleName, "msvcr70") != 0 &&
#ifndef __MINGW32__
// Mingw32 uses msvcrt.dll by default. Don't ignore it.
// Otherwise, user should be aware, what he's doing :)
stricmp(ModuleName, "msvcrt") != 0 &&
#endif
stricmp(ModuleName, "msvcrt20") != 0 &&
stricmp(ModuleName, "msvcrt40") != 0) {
OpenedHandles.push_back((HMODULE)ModuleBase);
}
return TRUE;
}
}
DynamicLibrary::DynamicLibrary() : handle(0) {
handle = GetModuleHandle(NULL);
OpenedHandles.push_back((HMODULE)handle);
}
DynamicLibrary::~DynamicLibrary() {
if (handle == 0)
return;
// GetModuleHandle() does not increment the ref count, so we must not free
// the handle to the executable.
if (handle != GetModuleHandle(NULL))
FreeLibrary((HMODULE)handle);
handle = 0;
for (std::vector<HMODULE>::iterator I = OpenedHandles.begin(),
E = OpenedHandles.end(); I != E; ++I) {
if (*I == handle) {
// Note: don't use the swap/pop_back trick here. Order is important.
OpenedHandles.erase(I);
}
}
}
// 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) {
if (filename) {
HMODULE a_handle = LoadLibrary(filename);
if (a_handle == 0)
return MakeErrMsg(ErrMsg, std::string(filename) + ": Can't open : ");
OpenedHandles.push_back(a_handle);
} else {
// When no file is specified, enumerate all DLLs and EXEs in the
// process.
EnumerateLoadedModules(GetCurrentProcess(), ELM_Callback, 0);
}
// Because we don't remember the handle, we will never free it; hence,
// it is loaded permanently.
return false;
}
void* DynamicLibrary::SearchForAddressOfSymbol(const char* symbolName) {
// First check symbols added via AddSymbol().
std::map<std::string, void *>::iterator I = g_symbols.find(symbolName);
if (I != g_symbols.end())
return I->second;
// Now search the libraries.
for (std::vector<HMODULE>::iterator I = OpenedHandles.begin(),
E = OpenedHandles.end(); I != E; ++I) {
FARPROC ptr = GetProcAddress((HMODULE)*I, symbolName);
if (ptr)
return (void *) ptr;
}
#if defined(__MINGW32__)
{
EXPLICIT_SYMBOL(_alloca);
EXPLICIT_SYMBOL2(alloca, _alloca);
#undef EXPLICIT_SYMBOL
#undef EXPLICIT_SYMBOL2
#undef EXPLICIT_SYMBOL_DEF
}
#elif defined(_MSC_VER)
{
EXPLICIT_SYMBOL2(alloca, _alloca_probe);
EXPLICIT_SYMBOL2(_alloca, _alloca_probe);
#undef EXPLICIT_SYMBOL
#undef EXPLICIT_SYMBOL2
#undef EXPLICIT_SYMBOL_DEF
}
#endif
return 0;
}
void *DynamicLibrary::GetAddressOfSymbol(const char *symbolName) {
assert(handle != 0 && "Invalid DynamicLibrary handle");
return (void *) GetProcAddress((HMODULE)handle, symbolName);
}
}