Skip to content

Commit 176940b

Browse files
mikdusanandrewrk
authored andcommitted
zig.h: do not assume __GNUC__ is not clang
A followup to 5bd69c6 . For compatibility purposes clang defines __GNUC__. This broke logic where clang14 __has_builtin returns false but `|| defined(__GNUC__)` made it true. CI did not catch this because it uses clang15. However, bootstrapping with latest apple compiler is clang14. We also want to support older clang.
1 parent 1878bdf commit 176940b

File tree

1 file changed

+45
-39
lines changed

1 file changed

+45
-39
lines changed

lib/zig.h

Lines changed: 45 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,19 @@ typedef char bool;
4444
#define zig_threadlocal zig_threadlocal_unavailable
4545
#endif
4646

47+
#if defined(__clang__)
48+
#define zig_clang
49+
#elif defined(__GNUC__)
50+
#define zig_gnuc
51+
#endif
52+
4753
#if _MSC_VER
4854
#define zig_const_arr
4955
#else
5056
#define zig_const_arr static const
5157
#endif
5258

53-
#if zig_has_attribute(naked) || defined(__GNUC__)
59+
#if zig_has_attribute(naked) || defined(zig_gnuc)
5460
#define zig_naked __attribute__((naked))
5561
#elif defined(_MSC_VER)
5662
#define zig_naked __declspec(naked)
@@ -90,7 +96,7 @@ typedef char bool;
9096
#define zig_align_fn zig_align_fn_unavailable
9197
#endif
9298

93-
#if zig_has_builtin(unreachable) || defined(__GNUC__)
99+
#if zig_has_builtin(unreachable) || defined(zig_gnuc)
94100
#define zig_unreachable() __builtin_unreachable()
95101
#else
96102
#define zig_unreachable()
@@ -113,7 +119,7 @@ typedef char bool;
113119

114120
#if zig_has_builtin(debugtrap)
115121
#define zig_breakpoint() __builtin_debugtrap()
116-
#elif zig_has_builtin(trap) || defined(__GNUC__)
122+
#elif zig_has_builtin(trap) || defined(zig_gnuc)
117123
#define zig_breakpoint() __builtin_trap()
118124
#elif defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__)
119125
#define zig_breakpoint() __debugbreak()
@@ -123,21 +129,21 @@ typedef char bool;
123129
#define zig_breakpoint() raise(SIGTRAP)
124130
#endif
125131

126-
#if zig_has_builtin(return_address) || defined(__GNUC__)
132+
#if zig_has_builtin(return_address) || defined(zig_gnuc)
127133
#define zig_return_address() __builtin_extract_return_addr(__builtin_return_address(0))
128134
#elif defined(_MSC_VER)
129135
#define zig_return_address() _ReturnAddress()
130136
#else
131137
#define zig_return_address() 0
132138
#endif
133139

134-
#if zig_has_builtin(frame_address) || defined(__GNUC__)
140+
#if zig_has_builtin(frame_address) || defined(zig_gnuc)
135141
#define zig_frame_address() __builtin_frame_address(0)
136142
#else
137143
#define zig_frame_address() 0
138144
#endif
139145

140-
#if zig_has_builtin(prefetch) || defined(__GNUC__)
146+
#if zig_has_builtin(prefetch) || defined(zig_gnuc)
141147
#define zig_prefetch(addr, rw, locality) __builtin_prefetch(addr, rw, locality)
142148
#else
143149
#define zig_prefetch(addr, rw, locality)
@@ -242,7 +248,7 @@ typedef char bool;
242248

243249
#if __STDC_VERSION__ >= 201112L
244250
#define zig_noreturn _Noreturn void
245-
#elif zig_has_attribute(noreturn) || defined(__GNUC__)
251+
#elif zig_has_attribute(noreturn) || defined(zig_gnuc)
246252
#define zig_noreturn __attribute__((noreturn)) void
247253
#elif _MSC_VER
248254
#define zig_noreturn __declspec(noreturn) void
@@ -412,7 +418,7 @@ zig_int_helpers(32)
412418
zig_int_helpers(64)
413419

414420
static inline bool zig_addo_u32(zig_u32 *res, zig_u32 lhs, zig_u32 rhs, zig_u8 bits) {
415-
#if zig_has_builtin(add_overflow) || defined(__GNUC__)
421+
#if zig_has_builtin(add_overflow) || defined(zig_gnuc)
416422
zig_u32 full_res;
417423
bool overflow = __builtin_add_overflow(lhs, rhs, &full_res);
418424
*res = zig_wrap_u32(full_res, bits);
@@ -431,7 +437,7 @@ static inline void zig_vaddo_u32(zig_u8 *ov, zig_u32 *res, int n,
431437

432438
zig_extern zig_i32 __addosi4(zig_i32 lhs, zig_i32 rhs, zig_c_int *overflow);
433439
static inline bool zig_addo_i32(zig_i32 *res, zig_i32 lhs, zig_i32 rhs, zig_u8 bits) {
434-
#if zig_has_builtin(add_overflow) || defined(__GNUC__)
440+
#if zig_has_builtin(add_overflow) || defined(zig_gnuc)
435441
zig_i32 full_res;
436442
bool overflow = __builtin_add_overflow(lhs, rhs, &full_res);
437443
#else
@@ -450,7 +456,7 @@ static inline void zig_vaddo_i32(zig_u8 *ov, zig_i32 *res, int n,
450456
}
451457

452458
static inline bool zig_addo_u64(zig_u64 *res, zig_u64 lhs, zig_u64 rhs, zig_u8 bits) {
453-
#if zig_has_builtin(add_overflow) || defined(__GNUC__)
459+
#if zig_has_builtin(add_overflow) || defined(zig_gnuc)
454460
zig_u64 full_res;
455461
bool overflow = __builtin_add_overflow(lhs, rhs, &full_res);
456462
*res = zig_wrap_u64(full_res, bits);
@@ -469,7 +475,7 @@ static inline void zig_vaddo_u64(zig_u8 *ov, zig_u64 *res, int n,
469475

470476
zig_extern zig_i64 __addodi4(zig_i64 lhs, zig_i64 rhs, zig_c_int *overflow);
471477
static inline bool zig_addo_i64(zig_i64 *res, zig_i64 lhs, zig_i64 rhs, zig_u8 bits) {
472-
#if zig_has_builtin(add_overflow) || defined(__GNUC__)
478+
#if zig_has_builtin(add_overflow) || defined(zig_gnuc)
473479
zig_i64 full_res;
474480
bool overflow = __builtin_add_overflow(lhs, rhs, &full_res);
475481
#else
@@ -488,7 +494,7 @@ static inline void zig_vaddo_i64(zig_u8 *ov, zig_i64 *res, int n,
488494
}
489495

490496
static inline bool zig_addo_u8(zig_u8 *res, zig_u8 lhs, zig_u8 rhs, zig_u8 bits) {
491-
#if zig_has_builtin(add_overflow) || defined(__GNUC__)
497+
#if zig_has_builtin(add_overflow) || defined(zig_gnuc)
492498
zig_u8 full_res;
493499
bool overflow = __builtin_add_overflow(lhs, rhs, &full_res);
494500
*res = zig_wrap_u8(full_res, bits);
@@ -508,7 +514,7 @@ static inline void zig_vaddo_u8(zig_u8 *ov, zig_u8 *res, int n,
508514
}
509515

510516
static inline bool zig_addo_i8(zig_i8 *res, zig_i8 lhs, zig_i8 rhs, zig_u8 bits) {
511-
#if zig_has_builtin(add_overflow) || defined(__GNUC__)
517+
#if zig_has_builtin(add_overflow) || defined(zig_gnuc)
512518
zig_i8 full_res;
513519
bool overflow = __builtin_add_overflow(lhs, rhs, &full_res);
514520
*res = zig_wrap_i8(full_res, bits);
@@ -528,7 +534,7 @@ static inline void zig_vaddo_i8(zig_u8 *ov, zig_i8 *res, int n,
528534
}
529535

530536
static inline bool zig_addo_u16(zig_u16 *res, zig_u16 lhs, zig_u16 rhs, zig_u8 bits) {
531-
#if zig_has_builtin(add_overflow) || defined(__GNUC__)
537+
#if zig_has_builtin(add_overflow) || defined(zig_gnuc)
532538
zig_u16 full_res;
533539
bool overflow = __builtin_add_overflow(lhs, rhs, &full_res);
534540
*res = zig_wrap_u16(full_res, bits);
@@ -548,7 +554,7 @@ static inline void zig_vaddo_u16(zig_u8 *ov, zig_u16 *res, int n,
548554
}
549555

550556
static inline bool zig_addo_i16(zig_i16 *res, zig_i16 lhs, zig_i16 rhs, zig_u8 bits) {
551-
#if zig_has_builtin(add_overflow) || defined(__GNUC__)
557+
#if zig_has_builtin(add_overflow) || defined(zig_gnuc)
552558
zig_i16 full_res;
553559
bool overflow = __builtin_add_overflow(lhs, rhs, &full_res);
554560
*res = zig_wrap_i16(full_res, bits);
@@ -568,7 +574,7 @@ static inline void zig_vaddo_i16(zig_u8 *ov, zig_i16 *res, int n,
568574
}
569575

570576
static inline bool zig_subo_u32(zig_u32 *res, zig_u32 lhs, zig_u32 rhs, zig_u8 bits) {
571-
#if zig_has_builtin(sub_overflow) || defined(__GNUC__)
577+
#if zig_has_builtin(sub_overflow) || defined(zig_gnuc)
572578
zig_u32 full_res;
573579
bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res);
574580
*res = zig_wrap_u32(full_res, bits);
@@ -587,7 +593,7 @@ static inline void zig_vsubo_u32(zig_u8 *ov, zig_u32 *res, int n,
587593

588594
zig_extern zig_i32 __subosi4(zig_i32 lhs, zig_i32 rhs, zig_c_int *overflow);
589595
static inline bool zig_subo_i32(zig_i32 *res, zig_i32 lhs, zig_i32 rhs, zig_u8 bits) {
590-
#if zig_has_builtin(sub_overflow) || defined(__GNUC__)
596+
#if zig_has_builtin(sub_overflow) || defined(zig_gnuc)
591597
zig_i32 full_res;
592598
bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res);
593599
#else
@@ -606,7 +612,7 @@ static inline void zig_vsubo_i32(zig_u8 *ov, zig_i32 *res, int n,
606612
}
607613

608614
static inline bool zig_subo_u64(zig_u64 *res, zig_u64 lhs, zig_u64 rhs, zig_u8 bits) {
609-
#if zig_has_builtin(sub_overflow) || defined(__GNUC__)
615+
#if zig_has_builtin(sub_overflow) || defined(zig_gnuc)
610616
zig_u64 full_res;
611617
bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res);
612618
*res = zig_wrap_u64(full_res, bits);
@@ -625,7 +631,7 @@ static inline void zig_vsubo_u64(zig_u8 *ov, zig_u64 *res, int n,
625631

626632
zig_extern zig_i64 __subodi4(zig_i64 lhs, zig_i64 rhs, zig_c_int *overflow);
627633
static inline bool zig_subo_i64(zig_i64 *res, zig_i64 lhs, zig_i64 rhs, zig_u8 bits) {
628-
#if zig_has_builtin(sub_overflow) || defined(__GNUC__)
634+
#if zig_has_builtin(sub_overflow) || defined(zig_gnuc)
629635
zig_i64 full_res;
630636
bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res);
631637
#else
@@ -644,7 +650,7 @@ static inline void zig_vsubo_i64(zig_u8 *ov, zig_i64 *res, int n,
644650
}
645651

646652
static inline bool zig_subo_u8(zig_u8 *res, zig_u8 lhs, zig_u8 rhs, zig_u8 bits) {
647-
#if zig_has_builtin(sub_overflow) || defined(__GNUC__)
653+
#if zig_has_builtin(sub_overflow) || defined(zig_gnuc)
648654
zig_u8 full_res;
649655
bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res);
650656
*res = zig_wrap_u8(full_res, bits);
@@ -664,7 +670,7 @@ static inline void zig_vsubo_u8(zig_u8 *ov, zig_u8 *res, int n,
664670
}
665671

666672
static inline bool zig_subo_i8(zig_i8 *res, zig_i8 lhs, zig_i8 rhs, zig_u8 bits) {
667-
#if zig_has_builtin(sub_overflow) || defined(__GNUC__)
673+
#if zig_has_builtin(sub_overflow) || defined(zig_gnuc)
668674
zig_i8 full_res;
669675
bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res);
670676
*res = zig_wrap_i8(full_res, bits);
@@ -685,7 +691,7 @@ static inline void zig_vsubo_i8(zig_u8 *ov, zig_i8 *res, int n,
685691

686692

687693
static inline bool zig_subo_u16(zig_u16 *res, zig_u16 lhs, zig_u16 rhs, zig_u8 bits) {
688-
#if zig_has_builtin(sub_overflow) || defined(__GNUC__)
694+
#if zig_has_builtin(sub_overflow) || defined(zig_gnuc)
689695
zig_u16 full_res;
690696
bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res);
691697
*res = zig_wrap_u16(full_res, bits);
@@ -706,7 +712,7 @@ static inline void zig_vsubo_u16(zig_u8 *ov, zig_u16 *res, int n,
706712

707713

708714
static inline bool zig_subo_i16(zig_i16 *res, zig_i16 lhs, zig_i16 rhs, zig_u8 bits) {
709-
#if zig_has_builtin(sub_overflow) || defined(__GNUC__)
715+
#if zig_has_builtin(sub_overflow) || defined(zig_gnuc)
710716
zig_i16 full_res;
711717
bool overflow = __builtin_sub_overflow(lhs, rhs, &full_res);
712718
*res = zig_wrap_i16(full_res, bits);
@@ -726,7 +732,7 @@ static inline void zig_vsubo_i16(zig_u8 *ov, zig_i16 *res, int n,
726732
}
727733

728734
static inline bool zig_mulo_u32(zig_u32 *res, zig_u32 lhs, zig_u32 rhs, zig_u8 bits) {
729-
#if zig_has_builtin(mul_overflow) || defined(__GNUC__)
735+
#if zig_has_builtin(mul_overflow) || defined(zig_gnuc)
730736
zig_u32 full_res;
731737
bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res);
732738
*res = zig_wrap_u32(full_res, bits);
@@ -745,7 +751,7 @@ static inline void zig_vmulo_u32(zig_u8 *ov, zig_u32 *res, int n,
745751

746752
zig_extern zig_i32 __mulosi4(zig_i32 lhs, zig_i32 rhs, zig_c_int *overflow);
747753
static inline bool zig_mulo_i32(zig_i32 *res, zig_i32 lhs, zig_i32 rhs, zig_u8 bits) {
748-
#if zig_has_builtin(mul_overflow) || defined(__GNUC__)
754+
#if zig_has_builtin(mul_overflow) || defined(zig_gnuc)
749755
zig_i32 full_res;
750756
bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res);
751757
#else
@@ -764,7 +770,7 @@ static inline void zig_vmulo_i32(zig_u8 *ov, zig_i32 *res, int n,
764770
}
765771

766772
static inline bool zig_mulo_u64(zig_u64 *res, zig_u64 lhs, zig_u64 rhs, zig_u8 bits) {
767-
#if zig_has_builtin(mul_overflow) || defined(__GNUC__)
773+
#if zig_has_builtin(mul_overflow) || defined(zig_gnuc)
768774
zig_u64 full_res;
769775
bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res);
770776
*res = zig_wrap_u64(full_res, bits);
@@ -783,7 +789,7 @@ static inline void zig_vmulo_u64(zig_u8 *ov, zig_u64 *res, int n,
783789

784790
zig_extern zig_i64 __mulodi4(zig_i64 lhs, zig_i64 rhs, zig_c_int *overflow);
785791
static inline bool zig_mulo_i64(zig_i64 *res, zig_i64 lhs, zig_i64 rhs, zig_u8 bits) {
786-
#if zig_has_builtin(mul_overflow) || defined(__GNUC__)
792+
#if zig_has_builtin(mul_overflow) || defined(zig_gnuc)
787793
zig_i64 full_res;
788794
bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res);
789795
#else
@@ -802,7 +808,7 @@ static inline void zig_vmulo_i64(zig_u8 *ov, zig_i64 *res, int n,
802808
}
803809

804810
static inline bool zig_mulo_u8(zig_u8 *res, zig_u8 lhs, zig_u8 rhs, zig_u8 bits) {
805-
#if zig_has_builtin(mul_overflow) || defined(__GNUC__)
811+
#if zig_has_builtin(mul_overflow) || defined(zig_gnuc)
806812
zig_u8 full_res;
807813
bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res);
808814
*res = zig_wrap_u8(full_res, bits);
@@ -822,7 +828,7 @@ static inline void zig_vmulo_u8(zig_u8 *ov, zig_u8 *res, int n,
822828
}
823829

824830
static inline bool zig_mulo_i8(zig_i8 *res, zig_i8 lhs, zig_i8 rhs, zig_u8 bits) {
825-
#if zig_has_builtin(mul_overflow) || defined(__GNUC__)
831+
#if zig_has_builtin(mul_overflow) || defined(zig_gnuc)
826832
zig_i8 full_res;
827833
bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res);
828834
*res = zig_wrap_i8(full_res, bits);
@@ -842,7 +848,7 @@ static inline void zig_vmulo_i8(zig_u8 *ov, zig_i8 *res, int n,
842848
}
843849

844850
static inline bool zig_mulo_u16(zig_u16 *res, zig_u16 lhs, zig_u16 rhs, zig_u8 bits) {
845-
#if zig_has_builtin(mul_overflow) || defined(__GNUC__)
851+
#if zig_has_builtin(mul_overflow) || defined(zig_gnuc)
846852
zig_u16 full_res;
847853
bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res);
848854
*res = zig_wrap_u16(full_res, bits);
@@ -862,7 +868,7 @@ static inline void zig_vmulo_u16(zig_u8 *ov, zig_u16 *res, int n,
862868
}
863869

864870
static inline bool zig_mulo_i16(zig_i16 *res, zig_i16 lhs, zig_i16 rhs, zig_u8 bits) {
865-
#if zig_has_builtin(mul_overflow) || defined(__GNUC__)
871+
#if zig_has_builtin(mul_overflow) || defined(zig_gnuc)
866872
zig_i16 full_res;
867873
bool overflow = __builtin_mul_overflow(lhs, rhs, &full_res);
868874
*res = zig_wrap_i16(full_res, bits);
@@ -977,7 +983,7 @@ static inline zig_i8 zig_byte_swap_i8(zig_i8 val, zig_u8 bits) {
977983

978984
static inline zig_u16 zig_byte_swap_u16(zig_u16 val, zig_u8 bits) {
979985
zig_u16 full_res;
980-
#if zig_has_builtin(bswap16) || defined(__GNUC__)
986+
#if zig_has_builtin(bswap16) || defined(zig_gnuc)
981987
full_res = __builtin_bswap16(val);
982988
#else
983989
full_res = (zig_u16)zig_byte_swap_u8((zig_u8)(val >> 0), 8) << 8 |
@@ -992,7 +998,7 @@ static inline zig_i16 zig_byte_swap_i16(zig_i16 val, zig_u8 bits) {
992998

993999
static inline zig_u32 zig_byte_swap_u32(zig_u32 val, zig_u8 bits) {
9941000
zig_u32 full_res;
995-
#if zig_has_builtin(bswap32) || defined(__GNUC__)
1001+
#if zig_has_builtin(bswap32) || defined(zig_gnuc)
9961002
full_res = __builtin_bswap32(val);
9971003
#else
9981004
full_res = (zig_u32)zig_byte_swap_u16((zig_u16)(val >> 0), 16) << 16 |
@@ -1007,7 +1013,7 @@ static inline zig_i32 zig_byte_swap_i32(zig_i32 val, zig_u8 bits) {
10071013

10081014
static inline zig_u64 zig_byte_swap_u64(zig_u64 val, zig_u8 bits) {
10091015
zig_u64 full_res;
1010-
#if zig_has_builtin(bswap64) || defined(__GNUC__)
1016+
#if zig_has_builtin(bswap64) || defined(zig_gnuc)
10111017
full_res = __builtin_bswap64(val);
10121018
#else
10131019
full_res = (zig_u64)zig_byte_swap_u32((zig_u32)(val >> 0), 32) << 32 |
@@ -1087,7 +1093,7 @@ static inline zig_i64 zig_bit_reverse_i64(zig_i64 val, zig_u8 bits) {
10871093
static inline zig_u8 zig_popcount_i##w(zig_i##w val, zig_u8 bits) { \
10881094
return zig_popcount_u##w((zig_u##w)val, bits); \
10891095
}
1090-
#if zig_has_builtin(popcount) || defined(__GNUC__)
1096+
#if zig_has_builtin(popcount) || defined(zig_gnuc)
10911097
#define zig_builtin_popcount(w) \
10921098
static inline zig_u8 zig_popcount_u##w(zig_u##w val, zig_u8 bits) { \
10931099
(void)bits; \
@@ -1116,7 +1122,7 @@ zig_builtin_popcount(64)
11161122
static inline zig_u8 zig_ctz_i##w(zig_i##w val, zig_u8 bits) { \
11171123
return zig_ctz_u##w((zig_u##w)val, bits); \
11181124
}
1119-
#if zig_has_builtin(ctz) || defined(__GNUC__)
1125+
#if zig_has_builtin(ctz) || defined(zig_gnuc)
11201126
#define zig_builtin_ctz(w) \
11211127
static inline zig_u8 zig_ctz_u##w(zig_u##w val, zig_u8 bits) { \
11221128
if (val == 0) return bits; \
@@ -1141,7 +1147,7 @@ zig_builtin_ctz(64)
11411147
static inline zig_u8 zig_clz_i##w(zig_i##w val, zig_u8 bits) { \
11421148
return zig_clz_u##w((zig_u##w)val, bits); \
11431149
}
1144-
#if zig_has_builtin(clz) || defined(__GNUC__)
1150+
#if zig_has_builtin(clz) || defined(zig_gnuc)
11451151
#define zig_builtin_clz(w) \
11461152
static inline zig_u8 zig_clz_u##w(zig_u##w val, zig_u8 bits) { \
11471153
if (val == 0) return bits; \
@@ -1764,7 +1770,7 @@ static inline zig_i128 zig_bit_reverse_i128(zig_i128 val, zig_u8 bits) {
17641770
#define __builtin_infl() zig_msvc_flt_infl
17651771
#endif
17661772

1767-
#if (zig_has_builtin(nan) && zig_has_builtin(nans) && zig_has_builtin(inf)) || defined(__GNUC__)
1773+
#if (zig_has_builtin(nan) && zig_has_builtin(nans) && zig_has_builtin(inf))
17681774
#define zig_has_float_builtins 1
17691775
#define zig_as_special_f16(sign, name, arg, repr) sign zig_as_f16(__builtin_##name, )(arg)
17701776
#define zig_as_special_f32(sign, name, arg, repr) sign zig_as_f32(__builtin_##name, )(arg)
@@ -1796,7 +1802,7 @@ typedef double zig_f16;
17961802
#define zig_bitSizeOf_c_longdouble 16
17971803
typedef long double zig_f16;
17981804
#define zig_as_f16(fp, repr) fp##l
1799-
#elif FLT16_MANT_DIG == 11 && (zig_has_builtin(inff16) || defined(__GNUC__))
1805+
#elif FLT16_MANT_DIG == 11 && (zig_has_builtin(inff16) || defined(zig_gnuc))
18001806
typedef _Float16 zig_f16;
18011807
#define zig_as_f16(fp, repr) fp##f16
18021808
#elif defined(__SIZEOF_FP16__)

0 commit comments

Comments
 (0)