Fix arm64 issues on mac (#3688)
Make wamrc normalize "arm64" to "aarch64v8". Previously the only way to make the "arm64" target was to not specify a target on 64 bit arm-based mac builds. Now arm64 and aarch64v8 are treated as the same. Make aot_loader accept "aarch64v8" on arm-based apple (as well as accepting legacy "arm64" based aot targets). This also removes __APPLE__ and __MACH__ from the block that defaults size_level to 1 since it doesn't seem to be supported for aarch64: `LLVM ERROR: Only small, tiny and large code models are allowed on AArch64`
This commit is contained in:
@ -579,6 +579,10 @@ load_target_info_section(const uint8 *buf, const uint8 *buf_end,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* for backwards compatibility with previous wamrc aot files */
|
||||||
|
if (!strcmp(target_info.arch, "arm64"))
|
||||||
|
bh_strcpy_s(target_info.arch, sizeof(target_info.arch), "aarch64v8");
|
||||||
|
|
||||||
/* Check machine info */
|
/* Check machine info */
|
||||||
if (!check_machine_info(&target_info, error_buf, error_buf_size)) {
|
if (!check_machine_info(&target_info, error_buf, error_buf_size)) {
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@ -53,12 +53,6 @@ get_target_symbol_map(uint32 *sym_num)
|
|||||||
return target_sym_map;
|
return target_sym_map;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if (defined(__APPLE__) || defined(__MACH__)) && defined(__arm64__)
|
|
||||||
#define BUILD_TARGET_AARCH64_DEFAULT "arm64"
|
|
||||||
#else
|
|
||||||
#define BUILD_TARGET_AARCH64_DEFAULT "aarch64v8"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void
|
void
|
||||||
get_current_target(char *target_buf, uint32 target_buf_size)
|
get_current_target(char *target_buf, uint32 target_buf_size)
|
||||||
{
|
{
|
||||||
@ -68,8 +62,8 @@ get_current_target(char *target_buf, uint32 target_buf_size)
|
|||||||
|
|
||||||
/* Set to "aarch64v8" by default if sub version isn't specified */
|
/* Set to "aarch64v8" by default if sub version isn't specified */
|
||||||
if (strcmp(s, "AARCH64") == 0) {
|
if (strcmp(s, "AARCH64") == 0) {
|
||||||
s = BUILD_TARGET_AARCH64_DEFAULT;
|
s = "aarch64v8";
|
||||||
s_size = sizeof(BUILD_TARGET_AARCH64_DEFAULT);
|
s_size = 9; /* strlen("aarch64v8"); */
|
||||||
}
|
}
|
||||||
if (target_buf_size < s_size) {
|
if (target_buf_size < s_size) {
|
||||||
s_size = target_buf_size;
|
s_size = target_buf_size;
|
||||||
@ -83,7 +77,6 @@ get_current_target(char *target_buf, uint32 target_buf_size)
|
|||||||
/* Ensure the string is null byte ('\0') terminated */
|
/* Ensure the string is null byte ('\0') terminated */
|
||||||
*d = '\0';
|
*d = '\0';
|
||||||
}
|
}
|
||||||
#undef BUILD_TARGET_AARCH64_DEFAULT
|
|
||||||
|
|
||||||
static uint32
|
static uint32
|
||||||
get_plt_item_size()
|
get_plt_item_size()
|
||||||
|
|||||||
@ -2790,6 +2790,15 @@ aot_create_comp_context(const AOTCompData *comp_data, aot_comp_option_t option)
|
|||||||
bh_assert(vendor_sys);
|
bh_assert(vendor_sys);
|
||||||
bh_memcpy_s(default_arch, sizeof(default_arch), default_triple,
|
bh_memcpy_s(default_arch, sizeof(default_arch), default_triple,
|
||||||
(uint32)(vendor_sys - default_triple));
|
(uint32)(vendor_sys - default_triple));
|
||||||
|
/**
|
||||||
|
* On Mac M[1-9]+ LLVM will report arm64 as the
|
||||||
|
* architecture, for the purposes of wamr this is the
|
||||||
|
* same as aarch64v8 so we'll normalize it here.
|
||||||
|
*/
|
||||||
|
if (!strcmp(default_arch, "arm64")) {
|
||||||
|
bh_strcpy_s(default_arch, sizeof(default_arch),
|
||||||
|
"aarch64v8");
|
||||||
|
}
|
||||||
arch1 = default_arch;
|
arch1 = default_arch;
|
||||||
|
|
||||||
LLVMDisposeMessage(default_triple);
|
LLVMDisposeMessage(default_triple);
|
||||||
|
|||||||
@ -601,8 +601,8 @@ main(int argc, char *argv[])
|
|||||||
LOG_VERBOSE("Set size level to 1 for Windows AOT file");
|
LOG_VERBOSE("Set size level to 1 for Windows AOT file");
|
||||||
option.size_level = 1;
|
option.size_level = 1;
|
||||||
}
|
}
|
||||||
#if defined(_WIN32) || defined(_WIN32_) || defined(__APPLE__) \
|
#if defined(_WIN32) || defined(_WIN32_) \
|
||||||
|| defined(__MACH__)
|
|| ((defined(__APPLE__) || defined(__MACH__)) && !defined(__arm64__))
|
||||||
if (!option.target_arch && !option.target_abi) {
|
if (!option.target_arch && !option.target_abi) {
|
||||||
LOG_VERBOSE("Set size level to 1 for Windows or MacOS AOT file");
|
LOG_VERBOSE("Set size level to 1 for Windows or MacOS AOT file");
|
||||||
option.size_level = 1;
|
option.size_level = 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user