From b6f0b74f5b0b0b15cf0b502ca0d0cc5673557c7f Mon Sep 17 00:00:00 2001 From: Pavol Marko Date: Fri, 2 Nov 2007 20:15:19 +0000 Subject: [PATCH] First step to gcc support: it compiles now --HG-- branch : hookman_autogen extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/hookman_autogen%40542 --- sourcehook/generate/shworker.bin | Bin 59700 -> 50608 bytes sourcehook/sh_memory.h | 9 ++- sourcehook/sourcehook_hookmangen.cpp | 8 +- sourcehook/sourcehook_hookmangen.h | 15 ++-- sourcehook/sourcehook_hookmangen_x86.h | 10 +++ sourcehook/test/Makefile | 2 +- sourcehook/test/testhookmangen.cpp | 97 +++++++++++++------------ sourcehook/test/testhookmangen.h | 52 +++++++------ sourcehook/test/testhookmangen.hxx | 12 ++- 9 files changed, 118 insertions(+), 87 deletions(-) diff --git a/sourcehook/generate/shworker.bin b/sourcehook/generate/shworker.bin index 62ab6481958fe5aae35eafc7c64e5542003be902..96105b3c726572527d301d27612a2893d65a2beb 100755 GIT binary patch literal 50608 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 diff --git a/sourcehook/sh_memory.h b/sourcehook/sh_memory.h index a8e7077..e9bd163 100644 --- a/sourcehook/sh_memory.h +++ b/sourcehook/sh_memory.h @@ -24,7 +24,10 @@ # elif /******/ defined __linux__ # include # include +namespace LinuxSignal +{ # include +} # include // http://www.die.net/doc/linux/man/man2/mprotect.2.html # include @@ -163,7 +166,7 @@ namespace SourceHook if (setjmp(g_BadReadJmpBuf)) return true; - prevHandler = signal(SIGSEGV, BadReadHandler); + prevHandler = LinuxSignal::signal(SIGSEGV, BadReadHandler); volatile const char *p = reinterpret_cast(addr); char dummy; @@ -173,7 +176,7 @@ namespace SourceHook g_BadReadCalled = false; - signal(SIGSEGV, prevHandler); + LinuxSignal::signal(SIGSEGV, prevHandler); return false; #else @@ -320,7 +323,7 @@ namespace SourceHook newRegion.size += m_PageSize; #ifdef __linux__ - newRegion.startPtr = mmap(0, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAN_ANONYMOUS, -1); + newRegion.startPtr = mmap(0, newRegion.size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); #else newRegion.startPtr = VirtualAlloc(NULL, newRegion.size, MEM_COMMIT, PAGE_READWRITE); #endif diff --git a/sourcehook/sourcehook_hookmangen.cpp b/sourcehook/sourcehook_hookmangen.cpp index 217d00b..6a3df96 100644 --- a/sourcehook/sourcehook_hookmangen.cpp +++ b/sourcehook/sourcehook_hookmangen.cpp @@ -1119,7 +1119,7 @@ namespace SourceHook #endif } - unsigned char * GenContext::GenerateHookFunc() + void * GenContext::GenerateHookFunc() { // prologue IA32_Push_Reg(&m_HookFunc, REG_EBP); @@ -1317,7 +1317,7 @@ namespace SourceHook } // Pre-condition: GenerateHookFunc() has been called! - unsigned char * GenContext::GeneratePubFunc() + void * GenContext::GeneratePubFunc() { jitoffs_t counter, tmppos; @@ -1525,7 +1525,7 @@ namespace SourceHook BuildProtoInfo(); GenerateHookFunc(); - return reinterpret_cast(GeneratePubFunc()); + return fastdelegate::detail::horrible_cast(GeneratePubFunc()); } } -} \ No newline at end of file +} diff --git a/sourcehook/sourcehook_hookmangen.h b/sourcehook/sourcehook_hookmangen.h index cdd0486..6b2c0f3 100644 --- a/sourcehook/sourcehook_hookmangen.h +++ b/sourcehook/sourcehook_hookmangen.h @@ -12,7 +12,6 @@ #define __SOURCEHOOK_HOOKMANGEN_H__ #include "sourcehook_impl.h" -#include "windows.h" namespace SourceHook { @@ -20,7 +19,7 @@ namespace SourceHook { // Code gen stuff -#if defined HAVE_STDINT_H && !defined WIN32 +#if SH_COMP == SH_COMP_GCC #include typedef int8_t jit_int8_t; typedef uint8_t jit_uint8_t; @@ -28,7 +27,7 @@ namespace SourceHook typedef uint32_t jit_uint32_t; typedef int64_t jit_int64_t; typedef uint64_t jit_uint64_t; -#elif defined WIN32 +#elif SH_COMP == SH_COMP_MSVC typedef __int8 jit_int8_t; typedef unsigned __int8 jit_uint8_t; typedef __int32 jit_int32_t; @@ -123,9 +122,9 @@ namespace SourceHook ms_Allocator.SetRE(reinterpret_cast(m_pData)); } - operator unsigned char *() + operator void *() { - return GetData(); + return reinterpret_cast(GetData()); } void write_ubyte(jit_uint8_t x) { push(x); } @@ -223,8 +222,8 @@ namespace SourceHook bool PassInfoSupported(const IntPassInfo &pi, bool is_ret); void Clear(); void BuildProtoInfo(); - unsigned char *GenerateHookFunc(); - unsigned char *GeneratePubFunc(); + void *GenerateHookFunc(); + void *GeneratePubFunc(); public: // Level 1 -> Public interface GenContext(const ProtoInfo *proto, int vtbl_offs, int vtbl_idx, ISourceHook *pSHPtr); @@ -236,4 +235,4 @@ namespace SourceHook } -#endif \ No newline at end of file +#endif diff --git a/sourcehook/sourcehook_hookmangen_x86.h b/sourcehook/sourcehook_hookmangen_x86.h index 034dea4..576c2ca 100644 --- a/sourcehook/sourcehook_hookmangen_x86.h +++ b/sourcehook/sourcehook_hookmangen_x86.h @@ -14,6 +14,16 @@ #include +#undef REG_EAX +#undef REG_ECX +#undef REG_EDX +#undef REG_EBX +#undef REG_ESP +#undef REG_SIB +#undef REG_EBP +#undef REG_ESI +#undef REG_EDI + //MOD R/M #define MOD_MEM_REG 0 #define MOD_DISP8 1 diff --git a/sourcehook/test/Makefile b/sourcehook/test/Makefile index 6c859b0..c1d907e 100644 --- a/sourcehook/test/Makefile +++ b/sourcehook/test/Makefile @@ -9,7 +9,7 @@ INCLUDE = -I. -I.. MAX_PARAMS=20 BINARY = sourcehook_test -OBJECTS = main.cpp sourcehook.cpp $(shell ls -t test*.cpp) +OBJECTS = main.cpp sourcehook.cpp ../sourcehook_hookmangen.cpp $(shell ls -t test*.cpp) HEADERS = ../sh_list.h ../sh_tinyhash.h ../sh_memory.h ../sh_string.h ../sh_vector.h ../sourcehook_impl.h ../FastDelegate.h ../sourcehook.h ../sh_memfuncinfo.h ifeq "$(DEBUG)" "true" diff --git a/sourcehook/test/testhookmangen.cpp b/sourcehook/test/testhookmangen.cpp index 7418e86..b82e9e4 100644 --- a/sourcehook/test/testhookmangen.cpp +++ b/sourcehook/test/testhookmangen.cpp @@ -18,6 +18,17 @@ namespace { + StateList g_States; + SourceHook::ISourceHook *g_SHPtr; + SourceHook::Plugin g_PLID; + + // PtrBuf(ptr) gives ptrs unique numbers + // in the order they appear + SourceHook::List g_PtrHash; + + bool g_Inside_LeafFunc = false; // inside a hook or a func + + // POD / Object types template struct POD @@ -151,52 +162,6 @@ namespace } \ }; - #include "testhookmangen.h" - - StateList g_States; - SourceHook::ISourceHook *g_SHPtr; - SourceHook::Plugin g_PLID; - - // PtrBuf(ptr) gives ptrs unique numbers - // in the order they appear - SourceHook::List g_PtrHash; - - bool g_Inside_LeafFunc = false; // inside a hook or a func - - template - int PtrBuf(T ptr) - { - int a = 0; - - const void *vptr = reinterpret_cast(ptr); - for (SourceHook::List::iterator iter = g_PtrHash.begin(); iter != g_PtrHash.end(); ++iter) - { - if (*iter == vptr) - return a; - else - ++a; - } - g_PtrHash.push_back(vptr); - return static_cast(g_PtrHash.size()) - 1; - } - - template - T PtrBufPtr(T ptr) - { - PtrBuf(ptr); - return ptr; - } - - void PtrBuf_Clear(int leave_in = 0) - { - for (SourceHook::List::iterator iter = g_PtrHash.begin(); iter != g_PtrHash.end();) - { - if (--leave_in < 0) - iter = g_PtrHash.erase(iter); - else - ++iter; - } - } // "Increment" something: (reproducible change for recall tests) @@ -250,6 +215,44 @@ namespace } }; + #include "testhookmangen.h" + + template + int PtrBuf(T ptr) + { + int a = 0; + + const void *vptr = reinterpret_cast(ptr); + for (SourceHook::List::iterator iter = g_PtrHash.begin(); iter != g_PtrHash.end(); ++iter) + { + if (*iter == vptr) + return a; + else + ++a; + } + g_PtrHash.push_back(vptr); + return static_cast(g_PtrHash.size()) - 1; + } + + template + T PtrBufPtr(T ptr) + { + PtrBuf(ptr); + return ptr; + } + + void PtrBuf_Clear(int leave_in = 0) + { + for (SourceHook::List::iterator iter = g_PtrHash.begin(); iter != g_PtrHash.end();) + { + if (--leave_in < 0) + iter = g_PtrHash.erase(iter); + else + ++iter; + } + } + + // MyDelegate base class for other delegates class MyDelegate : public SourceHook::ISHDelegate { @@ -879,4 +882,4 @@ bool TestCPageAlloc(std::string &error) memset((void*)test4[2], 0, ps / 4); return true; -} \ No newline at end of file +} diff --git a/sourcehook/test/testhookmangen.h b/sourcehook/test/testhookmangen.h index 3419315..cc8c831 100644 --- a/sourcehook/test/testhookmangen.h +++ b/sourcehook/test/testhookmangen.h @@ -43,7 +43,15 @@ void *FindFuncAddr(T mfp) if (sizeof(mfp) != sizeof(void*)) return NULL; else - return fastdelegate::detail::horrible_cast(mfp); + { + union + { + T a; + void *b; + } u; + u.a = mfp; + return u.b; + } } // Reference carrier @@ -166,7 +174,7 @@ struct ParamState1 int i; for (i = 0; i < incrsteps; ++i) - Increment::type>::Incr(m_1); + Increment::type >::Incr(m_1); return *this; @@ -202,10 +210,10 @@ struct ParamState2 int i; for (i = 0; i < incrsteps; ++i) - Increment::type>::Incr(m_1); + Increment::type >::Incr(m_1); for (i = 0; i < incrsteps; ++i) - Increment::type>::Incr(m_2); + Increment::type >::Incr(m_2); return *this; @@ -241,13 +249,13 @@ struct ParamState3 int i; for (i = 0; i < incrsteps; ++i) - Increment::type>::Incr(m_1); + Increment::type >::Incr(m_1); for (i = 0; i < incrsteps; ++i) - Increment::type>::Incr(m_2); + Increment::type >::Incr(m_2); for (i = 0; i < incrsteps; ++i) - Increment::type>::Incr(m_3); + Increment::type >::Incr(m_3); return *this; @@ -283,16 +291,16 @@ struct ParamState4 int i; for (i = 0; i < incrsteps; ++i) - Increment::type>::Incr(m_1); + Increment::type >::Incr(m_1); for (i = 0; i < incrsteps; ++i) - Increment::type>::Incr(m_2); + Increment::type >::Incr(m_2); for (i = 0; i < incrsteps; ++i) - Increment::type>::Incr(m_3); + Increment::type >::Incr(m_3); for (i = 0; i < incrsteps; ++i) - Increment::type>::Incr(m_4); + Increment::type >::Incr(m_4); return *this; @@ -328,19 +336,19 @@ struct ParamState5 int i; for (i = 0; i < incrsteps; ++i) - Increment::type>::Incr(m_1); + Increment::type >::Incr(m_1); for (i = 0; i < incrsteps; ++i) - Increment::type>::Incr(m_2); + Increment::type >::Incr(m_2); for (i = 0; i < incrsteps; ++i) - Increment::type>::Incr(m_3); + Increment::type >::Incr(m_3); for (i = 0; i < incrsteps; ++i) - Increment::type>::Incr(m_4); + Increment::type >::Incr(m_4); for (i = 0; i < incrsteps; ++i) - Increment::type>::Incr(m_5); + Increment::type >::Incr(m_5); return *this; @@ -376,22 +384,22 @@ struct ParamState6 int i; for (i = 0; i < incrsteps; ++i) - Increment::type>::Incr(m_1); + Increment::type >::Incr(m_1); for (i = 0; i < incrsteps; ++i) - Increment::type>::Incr(m_2); + Increment::type >::Incr(m_2); for (i = 0; i < incrsteps; ++i) - Increment::type>::Incr(m_3); + Increment::type >::Incr(m_3); for (i = 0; i < incrsteps; ++i) - Increment::type>::Incr(m_4); + Increment::type >::Incr(m_4); for (i = 0; i < incrsteps; ++i) - Increment::type>::Incr(m_5); + Increment::type >::Incr(m_5); for (i = 0; i < incrsteps; ++i) - Increment::type>::Incr(m_6); + Increment::type >::Incr(m_6); return *this; diff --git a/sourcehook/test/testhookmangen.hxx b/sourcehook/test/testhookmangen.hxx index 864973e..f633ebf 100644 --- a/sourcehook/test/testhookmangen.hxx +++ b/sourcehook/test/testhookmangen.hxx @@ -43,7 +43,15 @@ void *FindFuncAddr(T mfp) if (sizeof(mfp) != sizeof(void*)) return NULL; else - return fastdelegate::detail::horrible_cast(mfp); + { + union + { + T a; + void *b; + } u; + u.a = mfp; + return u.b; + } } // Reference carrier @@ -133,7 +141,7 @@ struct ParamState$1 @[$1!=0:int i;@] @[$2,1,$1: for (i = 0; i < incrsteps; ++i) - Increment::type>::Incr(m_$2); + Increment::type >::Incr(m_$2); @] return *this;