// // Copyright (C) 2018 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // package { default_team: "trendy_team_llvm_and_toolchains", default_applicable_licenses: ["system_extras_simpleperf_license"], } // Added automatically by a large-scale-change // See: http://go/android-license-faq license { name: "system_extras_simpleperf_license", visibility: [":__subpackages__"], license_kinds: [ "SPDX-license-identifier-Apache-2.0", ], license_text: [ "NOTICE", ], } cc_defaults { name: "libsimpleperf_readelf_defaults", static_libs: [ "libsimpleperf_readelf", ], target: { linux: { ldflags: ["-Wl,--exclude-libs=libsimpleperf_readelf.a"], }, windows: { host_ldlibs: [ "-lole32", "-luuid", ], }, }, } cc_defaults { name: "simpleperf_cflags", target: { host: { cflags: [ "-DUSE_BIONIC_UAPI_HEADERS", "-fvisibility=hidden", ], compile_multilib: "64", include_dirs: ["bionic/libc/kernel"], }, darwin: { cflags: ["-DNO_LIBDEXFILE_SUPPORT"], local_include_dirs: ["nonlinux_support/include"], }, windows: { cflags: ["-DNO_LIBDEXFILE_SUPPORT"], local_include_dirs: ["nonlinux_support/include"], }, android: { compile_multilib: "both", }, }, } // linked as a separate library because using OpenCSD headers needs to enable exception cc_library_static { name: "libsimpleperf_etm_decoder", defaults: [ "simpleperf_cflags", "libsimpleperf_readelf_defaults", ], host_supported: true, srcs: ["ETMDecoder.cpp"], cppflags: [ // flags needed to include libopencsd_decoder headers "-Wno-ignored-qualifiers", "-Wno-unused-parameter", "-Wno-switch", "-Wno-unused-private-field", "-Wno-implicit-fallthrough", "-fexceptions", ], rtti: true, static_libs: [ "libopencsd_decoder", "libbase", "liblog", ], target: { windows: { enabled: true, }, }, } // Build regex support in a separate library to catch std::regex_error exception. cc_library_static { name: "libsimpleperf_regex", host_supported: true, srcs: ["RegEx.cpp"], cppflags: ["-fexceptions"], static_libs: ["libbase"], target: { windows: { enabled: true, }, }, } cc_defaults { name: "simpleperf_static_libs", defaults: [ "libsimpleperf_readelf_defaults", "simpleperf_cflags", ], host_supported: true, static_libs: [ "libsimpleperf_etm_decoder", "libsimpleperf_regex", "libbase", "liblog", "liblzma", "libutils", "libprotobuf-cpp-lite", "libopencsd_decoder", "libz", "libziparchive", ], target: { linux: { static_libs: [ "libunwindstack", "libcutils", "libprocinfo", "libevent", "libc++fs", "librustc_demangle_static", ], }, linux_glibc_x86_64: { stl: "libc++_static", }, linux_musl_x86_64: { stl: "libc++_static", }, windows: { enabled: true, stl: "libc++_static", }, }, use_version_lib: true, } cc_defaults { name: "simpleperf_shared_libs", defaults: [ "simpleperf_cflags", "libsimpleperf_readelf_defaults", ], host_supported: true, shared_libs: [ "libbase", "liblog", "liblzma", "libprotobuf-cpp-lite", "libz", "libziparchive", ], static_libs: [ "libsimpleperf_etm_decoder", "libsimpleperf_regex", "libopencsd_decoder", ], target: { linux: { shared_libs: [ "libcutils", "libevent", "libprocinfo", "libunwindstack", ], static_libs: [ "libc++fs", "libdexfile_support", "librustc_demangle_static", ], runtime_libs: [ "libdexfile", // libdexfile_support dependency ], }, windows: { enabled: true, }, }, use_version_lib: true, } python_binary_host { name: "event_table_generator", srcs: ["event_table_generator.py"], } genrule { name: "simpleperf_event_table", out: ["event_table.cpp"], srcs: ["event_table.json"], tools: ["event_table_generator"], cmd: "$(location event_table_generator) $(in) $(out)", } cc_defaults { name: "libsimpleperf_srcs", srcs: [ "cmd_dumprecord.cpp", "cmd_help.cpp", "cmd_inject.cpp", "cmd_kmem.cpp", "cmd_merge.cpp", "cmd_report.cpp", "cmd_report_sample.cpp", "cmd_report_sample.proto", "command.cpp", "dso.cpp", "branch_list.proto", "BranchListFile.cpp", "event_attr.cpp", "event_type.cpp", "kallsyms.cpp", "perf_regs.cpp", "read_apk.cpp", "read_elf.cpp", "read_symbol_map.cpp", "record.cpp", "RecordFilter.cpp", "record_file.proto", "record_file_reader.cpp", "record_file_writer.cpp", "report_utils.cpp", "thread_tree.cpp", "tracing.cpp", "utils.cpp", ":simpleperf_event_table", ], target: { android: { srcs: [ "cmd_boot_record.cpp", ], }, linux: { srcs: [ "CallChainJoiner.cpp", "cmd_api.cpp", "cmd_debug_unwind.cpp", "cmd_list.cpp", "cmd_monitor.cpp", "cmd_record.cpp", "cmd_stat.cpp", "cmd_trace_sched.cpp", "environment.cpp", "ETMRecorder.cpp", "event_fd.cpp", "event_selection_set.cpp", "IOEventLoop.cpp", "JITDebugReader.cpp", "MapRecordReader.cpp", "OfflineUnwinder.cpp", "ProbeEvents.cpp", "read_dex_file.cpp", "RecordReadThread.cpp", "workload.cpp", ], }, darwin: { srcs: ["nonlinux_support/nonlinux_support.cpp"], }, windows: { srcs: ["nonlinux_support/nonlinux_support.cpp"], }, }, } cc_library_static { name: "libsimpleperf", defaults: [ "libsimpleperf_srcs", "simpleperf_static_libs", ], proto: { type: "lite", }, static_libs: [ "libbuildversion", ], use_version_lib: false, target: { linux: { // See note for libdexfile_static in simpleperf_ndk. static_libs: ["libdexfile_support"], runtime_libs: ["libdexfile"], // libdexfile_support dependency }, }, } // simpleperf shipped in system image cc_binary { name: "simpleperf", defaults: [ "simpleperf_shared_libs", ], host_supported: false, srcs: [ "main.cpp", ], static_libs: ["libsimpleperf"], target: { android: { compile_multilib: "first", }, }, init_rc: ["simpleperf.rc"], } cc_library { name: "libsimpleperf_profcollect", defaults: ["simpleperf_shared_libs"], srcs: ["profcollect.cpp"], host_supported: false, ldflags: ["-Wl,--exclude-libs=ALL"], static_libs: ["libsimpleperf"], shared_libs: [ "libpower", ], } rust_bindgen { name: "libsimpleperf_profcollect_bindgen", wrapper_src: "include/simpleperf_profcollect.hpp", crate_name: "simpleperf_profcollect_bindgen", source_stem: "bindings", } rust_library { name: "libsimpleperf_profcollect_rust", crate_name: "simpleperf_profcollect", srcs: ["rust/lib.rs"], rlibs: ["libsimpleperf_profcollect_bindgen"], shared_libs: ["libsimpleperf_profcollect"], visibility: ["//system/extras/profcollectd:__subpackages__"], } rust_test { name: "libsimpleperf_profcollect_bindgen_test", srcs: [":libsimpleperf_profcollect_bindgen"], crate_name: "simpleperf_profcollect_bindgen_test", test_suites: ["general-tests"], auto_gen_config: true, clippy_lints: "none", lints: "none", } // simpleperf released in ndk cc_binary { name: "simpleperf_ndk", defaults: [ "simpleperf_static_libs", ], dist: { targets: ["simpleperf"], }, multilib: { lib32: { suffix: "32", }, }, srcs: [ "main.cpp", ], static_libs: [ "libsimpleperf", ], target: { android: { static_executable: true, static_libs: [ "libc", ], }, android_arm: { dist: { dir: "simpleperf/android/arm", }, }, android_arm64: { dist: { dir: "simpleperf/android/arm64", }, }, android_x86: { dist: { dir: "simpleperf/android/x86", }, }, android_x86_64: { dist: { dir: "simpleperf/android/x86_64", }, }, host: { stem: "simpleperf", }, darwin: { dist: { dir: "simpleperf/darwin/x86", }, }, darwin_x86_64: { dist: { dir: "simpleperf/darwin/x86_64", }, }, linux: { // In the NDK we need libdexfile_static which links libdexfile and // its ART dependencies statically. However in other libraries we // must use libdexfile_support, which dlopen's libdexfile.so from // the ART APEX, to avoid getting ART internals in the system image. static_libs: ["libdexfile_static"], }, linux_glibc_x86: { dist: { dir: "simpleperf/linux/x86", }, }, linux_glibc_x86_64: { dist: { dir: "simpleperf/linux/x86_64", }, }, linux_musl_x86: { dist: { dir: "simpleperf/linux_musl/x86", }, }, linux_musl_x86_64: { dist: { dir: "simpleperf/linux_musl/x86_64", }, }, windows_x86: { dist: { dir: "simpleperf/windows/x86", }, }, windows_x86_64: { dist: { dir: "simpleperf/windows/x86_64", }, }, }, } // It's linked to user's program, to get profile counters and samples for specific code ranges. cc_library { name: "libsimpleperf_record", defaults: [ "simpleperf_static_libs", ], export_include_dirs: ["include"], ldflags: ["-Wl,--exclude-libs,ALL"], srcs: [ "record_lib_interface.cpp", ], static_libs: [ "libsimpleperf", ], target: { darwin: { enabled: false, }, windows: { enabled: false, }, linux: { // See note for libdexfile_static in simpleperf_ndk. static_libs: ["libdexfile_static"], }, }, } // It's the shared library used on host by python scripts to report samples in different ways. cc_library_shared { name: "libsimpleperf_report", defaults: [ "simpleperf_static_libs", ], dist: { targets: ["simpleperf"], }, srcs: [ "report_lib_interface.cpp", ], static_libs: ["libsimpleperf"], target: { android: { enabled: false, }, linux: { ldflags: ["-Wl,--exclude-libs,ALL"], // See note for libdexfile_static in simpleperf_ndk. static_libs: ["libdexfile_static"], }, darwin: { dist: { dir: "simpleperf/darwin/x86", }, }, darwin_x86_64: { dist: { dir: "simpleperf/darwin/x86_64", }, }, linux_glibc_x86: { dist: { dir: "simpleperf/linux/x86", }, }, linux_glibc_x86_64: { dist: { dir: "simpleperf/linux/x86_64", }, }, linux_musl_x86: { dist: { dir: "simpleperf/linux_musl/x86", }, }, linux_musl_x86_64: { dist: { dir: "simpleperf/linux_musl/x86_64", }, }, windows_x86: { dist: { dir: "simpleperf/windows/x86", }, }, windows_x86_64: { dist: { dir: "simpleperf/windows/x86_64", }, }, }, } cc_defaults { name: "simpleperf_test_srcs", tidy_timeout_srcs: [ "record_test.cpp", "cmd_report_sample_test.cpp", "cmd_report_test.cpp", ], srcs: [ "BranchListFile_test.cpp", "cmd_inject_test.cpp", "cmd_kmem_test.cpp", "cmd_merge_test.cpp", "cmd_report_test.cpp", "cmd_report_sample_test.cpp", "command_test.cpp", "dso_test.cpp", "gtest_main.cpp", "kallsyms_test.cpp", "perf_regs_test.cpp", "read_apk_test.cpp", "read_elf_test.cpp", "read_symbol_map_test.cpp", "RecordFilter_test.cpp", "RegEx_test.cpp", "record_file_test.cpp", "record_test.cpp", "report_utils_test.cpp", "sample_tree_test.cpp", "thread_tree_test.cpp", "test_util.cpp", "tracing_test.cpp", "utils_test.cpp", ], target: { android: { srcs: [ "cmd_boot_record_test.cpp", ], }, linux: { tidy_timeout_srcs: [ "cmd_stat_test.cpp", "cmd_record_test.cpp", ], srcs: [ "CallChainJoiner_test.cpp", "cmd_api_test.cpp", "cmd_debug_unwind_test.cpp", "cmd_dumprecord_test.cpp", "cmd_list_test.cpp", "cmd_record_test.cpp", "cmd_monitor_test.cpp", "cmd_stat_test.cpp", "cmd_trace_sched_test.cpp", "environment_test.cpp", "event_selection_set_test.cpp", "IOEventLoop_test.cpp", "JITDebugReader_test.cpp", "MapRecordReader_test.cpp", "OfflineUnwinder_test.cpp", "ProbeEvents_test.cpp", "read_dex_file_test.cpp", "RecordReadThread_test.cpp", "workload_test.cpp", ], }, }, } cc_test { name: "simpleperf_unit_test", defaults: [ "simpleperf_test_srcs", "simpleperf_shared_libs", ], static_libs: [ "libgmock", "libsimpleperf", ], target: { android: { test_suites: ["device-tests"], }, }, data: [ "testdata/**/*", ], sanitize: { memtag_heap: false, }, } cc_test { name: "simpleperf_cpu_hotplug_test", defaults: [ "simpleperf_shared_libs", ], test_options: { unit_test: true, }, srcs: [ "cpu_hotplug_test.cpp", ], static_libs: ["libsimpleperf"], target: { android: { test_suites: ["device-tests"], }, darwin: { enabled: false, }, windows: { enabled: false, }, }, } cc_library_static { name: "libsimpleperf_cts_test", defaults: [ "simpleperf_test_srcs", "simpleperf_shared_libs", ], host_supported: false, cflags: [ "-DIN_CTS_TEST", ], static_libs: [ "libgtest", ], whole_static_libs: [ "libgmock", "libsimpleperf", "libsimpleperf_regex", ], } cc_test { name: "simpleperf_record_test", defaults: [ "simpleperf_shared_libs", ], srcs: [ "record_lib_test.cpp", ], shared_libs: ["libsimpleperf_record"], target: { android: { test_suites: ["device-tests"], }, darwin: { enabled: false, }, windows: { enabled: false, }, }, } filegroup { name: "system-extras-simpleperf-testdata", srcs: ["CtsSimpleperfTestCases_testdata/**/*"], } cc_fuzz { name: "libsimpleperf_report_fuzzer", defaults: [ "simpleperf_static_libs", ], host_supported: true, srcs: [ "libsimpleperf_report_fuzzer.cpp", ], static_libs: [ "libsimpleperf", ], target: { linux: { // Fuzzer may not be able to load libdexfile. So statically link it. static_libs: ["libdexfile_static"], }, windows: { enabled: false, }, }, corpus: ["testdata/**/*.data"], }