[PATCH] D158641: [AArch64] Fix FMV ifunc resolver usage on old Android APIs. Rename internal compiler-rt FMV functions.
This revision was automatically updated to reflect the committed changes. Closed by commit rG8ec50d64464c: [AArch64] Fix FMV ifunc resolver usage on old Android APIs. Rename internal… (authored by ilinpv). Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D158641/new/ https://reviews.llvm.org/D158641 Files: clang/lib/CodeGen/CGBuiltin.cpp clang/lib/Driver/ToolChains/Clang.cpp clang/test/CodeGen/attr-target-clones-aarch64.c clang/test/CodeGen/attr-target-version.c clang/test/CodeGenCXX/attr-target-clones-aarch64.cpp clang/test/CodeGenCXX/attr-target-version.cpp clang/test/Driver/aarch64-features.c compiler-rt/lib/builtins/cpu_model.c Index: compiler-rt/lib/builtins/cpu_model.c === --- compiler-rt/lib/builtins/cpu_model.c +++ compiler-rt/lib/builtins/cpu_model.c @@ -1239,13 +1239,12 @@ // As features grows new fields could be added } __aarch64_cpu_features __attribute__((visibility("hidden"), nocommon)); -void init_cpu_features_resolver(unsigned long hwcap, const __ifunc_arg_t *arg) { +static void __init_cpu_features_constructor(unsigned long hwcap, +const __ifunc_arg_t *arg) { #define setCPUFeature(F) __aarch64_cpu_features.features |= 1ULL << F #define getCPUFeature(id, ftr) __asm__("mrs %0, " #id : "=r"(ftr)) #define extractBits(val, start, number)\ (val & ((1ULL << number) - 1ULL) << start) >> start - if (__aarch64_cpu_features.features) -return; unsigned long hwcap2 = 0; if (hwcap & _IFUNC_ARG_HWCAP) hwcap2 = arg->_hwcap2; @@ -1427,7 +1426,24 @@ setCPUFeature(FEAT_MAX); } -void CONSTRUCTOR_ATTRIBUTE init_cpu_features(void) { +void __init_cpu_features_resolver(unsigned long hwcap, + const __ifunc_arg_t *arg) { + if (__aarch64_cpu_features.features) +return; +#if defined(__ANDROID__) + // ifunc resolvers don't have hwcaps in arguments on Android API lower + // than 30. If so, set feature detection done and keep all CPU features + // unsupported (zeros). To detect this case in runtime we check existence + // of memfd_create function from Standard C library which was introduced in + // Android API 30. + int memfd_create(const char *, unsigned int) __attribute__((weak)); + if (!memfd_create) +return; +#endif // defined(__ANDROID__) + __init_cpu_features_constructor(hwcap, arg); +} + +void CONSTRUCTOR_ATTRIBUTE __init_cpu_features(void) { unsigned long hwcap; unsigned long hwcap2; // CPU features already initialized. @@ -1452,7 +1468,7 @@ arg._size = sizeof(__ifunc_arg_t); arg._hwcap = hwcap; arg._hwcap2 = hwcap2; - init_cpu_features_resolver(hwcap | _IFUNC_ARG_HWCAP, &arg); + __init_cpu_features_constructor(hwcap | _IFUNC_ARG_HWCAP, &arg); #undef extractBits #undef getCPUFeature #undef setCPUFeature Index: clang/test/Driver/aarch64-features.c === --- clang/test/Driver/aarch64-features.c +++ clang/test/Driver/aarch64-features.c @@ -7,15 +7,17 @@ // CHECK: fno-signed-char // Check Function Multi Versioning option and rtlib dependency. -// RUN: %clang --target=aarch64-linux-android -rtlib=compiler-rt \ +// RUN: %clang --target=aarch64-linux-android23 -rtlib=compiler-rt \ // RUN: -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-FMV %s - +// RUN: %clang --target=aarch64-linux-android -rtlib=compiler-rt \ +// RUN: -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-FMV-OFF %s // RUN: %clang --target=aarch64-linux-android -rtlib=compiler-rt -mno-fmv \ // RUN: -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-FMV-OFF %s +// RUN: %clang --target=aarch64-linux-android22 -rtlib=compiler-rt \ +// RUN: -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-FMV-OFF %s // RUN: %clang --target=aarch64-linux-gnu -rtlib=libgcc \ // RUN: -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-FMV-OFF %s - // RUN: %clang --target=arm64-unknown-linux -rtlib=libgcc \ // RUN: -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-FMV-OFF %s Index: clang/test/CodeGenCXX/attr-target-version.cpp === --- clang/test/CodeGenCXX/attr-target-version.cpp +++ clang/test/CodeGenCXX/attr-target-version.cpp @@ -78,7 +78,7 @@ // CHECK-NEXT:ret i32 [[ADD3]] // CHECK-LABEL: @_ZN7MyClass3gooEi.resolver( // CHECK-NEXT: resolver_entry: -// CHECK-NEXT:call void @init_cpu_features_resolver() +// CHECK-NEXT:call void @__init_cpu_features_resolver() // CHECK-NEXT:[[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8 // CHECK-NEXT:[[TMP1:%.*]] = and i64 [[TMP0]], 1024 // CHECK-NEXT:[[TMP2:%.*]] = icmp eq i64 [[TMP1]], 1024 @@ -98,7 +98,7 @@ // CHECK-NEXT:ret ptr @_ZN7MyClass3gooEi // CHECK-LABEL: @_Z3fooi.resolver( // CHECK-NEXT: resolver_entry: -// CHECK-NEXT:call void @init_cpu_
[PATCH] D158641: [AArch64] Fix FMV ifunc resolver usage on old Android APIs. Rename internal compiler-rt FMV functions.
enh accepted this revision. enh added a comment. yeah, lgtm from the Android side too, unless rprichard has more comments? Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D158641/new/ https://reviews.llvm.org/D158641 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D158641: [AArch64] Fix FMV ifunc resolver usage on old Android APIs. Rename internal compiler-rt FMV functions.
MaskRay accepted this revision. MaskRay added a comment. This revision is now accepted and ready to land. The Clang Driver/CodeGen and compiler-rt changes look good to me. Of course please wait for an Android reviewer :) Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D158641/new/ https://reviews.llvm.org/D158641 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D158641: [AArch64] Fix FMV ifunc resolver usage on old Android APIs. Rename internal compiler-rt FMV functions.
ilinpv added a comment. The patch tested on NDK r26 bulding simple Function Multi Versioning project and running on Android API 25,29,30,33 - works fine. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D158641/new/ https://reviews.llvm.org/D158641 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D158641: [AArch64] Fix FMV ifunc resolver usage on old Android APIs. Rename internal compiler-rt FMV functions.
ilinpv updated this revision to Diff 557332. ilinpv retitled this revision from "[AArch64][Android][DRAFT] Fix FMV ifunc resolver usage on old Android APIs." to "[AArch64] Fix FMV ifunc resolver usage on old Android APIs. Rename internal compiler-rt FMV functions.". ilinpv edited the summary of this revision. ilinpv added a comment. Herald added a subscriber: dberris. Use weak "memfd_create" to check for API 30, split and rename init cpu features functions ( __init_cpu_features, __init_cpu_features_resolver, __init_cpu_features_constructor ) Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D158641/new/ https://reviews.llvm.org/D158641 Files: clang/lib/CodeGen/CGBuiltin.cpp clang/lib/Driver/ToolChains/Clang.cpp clang/test/CodeGen/attr-target-clones-aarch64.c clang/test/CodeGen/attr-target-version.c clang/test/CodeGenCXX/attr-target-clones-aarch64.cpp clang/test/CodeGenCXX/attr-target-version.cpp clang/test/Driver/aarch64-features.c compiler-rt/lib/builtins/cpu_model.c Index: compiler-rt/lib/builtins/cpu_model.c === --- compiler-rt/lib/builtins/cpu_model.c +++ compiler-rt/lib/builtins/cpu_model.c @@ -1186,13 +1186,12 @@ // As features grows new fields could be added } __aarch64_cpu_features __attribute__((visibility("hidden"), nocommon)); -void init_cpu_features_resolver(unsigned long hwcap, const __ifunc_arg_t *arg) { +static void __init_cpu_features_constructor(unsigned long hwcap, +const __ifunc_arg_t *arg) { #define setCPUFeature(F) __aarch64_cpu_features.features |= 1ULL << F #define getCPUFeature(id, ftr) __asm__("mrs %0, " #id : "=r"(ftr)) #define extractBits(val, start, number)\ (val & ((1ULL << number) - 1ULL) << start) >> start - if (__aarch64_cpu_features.features) -return; unsigned long hwcap2 = 0; if (hwcap & _IFUNC_ARG_HWCAP) hwcap2 = arg->_hwcap2; @@ -1374,7 +1373,24 @@ setCPUFeature(FEAT_MAX); } -void CONSTRUCTOR_ATTRIBUTE init_cpu_features(void) { +void __init_cpu_features_resolver(unsigned long hwcap, + const __ifunc_arg_t *arg) { + if (__aarch64_cpu_features.features) +return; +#if defined(__ANDROID__) + // ifunc resolvers don't have hwcaps in arguments on Android API lower + // than 30. If so, set feature detection done and keep all CPU features + // unsupported (zeros). To detect this case in runtime we check existence + // of memfd_create function from Standard C library which was introduced in + // Android API 30. + int memfd_create(const char *, unsigned int) __attribute__((weak)); + if (!memfd_create) +return; +#endif // defined(__ANDROID__) + __init_cpu_features_constructor(hwcap, arg); +} + +void CONSTRUCTOR_ATTRIBUTE __init_cpu_features(void) { unsigned long hwcap; unsigned long hwcap2; // CPU features already initialized. @@ -1399,7 +1415,7 @@ arg._size = sizeof(__ifunc_arg_t); arg._hwcap = hwcap; arg._hwcap2 = hwcap2; - init_cpu_features_resolver(hwcap | _IFUNC_ARG_HWCAP, &arg); + __init_cpu_features_constructor(hwcap | _IFUNC_ARG_HWCAP, &arg); #undef extractBits #undef getCPUFeature #undef setCPUFeature Index: clang/test/Driver/aarch64-features.c === --- clang/test/Driver/aarch64-features.c +++ clang/test/Driver/aarch64-features.c @@ -7,15 +7,17 @@ // CHECK: fno-signed-char // Check Function Multi Versioning option and rtlib dependency. -// RUN: %clang --target=aarch64-linux-android -rtlib=compiler-rt \ +// RUN: %clang --target=aarch64-linux-android23 -rtlib=compiler-rt \ // RUN: -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-FMV %s - +// RUN: %clang --target=aarch64-linux-android -rtlib=compiler-rt \ +// RUN: -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-FMV-OFF %s // RUN: %clang --target=aarch64-linux-android -rtlib=compiler-rt -mno-fmv \ // RUN: -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-FMV-OFF %s +// RUN: %clang --target=aarch64-linux-android22 -rtlib=compiler-rt \ +// RUN: -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-FMV-OFF %s // RUN: %clang --target=aarch64-linux-gnu -rtlib=libgcc \ // RUN: -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-FMV-OFF %s - // RUN: %clang --target=arm64-unknown-linux -rtlib=libgcc \ // RUN: -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-FMV-OFF %s Index: clang/test/CodeGenCXX/attr-target-version.cpp === --- clang/test/CodeGenCXX/attr-target-version.cpp +++ clang/test/CodeGenCXX/attr-target-version.cpp @@ -78,7 +78,7 @@ // CHECK-NEXT:ret i32 [[ADD3]] // CHECK-LABEL: @_ZN7MyClass3gooEi.resolver( // CHECK-NEXT: resolver_entry: -// CHECK-NEXT:call void @init_cpu_features_resolver() +// CHECK-NEXT:call void @__init_cpu_features_resolver() // CHECK-NEXT:[[TMP