Skip to content

Commit 48f443e

Browse files
authored
Fix wasm64 definitions of INT64_MAX (#25887)
Use clang builtin definitions of these limits to avoid the problem of having to use `l` or `ll` suffixes on constants. Fixes: #25886
1 parent 113e761 commit 48f443e

File tree

6 files changed

+82
-14
lines changed

6 files changed

+82
-14
lines changed

system/lib/libc/musl/arch/emscripten/bits/stdint.h

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,9 @@ typedef uint32_t uint_fast32_t;
1212
#define UINT_FAST16_MAX UINT32_MAX
1313
#define UINT_FAST32_MAX UINT32_MAX
1414

15-
#if __LP64__
16-
17-
#define INTPTR_MIN INT64_MIN
18-
#define INTPTR_MAX INT64_MAX
19-
#define UINTPTR_MAX UINT64_MAX
20-
#define PTRDIFF_MIN INT64_MIN
21-
#define PTRDIFF_MAX INT64_MAX
22-
#define SIZE_MAX UINT64_MAX
23-
24-
#else
25-
2615
#define INTPTR_MIN (-1-__INTPTR_MAX__)
2716
#define INTPTR_MAX __INTPTR_MAX__
2817
#define UINTPTR_MAX __UINTPTR_MAX__
2918
#define PTRDIFF_MIN (-1-__PTRDIFF_MAX__)
3019
#define PTRDIFF_MAX __PTRDIFF_MAX__
3120
#define SIZE_MAX __SIZE_MAX__
32-
33-
#endif

system/lib/libc/musl/include/stdint.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,22 @@ typedef uint16_t uint_least16_t;
3535
typedef uint32_t uint_least32_t;
3636
typedef uint64_t uint_least64_t;
3737

38+
#ifdef __EMSCRIPTEN__
39+
#define INT8_MIN (-1-__INT8_MAX__)
40+
#define INT16_MIN (-1-__INT16_MAX__)
41+
#define INT32_MIN (-1-__INT32_MAX__)
42+
#define INT64_MIN (-1-__INT64_MAX__)
43+
44+
#define INT8_MAX __INT8_MAX__
45+
#define INT16_MAX __INT16_MAX__
46+
#define INT32_MAX __INT32_MAX__
47+
#define INT64_MAX __INT64_MAX__
48+
49+
#define UINT8_MAX __UINT8_MAX__
50+
#define UINT16_MAX __UINT16_MAX__
51+
#define UINT32_MAX __UINT32_MAX__
52+
#define UINT64_MAX __UINT64_MAX__
53+
#else
3854
#define INT8_MIN (-1-0x7f)
3955
#define INT16_MIN (-1-0x7fff)
4056
#define INT32_MIN (-1-0x7fffffff)
@@ -49,6 +65,7 @@ typedef uint64_t uint_least64_t;
4965
#define UINT16_MAX (0xffff)
5066
#define UINT32_MAX (0xffffffffu)
5167
#define UINT64_MAX (0xffffffffffffffffu)
68+
#endif
5269

5370
#define INT_FAST8_MIN INT8_MIN
5471
#define INT_FAST64_MIN INT64_MIN
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
INT_MIN: -2147483648
2+
INT_MAX: 2147483647
3+
LONG_MIN: -9223372036854775808
4+
LONG_MAX: 9223372036854775807
5+
LLONG_MIN: -9223372036854775808
6+
LLONG_MAX: 9223372036854775807
7+
INTPTR_MIN: -9223372036854775808
8+
INTPTR_MAX: 9223372036854775807
9+
PTRDIFF_MIN: -9223372036854775808
10+
PTRDIFF_MAX: 9223372036854775807
11+
INTPTR_MIN: -9223372036854775808
12+
INTPTR_MAX: 9223372036854775807
13+
UINTPTR_MAX: 18446744073709551615
14+
SIZE_MAX: 18446744073709551615
15+
SSIZE_MAX: 9223372036854775807
16+
INT8_MIN: -128
17+
INT8_MAX: 127
18+
INT16_MIN: -32768
19+
INT16_MAX: 32767
20+
INT32_MIN: -2147483648
21+
INT32_MAX: 2147483647
22+
INT64_MIN: -9223372036854775808
23+
INT64_MAX: 9223372036854775807
24+
UINT8_MAX: 255
25+
UINT16_MAX: 65535
26+
UINT32_MAX: 4294967295
27+
UINT64_MAX: 18446744073709551615

test/other/test_stdint_limits.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include <limits.h>
22
#include <stdio.h>
33
#include <stdint.h>
4+
#include <inttypes.h>
45

56
int main () {
67
printf("INT_MIN: %d\n", INT_MIN);
@@ -24,5 +25,22 @@ int main () {
2425
printf("UINTPTR_MAX: %lu\n", UINTPTR_MAX);
2526

2627
printf("SIZE_MAX: %zu\n", SIZE_MAX);
28+
29+
printf("SSIZE_MAX: %zu\n", SSIZE_MAX);
30+
31+
// Fixed width types
32+
printf("INT8_MIN: %" PRId8 "\n", INT8_MIN);
33+
printf("INT8_MAX: %" PRId8 "\n", INT8_MAX);
34+
printf("INT16_MIN: %" PRId16 "\n", INT16_MIN);
35+
printf("INT16_MAX: %" PRId16 "\n", INT16_MAX);
36+
printf("INT32_MIN: %" PRId32 "\n", INT32_MIN);
37+
printf("INT32_MAX: %" PRId32 "\n", INT32_MAX);
38+
printf("INT64_MIN: %" PRId64 "\n", INT64_MIN);
39+
printf("INT64_MAX: %" PRId64 "\n", INT64_MAX);
40+
41+
printf("UINT8_MAX: %" PRIu8 "\n", UINT8_MAX);
42+
printf("UINT16_MAX: %" PRIu16 "\n", UINT16_MAX);
43+
printf("UINT32_MAX: %" PRIu32 "\n", UINT32_MAX);
44+
printf("UINT64_MAX: %" PRIu64 "\n", UINT64_MAX);
2745
return 0;
2846
}

test/other/test_stdint_limits.out

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,16 @@ INTPTR_MIN: -2147483648
1212
INTPTR_MAX: 2147483647
1313
UINTPTR_MAX: 4294967295
1414
SIZE_MAX: 4294967295
15+
SSIZE_MAX: 2147483647
16+
INT8_MIN: -128
17+
INT8_MAX: 127
18+
INT16_MIN: -32768
19+
INT16_MAX: 32767
20+
INT32_MIN: -2147483648
21+
INT32_MAX: 2147483647
22+
INT64_MIN: -9223372036854775808
23+
INT64_MAX: 9223372036854775807
24+
UINT8_MAX: 255
25+
UINT16_MAX: 65535
26+
UINT32_MAX: 4294967295
27+
UINT64_MAX: 18446744073709551615

test/test_other.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13338,8 +13338,14 @@ def test_tutorial(self):
1333813338
# Ensure that files referenced in Tutorial.rst are buildable
1333913339
self.run_process([EMCC, test_file('hello_world_file.cpp')])
1334013340

13341+
@also_with_wasm64
1334113342
def test_stdint_limits(self):
13342-
self.do_other_test('test_stdint_limits.c')
13343+
if self.is_wasm64():
13344+
suffix = '.64'
13345+
else:
13346+
suffix = ''
13347+
print(suffix)
13348+
self.do_other_test('test_stdint_limits.c', out_suffix=suffix)
1334313349

1334413350
def test_legacy_runtime(self):
1334513351
self.set_setting('EXPORTED_FUNCTIONS', ['_malloc', '_main'])

0 commit comments

Comments
 (0)