Skip to content

Commit 78eb3c5

Browse files
jacobly0andrewrk
authored andcommitted
bootstrap: support aarch64 in 32-bit mode
* `CMakeLists.txt`: support the weird `uname -m` output. * `CMakeLists.txt`: detect and use the C compiler's default arm mode. * cbe: support gcc with both `f128` and `u128` emulated. * std.os.linux.thumb: fix incorrectly passed asm inputs.
1 parent 8ae92fd commit 78eb3c5

File tree

5 files changed

+33
-45
lines changed

5 files changed

+33
-45
lines changed

CMakeLists.txt

+22-11
Original file line numberDiff line numberDiff line change
@@ -689,17 +689,28 @@ target_link_libraries(zigcpp LINK_PUBLIC
689689
${CMAKE_THREAD_LIBS_INIT}
690690
)
691691

692-
string(TOLOWER "${CMAKE_HOST_SYSTEM_PROCESSOR}" HOST_TARGET_ARCH)
693-
if(HOST_TARGET_ARCH STREQUAL "amd64")
694-
set(HOST_TARGET_ARCH "x86_64")
695-
elseif(HOST_TARGET_ARCH STREQUAL "arm64")
696-
set(HOST_TARGET_ARCH "aarch64")
692+
string(TOLOWER "${CMAKE_HOST_SYSTEM_PROCESSOR}" ZIG_HOST_TARGET_ARCH)
693+
if(ZIG_HOST_TARGET_ARCH STREQUAL "amd64")
694+
set(ZIG_HOST_TARGET_ARCH "x86_64")
695+
elseif(ZIG_HOST_TARGET_ARCH STREQUAL "arm64")
696+
set(ZIG_HOST_TARGET_ARCH "aarch64")
697+
elseif(ZIG_HOST_TARGET_ARCH STREQUAL "armv7l")
698+
set(ZIG_HOST_TARGET_ARCH "arm")
699+
elseif(ZIG_HOST_TARGET_ARCH STREQUAL "armv7b")
700+
set(ZIG_HOST_TARGET_ARCH "armeb")
697701
endif()
698-
string(TOLOWER "${CMAKE_HOST_SYSTEM_NAME}" HOST_TARGET_OS)
699-
if(HOST_TARGET_OS STREQUAL "darwin")
700-
set(HOST_TARGET_OS "macos")
702+
if(ZIG_HOST_TARGET_ARCH MATCHES "^arm(eb)?$")
703+
include(CheckSymbolExists)
704+
check_symbol_exists(__thumb__ "" ZIG_HOST_TARGET_DEFAULTS_TO_THUMB)
705+
if(ZIG_HOST_TARGET_DEFAULTS_TO_THUMB)
706+
string(REGEX REPLACE "^arm" "thumb" ZIG_HOST_TARGET_ARCH "${ZIG_HOST_TARGET_ARCH}")
707+
endif()
708+
endif()
709+
string(TOLOWER "${CMAKE_HOST_SYSTEM_NAME}" ZIG_HOST_TARGET_OS)
710+
if(ZIG_HOST_TARGET_OS STREQUAL "darwin")
711+
set(ZIG_HOST_TARGET_OS "macos")
701712
endif()
702-
set(HOST_TARGET_TRIPLE "${HOST_TARGET_ARCH}-${HOST_TARGET_OS}")
713+
set(ZIG_HOST_TARGET_TRIPLE "${ZIG_HOST_TARGET_ARCH}-${ZIG_HOST_TARGET_OS}" CACHE STRING "Host zig target triple.")
703714

704715
if(MSVC)
705716
set(ZIG_WASM2C_COMPILE_FLAGS "")
@@ -749,7 +760,7 @@ set(BUILD_ZIG2_ARGS
749760
--name zig2 -femit-bin="${ZIG2_C_SOURCE}"
750761
--mod "build_options::${ZIG_CONFIG_ZIG_OUT}"
751762
--deps build_options
752-
-target "${HOST_TARGET_TRIPLE}"
763+
-target "${ZIG_HOST_TARGET_TRIPLE}"
753764
)
754765

755766
add_custom_command(
@@ -767,7 +778,7 @@ set(BUILD_COMPILER_RT_ARGS
767778
--name compiler_rt -femit-bin="${ZIG_COMPILER_RT_C_SOURCE}"
768779
--mod "build_options::${ZIG_CONFIG_ZIG_OUT}"
769780
--deps build_options
770-
-target "${HOST_TARGET_TRIPLE}"
781+
-target "${ZIG_HOST_TARGET_TRIPLE}"
771782
)
772783

773784
add_custom_command(

lib/std/os/linux/thumb.zig

+7-7
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ pub fn syscall0(number: SYS) usize {
1717
\\ svc #0
1818
\\ ldr r7, [%[tmp], #4]
1919
: [ret] "={r0}" (-> usize),
20-
: [tmp] "{r1}" (buf),
20+
: [tmp] "{r1}" (&buf),
2121
: "memory"
2222
);
2323
}
@@ -32,7 +32,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
3232
\\ svc #0
3333
\\ ldr r7, [%[tmp], #4]
3434
: [ret] "={r0}" (-> usize),
35-
: [tmp] "{r1}" (buf),
35+
: [tmp] "{r1}" (&buf),
3636
[arg1] "{r0}" (arg1),
3737
: "memory"
3838
);
@@ -48,7 +48,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
4848
\\ svc #0
4949
\\ ldr r7, [%[tmp], #4]
5050
: [ret] "={r0}" (-> usize),
51-
: [tmp] "{r2}" (buf),
51+
: [tmp] "{r2}" (&buf),
5252
[arg1] "{r0}" (arg1),
5353
[arg2] "{r1}" (arg2),
5454
: "memory"
@@ -65,7 +65,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
6565
\\ svc #0
6666
\\ ldr r7, [%[tmp], #4]
6767
: [ret] "={r0}" (-> usize),
68-
: [tmp] "{r3}" (buf),
68+
: [tmp] "{r3}" (&buf),
6969
[arg1] "{r0}" (arg1),
7070
[arg2] "{r1}" (arg2),
7171
[arg3] "{r2}" (arg3),
@@ -83,7 +83,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
8383
\\ svc #0
8484
\\ ldr r7, [%[tmp], #4]
8585
: [ret] "={r0}" (-> usize),
86-
: [tmp] "{r4}" (buf),
86+
: [tmp] "{r4}" (&buf),
8787
[arg1] "{r0}" (arg1),
8888
[arg2] "{r1}" (arg2),
8989
[arg3] "{r2}" (arg3),
@@ -102,7 +102,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
102102
\\ svc #0
103103
\\ ldr r7, [%[tmp], #4]
104104
: [ret] "={r0}" (-> usize),
105-
: [tmp] "{r5}" (buf),
105+
: [tmp] "{r5}" (&buf),
106106
[arg1] "{r0}" (arg1),
107107
[arg2] "{r1}" (arg2),
108108
[arg3] "{r2}" (arg3),
@@ -130,7 +130,7 @@ pub fn syscall6(
130130
\\ svc #0
131131
\\ ldr r7, [%[tmp], #4]
132132
: [ret] "={r0}" (-> usize),
133-
: [tmp] "{r6}" (buf),
133+
: [tmp] "{r6}" (&buf),
134134
[arg1] "{r0}" (arg1),
135135
[arg2] "{r1}" (arg2),
136136
[arg3] "{r2}" (arg3),

lib/zig.h

-12
Original file line numberDiff line numberDiff line change
@@ -3178,18 +3178,6 @@ zig_bitCast_float(f64, uint64_t)
31783178
zig_bitCast_float(f80, zig_u128)
31793179
zig_bitCast_float(f128, zig_u128)
31803180

3181-
#define zig_cast_f16 (zig_f16)
3182-
#define zig_cast_f32 (zig_f32)
3183-
#define zig_cast_f64 (zig_f64)
3184-
3185-
#if _MSC_VER && !zig_has_f128
3186-
#define zig_cast_f80
3187-
#define zig_cast_f128
3188-
#else
3189-
#define zig_cast_f80 (zig_f80)
3190-
#define zig_cast_f128 (zig_f128)
3191-
#endif
3192-
31933181
#define zig_convert_builtin(ExternResType, ResType, operation, ExternArgType, ArgType, version) \
31943182
zig_extern ExternResType zig_expand_concat(zig_expand_concat(zig_expand_concat(__##operation, \
31953183
zig_compiler_rt_abbrev_##ArgType), zig_compiler_rt_abbrev_##ResType), version)(ExternArgType); \

src/codegen/c.zig

+1-6
Original file line numberDiff line numberDiff line change
@@ -732,9 +732,7 @@ pub const DeclGen = struct {
732732
// All unsigned ints matching float types are pre-allocated.
733733
const repr_ty = mod.intType(.unsigned, bits) catch unreachable;
734734

735-
try writer.writeAll("zig_cast_");
736-
try dg.renderTypeForBuiltinFnName(writer, ty);
737-
try writer.writeAll(" zig_make_");
735+
try writer.writeAll("zig_make_");
738736
try dg.renderTypeForBuiltinFnName(writer, ty);
739737
try writer.writeByte('(');
740738
switch (bits) {
@@ -1049,9 +1047,6 @@ pub const DeclGen = struct {
10491047

10501048
const repr_val = try mod.intValue_big(repr_ty, repr_val_big.toConst());
10511049

1052-
try writer.writeAll("zig_cast_");
1053-
try dg.renderTypeForBuiltinFnName(writer, ty);
1054-
try writer.writeByte(' ');
10551050
var empty = true;
10561051
if (std.math.isFinite(f128_val)) {
10571052
try writer.writeAll("zig_make_");

stage1/zig.h

+3-9
Original file line numberDiff line numberDiff line change
@@ -3178,17 +3178,11 @@ zig_bitCast_float(f64, uint64_t)
31783178
zig_bitCast_float(f80, zig_u128)
31793179
zig_bitCast_float(f128, zig_u128)
31803180

3181-
#define zig_cast_f16 (zig_f16)
3182-
#define zig_cast_f32 (zig_f32)
3183-
#define zig_cast_f64 (zig_f64)
3184-
3185-
#if _MSC_VER && !zig_has_f128
3181+
#define zig_cast_f16
3182+
#define zig_cast_f32
3183+
#define zig_cast_f64
31863184
#define zig_cast_f80
31873185
#define zig_cast_f128
3188-
#else
3189-
#define zig_cast_f80 (zig_f80)
3190-
#define zig_cast_f128 (zig_f128)
3191-
#endif
31923186

31933187
#define zig_convert_builtin(ExternResType, ResType, operation, ExternArgType, ArgType, version) \
31943188
zig_extern ExternResType zig_expand_concat(zig_expand_concat(zig_expand_concat(__##operation, \

0 commit comments

Comments
 (0)