Skip to content

Commit d24d5dc

Browse files
authored
[FMV][AArch64] Run the aarch64-init-cpu-features test on Linux. (llvm#172)
Currently we are only running this test on Darwin platforms. I had to adjust the runtime initialization routine because on Linux the dynamic loader will pass a HWCAP parameter to the ifunc resolver function, whereas on Darwin no arguments are passed.
1 parent f5baaae commit d24d5dc

File tree

2 files changed

+24
-8
lines changed

2 files changed

+24
-8
lines changed

SingleSource/Benchmarks/Misc/CMakeLists.txt

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,20 @@ if(NOT ARCH STREQUAL "PowerPC" OR NOT TARGET_OS STREQUAL "Darwin")
3535
list(APPEND Source dt.c)
3636
endif()
3737
if(ARCH STREQUAL "AArch64")
38-
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/CheckHaveAArch64FMV.h "void __init_cpu_features_resolver(void);")
39-
check_symbol_exists(__init_cpu_features_resolver ${CMAKE_CURRENT_BINARY_DIR}/CheckHaveAArch64FMV.h HAVE_AARCH64_FMV)
40-
if(HAVE_AARCH64_FMV AND TARGET_OS STREQUAL "Darwin")
41-
list(APPEND Source aarch64-init-cpu-features.c)
38+
if(TARGET_OS STREQUAL "Darwin")
39+
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/CheckHasAArch64FMV.h "void __init_cpu_features_resolver(void);")
40+
check_symbol_exists(__init_cpu_features_resolver ${CMAKE_CURRENT_BINARY_DIR}/CheckHasAArch64FMV.h HAS_AARCH64_FMV)
41+
if(HAS_AARCH64_FMV)
42+
list(APPEND CFLAGS -DHAS_DARWIN_FMV)
43+
list(APPEND Source aarch64-init-cpu-features.c)
44+
endif()
45+
elseif(TARGET_OS STREQUAL "Linux")
46+
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/CheckHasAArch64FMV.h "void __init_cpu_features(void);")
47+
check_symbol_exists(__init_cpu_features ${CMAKE_CURRENT_BINARY_DIR}/CheckHasAArch64FMV.h HAS_AARCH64_FMV)
48+
if(HAS_AARCH64_FMV)
49+
list(APPEND CFLAGS -DHAS_LINUX_FMV)
50+
list(APPEND Source aarch64-init-cpu-features.c)
51+
endif()
4252
endif()
4353
endif()
4454
llvm_singlesource()

SingleSource/Benchmarks/Misc/aarch64-init-cpu-features.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,21 @@ extern struct {
44
unsigned long long features;
55
} __aarch64_cpu_features;
66

7-
void __init_cpu_features_resolver(void);
7+
#if HAS_DARWIN_FMV
8+
# define RUNTIME_INIT __init_cpu_features_resolver
9+
#elif HAS_LINUX_FMV
10+
# define RUNTIME_INIT __init_cpu_features
11+
#endif
12+
13+
void RUNTIME_INIT(void);
814

915
int main() {
10-
__init_cpu_features_resolver();
16+
RUNTIME_INIT();
1117
const unsigned long long first = __aarch64_cpu_features.features;
1218

1319
// Manually reset it, so we can check that the result is consistent.
1420
__aarch64_cpu_features.features = 0;
15-
__init_cpu_features_resolver();
21+
RUNTIME_INIT();
1622

1723
if (__aarch64_cpu_features.features != first) {
1824
printf("FAILED consistency test: 0x%llx != 0x%llx\n", first,
@@ -24,6 +30,6 @@ int main() {
2430
// per-iteration measurement in microseconds.
2531
for (int i = 0; i < 1000000; i++) {
2632
__aarch64_cpu_features.features = 0;
27-
__init_cpu_features_resolver();
33+
RUNTIME_INIT();
2834
}
2935
}

0 commit comments

Comments
 (0)