diff --git a/appveyor.yml b/appveyor.yml
index 98da61dbf987652a76e4666eb41604c5e72bf6cb..b37bd1a650daf6704c40e0b9527be64e04e4f29d 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -92,8 +92,8 @@ before_build:
 - ccache -V
 - ccache -s
 - if [%NOUPX%] == [1] ( set "NOUPX=NOUPX=1" ) else ( set "NOUPX=" )
-- set "SRB2_MFLAGS=-C src WARNINGMODE=1 CCACHE=1 GCC72=1 NOOBJDUMP=1 %NOUPX%"
-- if [%X86_64%] == [1] ( set "MINGW_FLAGS=MINGW64=1 X86_64=1" ) else ( set "MINGW_FLAGS=MINGW=1" )
+- set "SRB2_MFLAGS=-C src WARNINGMODE=1 CCACHE=1 GCC73=1 NOOBJDUMP=1 %NOUPX%"
+- if [%X86_64%] == [1] ( set "MINGW_FLAGS=MINGW64=1 X86_64=1" ) else ( set "MINGW_FLAGS=MINGW=1 GCC91=1" )
 - set "SRB2_MFLAGS=%SRB2_MFLAGS% %MINGW_FLAGS% %CONFIGURATION%=1"
 
 build_script:
diff --git a/src/Makefile.cfg b/src/Makefile.cfg
index a0398154a5c14a80b0e408c1413e4f48597cac74..c69fcd57d539f731e1ea191e4caaad6cbd282037 100644
--- a/src/Makefile.cfg
+++ b/src/Makefile.cfg
@@ -7,11 +7,19 @@
 # and other things
 #
 
-ifdef GCC81
-GCC80=1
+ifdef GCC91
+GCC83=1
+endif
+
+ifdef GCC83
+GCC82=1
+endif
+
+ifdef GCC82
+GCC81=1
 endif
 
-ifdef GCC80
+ifdef GCC81
 GCC72=1
 endif
 
@@ -146,6 +154,9 @@ ifdef GCC43
 endif
 endif
  WFLAGS+=-Wsign-compare
+ifdef GCC91
+ WFLAGS+=-Wno-error=address-of-packed-member
+endif
 ifdef GCC45
  WFLAGS+=-Wlogical-op
 endif
@@ -186,6 +197,9 @@ ifndef GCC295
 endif
 endif
 WFLAGS+=-Wformat-y2k
+ifdef GCC71
+WFLAGS+=-Wno-error=format-overflow=2
+endif
 WFLAGS+=-Wformat-security
 ifndef GCC29
 #WFLAGS+=-Winit-self
@@ -223,7 +237,7 @@ ifdef GCC71
  WFLAGS+=-Wno-error=implicit-fallthrough
  WFLAGS+=-Wno-implicit-fallthrough
 endif
-ifdef GCC80
+ifdef GCC81
  WFLAGS+=-Wno-error=format-overflow
  WFLAGS+=-Wno-error=stringop-truncation
  WFLAGS+=-Wno-error=stringop-overflow
diff --git a/src/i_addrinfo.c b/src/i_addrinfo.c
index 03edf732de7a5e91d0359e94fc7dbe4626e36a59..42d4b8924308e6d7b43d200bf6bcd4b7f7b7cef8 100644
--- a/src/i_addrinfo.c
+++ b/src/i_addrinfo.c
@@ -74,10 +74,10 @@ static int inet_aton(const char *cp, struct in_addr *addr)
 
 #ifdef USE_WINSOCK2
 static HMODULE ipv6dll = NULL;
-typedef int (WSAAPI *p_getaddrinfo) (const char *node, const char *service,
-                              const struct my_addrinfo *hints,
-                              struct my_addrinfo **res);
-typedef void (WSAAPI *p_freeaddrinfo) (struct my_addrinfo *res);
+typedef int (WSAAPI *p_getaddrinfo) (const char *, const char *,
+                                     const struct my_addrinfo *,
+                                     struct my_addrinfo **);
+typedef void (WSAAPI *p_freeaddrinfo) (struct my_addrinfo *);
 
 static p_getaddrinfo WS_getaddrinfo = NULL;
 static p_freeaddrinfo WS_freeaddrinfo = NULL;
@@ -86,10 +86,10 @@ static HMODULE WS_getfunctions(HMODULE tmp)
 {
 	if (tmp != NULL)
 	{
-		WS_getaddrinfo = (p_getaddrinfo)GetProcAddress(tmp, "getaddrinfo");
+		WS_getaddrinfo = (p_getaddrinfo)(LPVOID)GetProcAddress(tmp, "getaddrinfo");
 		if (WS_getaddrinfo == NULL)
 			return NULL;
-		WS_freeaddrinfo = (p_freeaddrinfo)GetProcAddress(tmp, "freeaddrinfo");
+		WS_freeaddrinfo = (p_freeaddrinfo)(LPVOID)GetProcAddress(tmp, "freeaddrinfo");
 		if (WS_freeaddrinfo == NULL)
 		{
 			WS_getaddrinfo = NULL;
diff --git a/src/m_misc.c b/src/m_misc.c
index 0445136fe06d5facd7c064d2f05c5ae5ab3af3cc..c5e4fa21cadfa0fd46a6f0c188c839b4a778a867 100644
--- a/src/m_misc.c
+++ b/src/m_misc.c
@@ -58,7 +58,7 @@ typedef off_t off64_t;
 #endif
 #endif
 
-#if defined(__MINGW32__) && ((__GNUC__ > 7) || (__GNUC__ == 6 && __GNUC_MINOR__ >= 3))
+#if defined(__MINGW32__) && ((__GNUC__ > 7) || (__GNUC__ == 6 && __GNUC_MINOR__ >= 3)) && (__GNUC__ < 8)
 #define PRIdS "u"
 #elif defined (_WIN32)
 #define PRIdS "Iu"
diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c
index 517c183ee144019fcb32384aef779c5f40cbf005..a18443c522b82818310ad0543cac3f15d171e3e9 100644
--- a/src/sdl/i_system.c
+++ b/src/sdl/i_system.c
@@ -1480,7 +1480,7 @@ const char *I_GetJoyName(INT32 joyindex)
 		{
 			tempname = SDL_JoystickNameForIndex(joyindex);
 			if (tempname)
-				strncpy(joyname, tempname, 255);
+				strncpy(joyname, tempname, 254);
 		}
 		SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
 	}
@@ -1488,7 +1488,7 @@ const char *I_GetJoyName(INT32 joyindex)
 	{
 		tempname = SDL_JoystickNameForIndex(joyindex);
 		if (tempname)
-			strncpy(joyname, tempname, 255);
+			strncpy(joyname, tempname, 254);
 	}
 	return joyname;
 }
@@ -2043,7 +2043,7 @@ static void I_ShutdownTimer(void)
 	pfntimeGetTime = NULL;
 	if (winmm)
 	{
-		p_timeEndPeriod pfntimeEndPeriod = (p_timeEndPeriod)GetProcAddress(winmm, "timeEndPeriod");
+		p_timeEndPeriod pfntimeEndPeriod = (p_timeEndPeriod)(LPVOID)GetProcAddress(winmm, "timeEndPeriod");
 		if (pfntimeEndPeriod)
 			pfntimeEndPeriod(1);
 		FreeLibrary(winmm);
@@ -2088,10 +2088,10 @@ void I_StartupTimer(void)
 	winmm = LoadLibraryA("winmm.dll");
 	if (winmm)
 	{
-		p_timeEndPeriod pfntimeBeginPeriod = (p_timeEndPeriod)GetProcAddress(winmm, "timeBeginPeriod");
+		p_timeEndPeriod pfntimeBeginPeriod = (p_timeEndPeriod)(LPVOID)GetProcAddress(winmm, "timeBeginPeriod");
 		if (pfntimeBeginPeriod)
 			pfntimeBeginPeriod(1);
-		pfntimeGetTime = (p_timeGetTime)GetProcAddress(winmm, "timeGetTime");
+		pfntimeGetTime = (p_timeGetTime)(LPVOID)GetProcAddress(winmm, "timeGetTime");
 	}
 	I_AddExitFunc(I_ShutdownTimer);
 #endif
@@ -2390,7 +2390,7 @@ void I_GetDiskFreeSpace(INT64 *freespace)
 
 	if (!testwin95)
 	{
-		pfnGetDiskFreeSpaceEx = (p_GetDiskFreeSpaceExA)GetProcAddress(GetModuleHandleA("kernel32.dll"), "GetDiskFreeSpaceExA");
+		pfnGetDiskFreeSpaceEx = (p_GetDiskFreeSpaceExA)(LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "GetDiskFreeSpaceExA");
 		testwin95 = true;
 	}
 	if (pfnGetDiskFreeSpaceEx)
@@ -2414,7 +2414,7 @@ void I_GetDiskFreeSpace(INT64 *freespace)
 
 char *I_GetUserName(void)
 {
-	static char username[MAXPLAYERNAME];
+	static char username[MAXPLAYERNAME+1];
 	char *p;
 #ifdef _WIN32
 	DWORD i = MAXPLAYERNAME;
@@ -2910,7 +2910,7 @@ const CPUInfoFlags *I_CPUInfo(void)
 #if defined (_WIN32)
 	static CPUInfoFlags WIN_CPUInfo;
 	SYSTEM_INFO SI;
-	p_IsProcessorFeaturePresent pfnCPUID = (p_IsProcessorFeaturePresent)GetProcAddress(GetModuleHandleA("kernel32.dll"), "IsProcessorFeaturePresent");
+	p_IsProcessorFeaturePresent pfnCPUID = (p_IsProcessorFeaturePresent)(LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "IsProcessorFeaturePresent");
 
 	ZeroMemory(&WIN_CPUInfo,sizeof (WIN_CPUInfo));
 	if (pfnCPUID)
diff --git a/src/sdl/mixer_sound.c b/src/sdl/mixer_sound.c
index 045e82b15cf4930f706be444fce10b805a14eae8..6e92a6f0ba3ee8cfe49119473c56d79171f750db 100644
--- a/src/sdl/mixer_sound.c
+++ b/src/sdl/mixer_sound.c
@@ -98,8 +98,8 @@ static INT32 current_track;
 
 static void var_cleanup(void)
 {
-	loop_point = song_length =\
-	 music_bytes = fading_source = fading_target =\
+	song_length = loop_point = 0.0f;
+	music_bytes = fading_source = fading_target =\
 	 fading_timer = fading_duration = 0;
 
 	songpaused = is_looping =\
@@ -362,7 +362,7 @@ void *I_GetSfx(sfxinfo_t *sfx)
 					gme_track_info(emu, &info, 0);
 
 					len = (info->play_length * 441 / 10) << 2;
-					mem = malloc(len);
+					mem = Z_Malloc(len, PU_SOUND, 0);
 					gme_play(emu, len >> 1, mem);
 					gme_free_info(info);
 					gme_delete(emu);
@@ -435,7 +435,7 @@ void *I_GetSfx(sfxinfo_t *sfx)
 		gme_track_info(emu, &info, 0);
 
 		len = (info->play_length * 441 / 10) << 2;
-		mem = malloc(len);
+		mem = Z_Malloc(len, PU_SOUND, 0);
 		gme_play(emu, len >> 1, mem);
 		gme_free_info(info);
 		gme_delete(emu);
@@ -569,7 +569,7 @@ static void music_loop(void)
 	{
 		Mix_PlayMusic(music, 0);
 		Mix_SetMusicPosition(loop_point);
-		music_bytes = loop_point*44100.0L*4; //assume 44.1khz, 4-byte length (see I_GetSongPosition)
+		music_bytes = (UINT32)(loop_point*44100.0L*4); //assume 44.1khz, 4-byte length (see I_GetSongPosition)
 	}
 	else
 		I_StopSong();
@@ -843,7 +843,7 @@ boolean I_SetSongPosition(UINT32 position)
 
 		Mix_RewindMusic(); // needed for mp3
 		if(Mix_SetMusicPosition((float)(position/1000.0L)) == 0)
-			music_bytes = position/1000.0L*44100.0L*4; //assume 44.1khz, 4-byte length (see I_GetSongPosition)
+			music_bytes = (UINT32)(position/1000.0L*44100.0L*4); //assume 44.1khz, 4-byte length (see I_GetSongPosition)
 		else
 			// NOTE: This block fires on incorrect song format,
 			// NOT if position input is greater than song length.
@@ -887,7 +887,7 @@ UINT32 I_GetSongPosition(void)
 	if (!music || I_SongType() == MU_MID)
 		return 0;
 	else
-		return music_bytes/44100.0L*1000.0L/4; //assume 44.1khz
+		return (UINT32)(music_bytes/44100.0L*1000.0L/4); //assume 44.1khz
 		// 4 = byte length for 16-bit samples (AUDIO_S16SYS), stereo (2-channel)
 		// This is hardcoded in I_StartupSound. Other formats for factor:
 		// 8M: 1 | 8S: 2 | 16M: 2 | 16S: 4
diff --git a/src/win32/Makefile.cfg b/src/win32/Makefile.cfg
index 1880abf18bcdc5c686c32a2199aeaa08150eba07..73d23660409f1d1726f8f0d33949663dc22d9263 100644
--- a/src/win32/Makefile.cfg
+++ b/src/win32/Makefile.cfg
@@ -36,10 +36,6 @@ ifndef GCC44
 	#OPTS+=-mms-bitfields
 endif
 
-ifndef MINGW64
-	OPTS+=-gdwarf-2
-endif
-
 ifndef SDL
 	OPTS+=-D_WINDOWS
 endif
diff --git a/src/win32/fabdxlib.c b/src/win32/fabdxlib.c
index c19b036a0863cf1394c0548218e83d518afbadd2..45ec5d0d321914916d8137204ac26e3a0377bba4 100644
--- a/src/win32/fabdxlib.c
+++ b/src/win32/fabdxlib.c
@@ -147,7 +147,7 @@ static inline BOOL LoadDirectDraw(VOID)
 	DDrawDLL = LoadLibraryA("DDRAW.DLL");
 	if (DDrawDLL == NULL)
 		return false;
-	pfnDirectDrawCreate = (DDCreate)GetProcAddress(DDrawDLL, "DirectDrawCreate");
+	pfnDirectDrawCreate = (DDCreate)(LPVOID)GetProcAddress(DDrawDLL, "DirectDrawCreate");
 	if (pfnDirectDrawCreate == NULL)
 		return false;
 	return true;
diff --git a/src/win32/win_sys.c b/src/win32/win_sys.c
index 8b7adf7c62fc9fe5e243c3f8feba3b2d29d3a8c2..d10f73b587e521ca1dfbd2ced7b46e381d78600a 100644
--- a/src/win32/win_sys.c
+++ b/src/win32/win_sys.c
@@ -3395,7 +3395,7 @@ BOOL LoadDirectInput(VOID)
 	DInputDLL = LoadLibraryA("DINPUT.DLL");
 	if (DInputDLL == NULL)
 		return false;
-	pfnDirectInputCreateA = (DICreateA)GetProcAddress(DInputDLL, "DirectInputCreateA");
+	pfnDirectInputCreateA = (DICreateA)(LPVOID)GetProcAddress(DInputDLL, "DirectInputCreateA");
 	if (pfnDirectInputCreateA == NULL)
 		return false;
 	return true;
@@ -3529,7 +3529,7 @@ void I_GetDiskFreeSpace(INT64* freespace)
 
 	if (!testwin95)
 	{
-		pfnGetDiskFreeSpaceEx = (p_GetDiskFreeSpaceExA)GetProcAddress(GetModuleHandleA("kernel32.dll"), "GetDiskFreeSpaceExA");
+		pfnGetDiskFreeSpaceEx = (p_GetDiskFreeSpaceExA)(LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "GetDiskFreeSpaceExA");
 		testwin95 = true;
 	}
 	if (pfnGetDiskFreeSpaceEx)
@@ -3615,7 +3615,7 @@ const CPUInfoFlags *I_CPUInfo(void)
 {
 	static CPUInfoFlags WIN_CPUInfo;
 	SYSTEM_INFO SI;
-	p_IsProcessorFeaturePresent pfnCPUID = (p_IsProcessorFeaturePresent)GetProcAddress(GetModuleHandleA("kernel32.dll"), "IsProcessorFeaturePresent");
+	p_IsProcessorFeaturePresent pfnCPUID = (p_IsProcessorFeaturePresent)(LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "IsProcessorFeaturePresent");
 
 	ZeroMemory(&WIN_CPUInfo,sizeof (WIN_CPUInfo));
 	if (pfnCPUID)
@@ -3658,9 +3658,9 @@ static p_SetProcessAffinityMask pfnSetProcessAffinityMask = NULL;
 static inline VOID GetAffinityFuncs(VOID)
 {
 	HMODULE h = GetModuleHandleA("kernel32.dll");
-	pfnGetCurrentProcess = (p_GetCurrentProcess)GetProcAddress(h, "GetCurrentProcess");
-	pfnGetProcessAffinityMask = (p_GetProcessAffinityMask)GetProcAddress(h, "GetProcessAffinityMask");
-	pfnSetProcessAffinityMask = (p_SetProcessAffinityMask)GetProcAddress(h, "SetProcessAffinityMask");
+	pfnGetCurrentProcess = (p_GetCurrentProcess)(LPVOID)GetProcAddress(h, "GetCurrentProcess");
+	pfnGetProcessAffinityMask = (p_GetProcessAffinityMask)(LPVOID)GetProcAddress(h, "GetProcessAffinityMask");
+	pfnSetProcessAffinityMask = (p_SetProcessAffinityMask)(LPVOID)GetProcAddress(h, "SetProcessAffinityMask");
 }
 
 static void CPUAffinity_OnChange(void)