Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions core/iwasm/compilation/aot_llvm.c
Original file line number Diff line number Diff line change
Expand Up @@ -3005,6 +3005,10 @@ aot_create_comp_context(const AOTCompData *comp_data, aot_comp_option_t option)
else
vendor_sys = "-pc-windows-";
}
else if (!strcmp(abi, "darwin") || !strcmp(abi, "macho")) {
/* macOS/Darwin: x18 is reserved by Apple */
vendor_sys = "-apple-";
}
else {
if (is_baremetal_target(arch, cpu, abi))
vendor_sys = "-unknown-none-";
Expand Down Expand Up @@ -3050,6 +3054,14 @@ aot_create_comp_context(const AOTCompData *comp_data, aot_comp_option_t option)
if (!abi)
abi = "gnu";
}
else if (strstr(default_triple, "darwin")
|| strstr(default_triple, "apple")) {
/* macOS/Darwin: x18 is reserved by Apple, must use correct
* triple to prevent LLVM from using it */
vendor_sys = "-apple-darwin";
if (!abi)
abi = "";
}
else {
vendor_sys = "-pc-linux-";
if (!abi)
Expand Down Expand Up @@ -3139,6 +3151,30 @@ aot_create_comp_context(const AOTCompData *comp_data, aot_comp_option_t option)
if (!features)
features = "";

#if (defined(__APPLE__) || defined(__MACH__)) && defined(BUILD_TARGET_AARCH64)
/* On macOS ARM64, x18 is reserved by Apple for TLS. Even though we're
* generating ELF (Linux-style) AOT files, we must tell LLVM to not
* use x18, otherwise the AOT code will crash when running on macOS. */
{
bool is_aarch64 = false;
if (arch && !strncmp(arch, "aarch64", 7))
is_aarch64 = true;
else if (triple_norm && strstr(triple_norm, "aarch64"))
is_aarch64 = true;

if (is_aarch64) {
if (features[0] != '\0') {
snprintf(features_buf, sizeof(features_buf), "%s,+reserve-x18",
features);
features = features_buf;
}
else {
features = "+reserve-x18";
}
}
}
#endif

/* Get target with triple, note that LLVMGetTargetFromTriple()
return 0 when success, but not true. */
if (LLVMGetTargetFromTriple(triple_norm, &target, &err) != 0) {
Expand Down
Loading