diff options
| -rw-r--r-- | build.bat | 88 | ||||
| -rw-r--r-- | include/cvinfo.h | 4 | ||||
| -rw-r--r-- | src/loader.c | 8 | ||||
| -rw-r--r-- | src/pdb.c | 2 | ||||
| -rw-r--r-- | src/utils.c | 6 |
5 files changed, 73 insertions, 35 deletions
@@ -9,53 +9,79 @@ set BUILD_DIR=build :: Clean directory IF EXIST %BUILD_DIR% rmdir %BUILD_DIR%\ /S /Q -mkdir build +mkdir %BUILD_DIR% -set VS2022_COM="C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat" -set VS2022_PRO="C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Auxiliary\Build\vcvars64.bat" - -if EXIST %VS2022_COM% ( - call %VS2022_COM% - goto compilation -) -if EXIST %VS2022_PRO% ( - call %VS2022_PRO% - goto compilation +set MSVC=1 +set CLANG=0 +set C_COMPILER=cl +set C_LINKER=link +if %MSVC% EQU 1 ( + if %CLANG% EQU 1 ( + set C_COMPILER=clang-cl + set C_LINKER=lld-link + ) +) else ( + set CLANG=1 + set C_COMPILER=clang + set C_LINKER=lld-link ) +if %MSVC% EQU 1 ( + REM set C_FLAGS=/DHASHMAP /nologo /W4 /WX /Zi /GS- /GR- /Gs1000000000 /Fo:%BUILD_DIR%\ /Iinclude /Isrc /std:c17 /c /Tc + set C_FLAGS=/nologo /W4 /WX /Zi /GS- /GR- /Gs1000000000 /Fo:%BUILD_DIR%\ /Iinclude /Isrc /std:c17 /c /Tc -:compilation -REM set C_FLAGS=/DHASHMAP /nologo /W4 /WX /Zi /GS- /GR- /Gs1000000000 /Fo:%BUILD_DIR%\ /Iinclude /Isrc /std:c17 /c /Tc -REM set C_FLAGS=/nologo /W4 /WX /Zi /GS- /GR- /Gs1000000000 /Fo:%BUILD_DIR%\ /Iinclude /Isrc /DDEBUG /std:clatest /c /Tc -set C_FLAGS=-fno-builtin -nostdlib -mno-stack-arg-probe --target=x86_64-pc-windows-msvc -Wall -Werror -pedantic -I include -std=c23 -Wno-msvc-not-found -Wno-microsoft-anon-tag -Wno-gnu-binary-literal -g -O0 -c -DDEBUG -REM set L_FLAGS=/WX /SUBSYSTEM:CONSOLE /NODEFAULTLIB /stack:0x100000,100000 -set L_FLAGS=/WX /SUBSYSTEM:CONSOLE /NODEFAULTLIB + set DEBUG_C_FLAGS=/DDEBUG /Od + set RELEASE_C_FLAGS=/DNDEBUG /O2 + set DEBUG_L_FLAGS=/DEBUG +) else ( + set C_FLAGS=-fno-builtin -nostdlib -mno-stack-arg-probe --target=x86_64-pc-windows-msvc -Wall -Werror -pedantic -I include -std=c23 -Wno-msvc-not-found -Wno-microsoft-anon-tag -Wno-gnu-binary-literal -g -O0 -c + + set DEBUG_C_FLAGS=-DDEBUG -g -O0 + set RELEASE_C_FLAGS=-DNDEBUG -O2 +) -if "%release%"=="0" ( - :: set C_FLAGS=/Od %C_FLAGS% - set L_FLAGS=/DEBUG %L_FLAGS% +if %RELEASE% EQU 0 ( + set C_FLAGS=%DEBUG_C_FLAGS% %C_FLAGS% + set L_FLAGS=%DEBUG_L_FLAGS% %L_FLAGS% + set SHADERS_C_FLAGS = -O0 -g %SHADERS_C_FLAGS% +) else ( + set C_FLAGS=%RELEASE_C_FLAGS% %C_FLAGS% + set SHADERS_C_FLAGS=-O %SHADERS_C_FLAGS% ) + +set L_FLAGS=/WX /SUBSYSTEM:CONSOLE /NODEFAULTLIB /stack:0x500000,500000 /DEBUG + set src=main utils events module parser pdb hashmap stack_walk disasm loader :: DBG :: Compile -(for %%s in (%src%) do ( - call set OBJS=%%OBJS%% %BUILD_DIR%\%%s.obj - clang -o %BUILD_DIR%\%%s.obj %C_FLAGS% src\%%s.c -)) -:: cl /Fd:%BUILD_DIR%\%%s.pdb %C_FLAGS% src\%%s.c +if %MSVC% EQU 1 ( + (for %%s in (%src%) do ( + call set OBJS=%%OBJS%% %BUILD_DIR%\%%s.obj + echo %C_COMPILER% /Fd:%BUILD_DIR%\%%s.pdb %C_FLAGS% src\%%s.c + %C_COMPILER% /Fd:%BUILD_DIR%\%%s.pdb %C_FLAGS% src\%%s.c + )) +) else ( + (for %%s in (%src%) do ( + call set OBJS=%%OBJS%% %BUILD_DIR%\%%s.obj + echo %C_COMPILER% -o %BUILD_DIR%\%%s.obj %C_FLAGS% src\%%s.c + %C_COMPILER% -o %BUILD_DIR%\%%s.obj %C_FLAGS% src\%%s.c + )) +) :: Link -REM link %L_FLAGS% /OUT:%BUILD_DIR%\main.exe %OBJS% kernel32.lib -lld-link %L_FLAGS% /OUT:%BUILD_DIR%\main.exe %OBJS% +echo %C_LINKER% %L_FLAGS% /OUT:%BUILD_DIR%\main.exe %OBJS% +%C_LINKER% %L_FLAGS% /OUT:%BUILD_DIR%\main.exe %OBJS% :: Test program set SRC_FILE=test :: Compile -REM cl /Fd:%BUILD_DIR%\%SRC_FILE%.pdb %C_FLAGS% src/%SRC_FILE%.c -clang -o %BUILD_DIR%\%SRC_FILE%.obj %C_FLAGS% src/%SRC_FILE%.c +if %MSVC% EQU 1 ( + %C_COMPILER% /Fd:%BUILD_DIR%\%SRC_FILE%.pdb %C_FLAGS% src/%SRC_FILE%.c +) else ( + %C_COMPILER% -o %BUILD_DIR%\%SRC_FILE%.obj %C_FLAGS% src/%SRC_FILE%.c +) :: Link -REM link %L_FLAGS% %BUILD_DIR%\%SRC_FILE%.obj /OUT:%BUILD_DIR%\%SRC_FILE%.exe kernel32.lib -lld-link %L_FLAGS% %BUILD_DIR%\%SRC_FILE%.obj /OUT:%BUILD_DIR%\%SRC_FILE%.exe +%C_LINKER% %L_FLAGS% %BUILD_DIR%\%SRC_FILE%.obj /OUT:%BUILD_DIR%\%SRC_FILE%.exe diff --git a/include/cvinfo.h b/include/cvinfo.h index 0f55ead..4b3fc78 100644 --- a/include/cvinfo.h +++ b/include/cvinfo.h @@ -4568,7 +4568,11 @@ typedef struct PDBMAP { // V7 line number data types // +#if __STDC_VERSION__ >= 202311L enum DEBUG_S_SUBSECTION_TYPE : i64 { +#else +enum DEBUG_S_SUBSECTION_TYPE { +#endif DEBUG_S_IGNORE = 0x80000000, // if this bit is set in a subsection type then ignore the subsection contents DEBUG_S_SYMBOLS = 0xf1, diff --git a/src/loader.c b/src/loader.c index 8f2ac28..2823a79 100644 --- a/src/loader.c +++ b/src/loader.c @@ -6,6 +6,12 @@ // ====== windows.h ====== // ======================= +#if defined(_MSC_VER) && !defined(__clang__) +#define offsetof(s,m) ((size_t)&(((s*)0)->m)) +#else +#define offsetof __builtin_offsetof +#endif + extern uint64_t __readgsqword(unsigned long offset); typedef struct _LIST_ENTRY { @@ -158,7 +164,7 @@ i32 wstr_cmpn(const u16* str1, const u16* str2, size_t count) { } PEB* get_PEB(void) { - return (PEB*)__readgsqword(__builtin_offsetof(TEB, ProcessEnvironmentBlock)); + return (PEB*)__readgsqword(offsetof(TEB, ProcessEnvironmentBlock)); } void* get_module(u16* name, size_t name_size) { @@ -182,7 +182,7 @@ // ======================== #if defined(_MSC_VER) && !defined(__clang__) - #define alloca + #define alloca _alloca #elif defined(__clang__) #define alloca __builtin_alloca #endif diff --git a/src/utils.c b/src/utils.c index 95a1d80..6de7c92 100644 --- a/src/utils.c +++ b/src/utils.c @@ -53,16 +53,18 @@ void str_cat(char* out, const char* str, size_t c_str) { } } -void memcpy(void* restrict dst, const void* restrict src, size_t size) { +void* memcpy(void* restrict dst, const void* restrict src, size_t size) { RtlCopyMemory(dst, src, size); + return dst; } -void memset(void* dst, int fill, size_t count) { +void* memset(void* dst, int fill, size_t count) { if (fill == 0) { RtlZeroMemory(dst, count); } else { RtlFillMemory(dst, count, fill); } + return dst; } void u64toa(u64 number, char* str, u32 base) { |
