Skip to content

Commit e0c1034

Browse files
committed
Attempt to fix github actions
1 parent 529012b commit e0c1034

File tree

2 files changed

+53
-28
lines changed

2 files changed

+53
-28
lines changed

thcrap/src/compiler_support.h

Lines changed: 44 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,15 @@
136136
#define __has_c_attribute(attr) 0
137137
#endif
138138

139+
// C attributes support namespaces according to the C2X
140+
// standard, but MSVC toolsets fail to parse namespaces
141+
// in that location anyway when not parsing as C++.
142+
#if !defined(__cplusplus) && (MSVC_COMPAT && !GCC_COMPAT && !CLANG_COMPAT && !MINGW_COMPAT && !ICC_COMPAT)
143+
#define __has_c_attribute_with_namespace(attr) 0
144+
#else
145+
#define __has_c_attribute_with_namespace(attr) __has_c_attribute(attr)
146+
#endif
147+
139148
// - GNU Attributes
140149
#ifndef __has_attribute
141150
#define __has_attribute(attr) 0
@@ -283,7 +292,7 @@
283292
// - [[likely]] Equivalent Attributes
284293
#if __has_cpp_attribute(likely) >= 201803L
285294
#define TH_LIKELY [[likely]]
286-
#elif __has_c_attribute(clang::likely)
295+
#elif __has_c_attribute_with_namespace(clang::likely)
287296
#define TH_LIKELY [[clang::likely]]
288297
#else
289298
#define TH_LIKELY
@@ -292,7 +301,7 @@
292301
// - [[unlikely]] Equivalent Attributes
293302
#if __has_cpp_attribute(unlikely) >= 201803L
294303
#define TH_UNLIKELY [[unlikely]]
295-
#elif __has_c_attribute(clang::unlikely)
304+
#elif __has_c_attribute_with_namespace(clang::unlikely)
296305
#define TH_UNLIKELY [[clang::unlikely]]
297306
#else
298307
#define TH_UNLIKELY
@@ -542,49 +551,59 @@ extern "C++" {
542551
#define read_fs_byte(offset) (*(uint8_t __attribute__((address_space(257)))*)((uintptr_t)offset))
543552
#define read_fs_word(offset) (*(uint16_t __attribute__((address_space(257)))*)((uintptr_t)offset))
544553
#define read_fs_dword(offset) (*(uint32_t __attribute__((address_space(257)))*)((uintptr_t)offset))
554+
#define read_fs_qword(offset) (*(uint64_t __attribute__((address_space(257)))*)((uintptr_t)offset))
545555
#define write_fs_byte(offset, data) ((void)(*(uint8_t __attribute__((address_space(257)))*)((uintptr_t)offset) = (uint8_t)(data)))
546556
#define write_fs_word(offset, data) ((void)(*(uint16_t __attribute__((address_space(257)))*)((uintptr_t)offset) = (uint16_t)(data)))
547557
#define write_fs_dword(offset, data) ((void)(*(uint32_t __attribute__((address_space(257)))*)((uintptr_t)offset) = (uint32_t)(data)))
548-
#elif defined(__SEG_FS) && (CLANG_COMPAT || !defined(__cplusplus)) // __seg_fs isn't recognized by GCC when compiling C++
558+
#define write_fs_qword(offset, data) ((void)(*(uint64_t __attribute__((address_space(257)))*)((uintptr_t)offset) = (uint64_t)(data)))
559+
#elif defined(__SEG_FS)
560+
#if CLANG_COMPAT || !defined(__cplusplus) // __seg_fs isn't recognized by GCC when compiling C++
549561
#define read_fs_byte(offset) (*(__seg_fs uint8_t*)((uintptr_t)offset))
550562
#define read_fs_word(offset) (*(__seg_fs uint16_t*)((uintptr_t)offset))
551563
#define read_fs_dword(offset) (*(__seg_fs uint32_t*)((uintptr_t)offset))
564+
#define read_fs_qword(offset) (*(__seg_fs uint64_t*)((uintptr_t)offset))
552565
#define write_fs_byte(offset, data) ((void)(*(__seg_fs uint8_t*)((uintptr_t)offset) = (uint8_t)(data)))
553566
#define write_fs_word(offset, data) ((void)(*(__seg_fs uint16_t*)((uintptr_t)offset) = (uint16_t)(data)))
554567
#define write_fs_dword(offset, data) ((void)(*(__seg_fs uint32_t*)((uintptr_t)offset) = (uint32_t)(data)))
555-
#elif GCC_COMPAT
556-
#ifdef __cplusplus
568+
#define write_fs_qword(offset, data) ((void)(*(__seg_fs uint64_t*)((uintptr_t)offset) = (uint64_t)(data)))
569+
#else
557570
extern "C" {
558-
#endif
559-
#define read_fs_byte(offset) read_fs_byte_gcc(offset)
560-
#define read_fs_word(offset) read_fs_word_gcc(offset)
561-
#define read_fs_dword(offset) read_fs_dword_gcc(offset)
562-
#define write_fs_byte(offset, data) write_fs_byte_gcc(offset, data)
563-
#define write_fs_word(offset, data) write_fs_word_gcc(offset, data)
564-
#define write_fs_dword(offset, data) write_fs_dword_gcc(offset, data)
565571
uint8_t read_fs_byte_gcc(size_t offset);
566572
uint16_t read_fs_word_gcc(size_t offset);
567573
uint32_t read_fs_dword_gcc(size_t offset);
574+
uint32_t read_fs_qword_gcc(size_t offset);
568575
void write_fs_byte_gcc(size_t offset, uint8_t data);
569576
void write_fs_word_gcc(size_t offset, uint16_t data);
570577
void write_fs_dword_gcc(size_t offset, uint32_t data);
571-
#ifdef __cplusplus
578+
void write_fs_qword_gcc(size_t offset, uint32_t data);
572579
};
580+
#define read_fs_byte(offset) read_fs_byte_gcc(offset)
581+
#define read_fs_word(offset) read_fs_word_gcc(offset)
582+
#define read_fs_dword(offset) read_fs_dword_gcc(offset)
583+
#define read_fs_qword(offset) read_fs_qword_gcc(offset)
584+
#define write_fs_byte(offset, data) write_fs_byte_gcc(offset, data)
585+
#define write_fs_word(offset, data) write_fs_word_gcc(offset, data)
586+
#define write_fs_dword(offset, data) write_fs_dword_gcc(offset, data)
587+
#define write_fs_qword(offset, data) write_fs_qword_gcc(offset, data)
573588
#endif
574589
#elif MSVC_COMPAT
575590
#define read_fs_byte(offset) __readfsbyte(offset)
576591
#define read_fs_word(offset) __readfsword(offset)
577592
#define read_fs_dword(offset) __readfsdword(offset)
593+
#define read_fs_qword(offset) __readfsqword(offset)
578594
#define write_fs_byte(offset, data) __writefsbyte(offset, data)
579595
#define write_fs_word(offset, data) __writefsword(offset, data)
580596
#define write_fs_dword(offset, data) __writefsdword(offset, data)
597+
#define write_fs_qword(offset, data) __writefsqword(offset, data)
581598
#else
582599
#define read_fs_byte(offset) (*(uint8_t*)((uintptr_t)offset))
583600
#define read_fs_word(offset) (*(uint16_t*)((uintptr_t)offset))
584601
#define read_fs_dword(offset) (*(uint32_t*)((uintptr_t)offset))
602+
#define read_fs_qword(offset) (*(uint64_t*)((uintptr_t)offset))
585603
#define write_fs_byte(offset, data) ((void)(*(uint8_t*)((uintptr_t)offset) = (uint8_t)(data)))
586604
#define write_fs_word(offset, data) ((void)(*(uint16_t*)((uintptr_t)offset) = (uint16_t)(data)))
587605
#define write_fs_dword(offset, data) ((void)(*(uint32_t*)((uintptr_t)offset) = (uint32_t)(data)))
606+
#define write_fs_qword(offset, data) ((void)(*(uint64_t*)((uintptr_t)offset) = (uint64_t)(data)))
588607
#endif
589608
#if __has_attribute(address_space)
590609
#define read_gs_byte(offset) (*(uint8_t __attribute__((address_space(256)))*)((uintptr_t)offset))
@@ -595,7 +614,8 @@ void write_fs_dword_gcc(size_t offset, uint32_t data);
595614
#define write_gs_word(offset, data) ((void)(*(uint16_t __attribute__((address_space(256)))*)((uintptr_t)offset) = (uint16_t)(data)))
596615
#define write_gs_dword(offset, data) ((void)(*(uint32_t __attribute__((address_space(256)))*)((uintptr_t)offset) = (uint32_t)(data)))
597616
#define write_gs_qword(offset, data) ((void)(*(uint64_t __attribute__((address_space(256)))*)((uintptr_t)offset) = (uint64_t)(data)))
598-
#elif defined(__SEG_GS) && (CLANG_COMPAT || !defined(__cplusplus)) // __seg_gs isn't recognized by GCC when compiling C++
617+
#elif defined(__SEG_GS)
618+
#if CLANG_COMPAT || !defined(__cplusplus) // __seg_gs isn't recognized by GCC when compiling C++
599619
#define read_gs_byte(offset) (*(__seg_gs uint8_t*)((uintptr_t)offset))
600620
#define read_gs_word(offset) (*(__seg_gs uint16_t*)((uintptr_t)offset))
601621
#define read_gs_dword(offset) (*(__seg_gs uint32_t*)((uintptr_t)offset))
@@ -604,18 +624,8 @@ void write_fs_dword_gcc(size_t offset, uint32_t data);
604624
#define write_gs_word(offset, data) ((void)(*(__seg_gs uint16_t*)((uintptr_t)offset) = (uint16_t)(data)))
605625
#define write_gs_dword(offset, data) ((void)(*(__seg_gs uint32_t*)((uintptr_t)offset) = (uint32_t)(data)))
606626
#define write_gs_qword(offset, data) ((void)(*(__seg_gs uint64_t*)((uintptr_t)offset) = (uint64_t)(data)))
607-
#elif GCC_COMPAT
608-
#ifdef __cplusplus
627+
#else
609628
extern "C" {
610-
#endif
611-
#define read_gs_byte(offset) read_gs_byte_gcc(offset)
612-
#define read_gs_word(offset) read_gs_word_gcc(offset)
613-
#define read_gs_dword(offset) read_gs_dword_gcc(offset)
614-
#define read_gs_qword(offset) read_gs_qword_gcc(offset)
615-
#define write_gs_byte(offset, data) write_gs_byte_gcc(offset, data)
616-
#define write_gs_word(offset, data) write_gs_word_gcc(offset, data)
617-
#define write_gs_dword(offset, data) write_gs_dword_gcc(offset, data)
618-
#define write_gs_qword(offset, data) write_gs_qword_gcc(offset, data)
619629
uint8_t read_gs_byte_gcc(size_t offset);
620630
uint16_t read_gs_word_gcc(size_t offset);
621631
uint32_t read_gs_dword_gcc(size_t offset);
@@ -624,8 +634,15 @@ void write_gs_byte_gcc(size_t offset, uint8_t data);
624634
void write_gs_word_gcc(size_t offset, uint16_t data);
625635
void write_gs_dword_gcc(size_t offset, uint32_t data);
626636
void write_gs_qword_gcc(size_t offset, uint64_t data);
627-
#ifdef __cplusplus
628637
};
638+
#define read_gs_byte(offset) read_gs_byte_gcc(offset)
639+
#define read_gs_word(offset) read_gs_word_gcc(offset)
640+
#define read_gs_dword(offset) read_gs_dword_gcc(offset)
641+
#define read_gs_qword(offset) read_gs_qword_gcc(offset)
642+
#define write_gs_byte(offset, data) write_gs_byte_gcc(offset, data)
643+
#define write_gs_word(offset, data) write_gs_word_gcc(offset, data)
644+
#define write_gs_dword(offset, data) write_gs_dword_gcc(offset, data)
645+
#define write_gs_qword(offset, data) write_gs_qword_gcc(offset, data)
629646
#endif
630647
#elif MSVC_COMPAT
631648
#define read_gs_byte(offset) __readgsbyte(offset)
@@ -647,7 +664,7 @@ void write_gs_qword_gcc(size_t offset, uint64_t data);
647664
#define write_gs_qword(offset, data) ((void)(*(uint64_t*)((uintptr_t)offset) = (uint64_t)(data)))
648665
#endif
649666

650-
#ifdef GCC_COMPAT
667+
#if GCC_COMPAT
651668
#ifndef __sptr
652669
#define __sptr
653670
#endif

thcrap/src/gcc_gs.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#include "compiler_support.h"
22

33
/*
4-
* This file is compiled in GCC in C mode - where __seg_gc works.
4+
* This file is compiled in GCC in C mode - where __seg_fs/__seg_gs works.
55
* So we'll juts use our C macro.
66
*/
77

@@ -20,6 +20,10 @@ uint32_t read_fs_dword_gcc(size_t offset)
2020
return read_fs_dword(offset);
2121
}
2222

23+
uint64_t read_fs_qword_gcc(size_t offset) {
24+
return read_fs_qword(offset);
25+
}
26+
2327
void write_fs_byte_gcc(size_t offset, uint8_t data)
2428
{
2529
write_fs_byte(offset, data);
@@ -35,6 +39,10 @@ void write_fs_dword_gcc(size_t offset, uint32_t data)
3539
write_fs_dword(offset, data);
3640
}
3741

42+
void write_fs_qword_gcc(size_t offset, uint64_t data) {
43+
write_fs_qword(offset, data);
44+
}
45+
3846
uint8_t read_gs_byte_gcc(size_t offset)
3947
{
4048
return read_gs_byte(offset);

0 commit comments

Comments
 (0)