1
0
mirror of https://github.com/alliedmodders/metamod-source.git synced 2025-01-18 07:52:32 +01:00

Fixed crashes in code generated by SourceHook's HookManGen on Mac OS X (bug 3514, r=dvander).

This fixes two problems:
1) On OS X structures/objects with sizes of 1, 2, 4, or 8 are returned from functions in registers, not memory addresses.
2) A function returning anything which was 8 bytes in size was crashing. This problem affected all compilers/operating systems.
This commit is contained in:
Scott Ehlert 2009-11-24 07:33:52 -06:00
parent 2e4b4c9f62
commit d1e8ae40af
2 changed files with 19 additions and 7 deletions

View File

@ -1,5 +1,5 @@
/* ======== SourceHook ========
* Copyright (C) 2004-2008 Metamod:Source Development Team
* Copyright (C) 2004-2009 Metamod:Source Development Team
* No warranties of any kind
*
* License: zlib/libpng
@ -873,7 +873,7 @@ namespace SourceHook
// mov eax, [ecx]
// mov edx, [ecx+4]
IA32_Mov_Reg_Rm(&m_HookFunc, REG_EAX, REG_ECX, MOD_MEM_REG);
IA32_Mov_Reg_Rm_DispAuto(&m_HookFunc, REG_EAX, REG_ECX, 4);
IA32_Mov_Reg_Rm_DispAuto(&m_HookFunc, REG_EDX, REG_ECX, 4);
}
else
{
@ -1869,8 +1869,18 @@ namespace SourceHook
// MSVC seems to return _all_ structs, classes, unions in memory
pi.flags |= PassInfo::PassFlag_RetMem;
#elif SH_COMP == SH_COMP_GCC
// Same goes for GCC :)
pi.flags |= PassInfo::PassFlag_RetMem;
#if SH_SYS == SH_SYS_APPLE
// Apple GCC returns in memory if size isn't a power of 2 or > 8
if ((pi.size & (pi.size - 1)) == 0 && pi.size <= 8)
{
pi.flags |= PassInfo::PassFlag_RetReg;
}
else
#endif
{
// GCC on Linux does same thing as MSVC
pi.flags |= PassInfo::PassFlag_RetMem;
}
#endif
}
}

View File

@ -1,4 +1,4 @@
#(C)2004-2008 SourceMM Development Team
# (C)2004-2009 Metamod:Source Development Team
# Makefile written by David "BAILOPAN" Anderson and Pavol Marko
OPT_FLAGS = -O3 -funroll-loops -s -pipe
@ -9,7 +9,7 @@ INCLUDE = -I. -I..
MAX_PARAMS=20
BINARY = sourcehook_test
OBJECTS = main.cpp sourcehook.cpp ../sourcehook_hookmangen.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"
@ -46,10 +46,12 @@ debug:
all:
mkdir -p $(BIN_DIR)
ln -sf ../sourcehook.cpp sourcehook.cpp
ln -sf ../sourcehook.cpp
ln -sf ../sourcehook_hookmangen.cpp
$(MAKE) $(BINARY)
rm -f $(BINARY)
rm -f sourcehook.cpp
rm -f sourcehook_hookmangen.cpp
ln -sf $(BIN_DIR)/$(BINARY) $(BINARY)