summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--build.bat88
-rw-r--r--include/cvinfo.h4
-rw-r--r--src/loader.c8
-rw-r--r--src/pdb.c2
-rw-r--r--src/utils.c6
5 files changed, 73 insertions, 35 deletions
diff --git a/build.bat b/build.bat
index 705d575..6b905af 100644
--- a/build.bat
+++ b/build.bat
@@ -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) {
diff --git a/src/pdb.c b/src/pdb.c
index 15ee4cf..1057f63 100644
--- a/src/pdb.c
+++ b/src/pdb.c
@@ -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) {