From 1bc8ecbb9b94634f8e0f5960e79c3c21c941fa58 Mon Sep 17 00:00:00 2001 From: Yabin Cui Date: Thu, 22 Jul 2021 13:33:24 -0700 Subject: simpleperf: replace InCloudAndroid() with runtime check. On x86 and x86_64, it's likely to run on an emulator or vm without hardware perf counters. It's hard to enumerate them all. So check if hardware perf counters are available at runtime. Bug: 284801306 Test: run simpleperf_unit_test Change-Id: I38cc89bc7f81f8d6d6165a4b8f344c0660c10364 (cherry picked from commit 1f6f51aee77235b1fb374a917f0b46c9c09f0933) --- simpleperf/cmd_record_test.cpp | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/simpleperf/cmd_record_test.cpp b/simpleperf/cmd_record_test.cpp index 50730e22..ffaf649b 100644 --- a/simpleperf/cmd_record_test.cpp +++ b/simpleperf/cmd_record_test.cpp @@ -269,24 +269,10 @@ bool IsInNativeAbi() { return in_native_abi == 1; } -static bool InCloudAndroid() { -#if defined(__i386__) || defined(__x86_64__) -#if defined(__ANDROID__) - std::string prop_value = android::base::GetProperty("ro.build.flavor", ""); - if (android::base::StartsWith(prop_value, "cf_x86_phone") || - android::base::StartsWith(prop_value, "aosp_cf_x86_phone")) { - return true; - } -#endif -#endif - return false; -} - bool HasTracepointEvents() { static int has_tracepoint_events = -1; if (has_tracepoint_events == -1) { - // Cloud Android doesn't support tracepoint events. - has_tracepoint_events = InCloudAndroid() ? 0 : 1; + has_tracepoint_events = (GetTraceFsDir() != nullptr) ? 1 : 0; } return has_tracepoint_events == 1; } @@ -294,9 +280,15 @@ bool HasTracepointEvents() { bool HasHardwareCounter() { static int has_hw_counter = -1; if (has_hw_counter == -1) { - // Cloud Android doesn't have hardware counters. - has_hw_counter = InCloudAndroid() ? 0 : 1; -#if defined(__arm__) + has_hw_counter = 1; +#if defined(__x86__) || defined(__x86_64__) + // On x86 and x86_64, it's likely to run on an emulator or vm without hardware perf counters. + // It's hard to enumerate them all. So check the support at runtime. + const EventType* type = FindEventTypeByName("cpu-cycles", false); + CHECK(type != nullptr); + perf_event_attr attr = CreateDefaultPerfEventAttr(*type); + has_hw_counter = IsEventAttrSupported(attr, "cpu-cycles") ? 1 : 0; +#elif defined(__arm__) std::string cpu_info; if (android::base::ReadFileToString("/proc/cpuinfo", &cpu_info)) { std::string hardware = GetHardwareFromCpuInfo(cpu_info); @@ -307,7 +299,7 @@ bool HasHardwareCounter() { has_hw_counter = 0; } } -#endif +#endif // defined(__arm__) } return has_hw_counter == 1; } -- cgit v1.2.3