diff options
author | Andreas Gampe <agampe@google.com> | 2018-03-10 04:34:39 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2018-03-10 04:34:39 +0000 |
commit | 3e654b292865f46ba7db26add60643075187002a (patch) | |
tree | f352fe7b5e91bdfe93ff6b89d6683d3cc2eea7b4 | |
parent | 97ae1b78374e985d2fd01f6082ee4f601a75101b (diff) | |
parent | 6a8d0ff7682b5b7347c2be180b53dbf29c4a653e (diff) | |
download | perf_data_converter-3e654b292865f46ba7db26add60643075187002a.tar.gz |
PerfDataConverter: Use simpleperf's ELF reading capabilities am: bb494ed3b9
am: 6a8d0ff768
Change-Id: Iece1f3a88e7a1e49a149d77651f66ba444444ce4
-rw-r--r-- | src/quipper/Android.bp | 104 | ||||
-rw-r--r-- | src/quipper/dso_android.cc | 97 | ||||
-rw-r--r-- | src/quipper/dso_test_utils.cc | 6 |
3 files changed, 178 insertions, 29 deletions
diff --git a/src/quipper/Android.bp b/src/quipper/Android.bp index 11a1257..bdc2378 100644 --- a/src/quipper/Android.bp +++ b/src/quipper/Android.bp @@ -32,7 +32,7 @@ cc_defaults { "buffer_writer.cc", "data_reader.cc", "data_writer.cc", - "dso.cc", + "dso_android.cc", // Android-modified, rely on simpleperf/LLVM. "file_reader.cc", "file_utils.cc", "huge_page_deducer.cc", @@ -59,11 +59,10 @@ cc_defaults { ], static_libs: [ "libbase", + "libsimpleperf_elf_read", ], whole_static_libs: [ - "libcrypto", // For MD5. - "libelf", // For gelf.h, elf_version, ... - "libz", // For libelf. + "libcrypto", // For MD5. ], export_include_dirs: [ @@ -86,7 +85,6 @@ cc_library_static { name: "libquipper", defaults: [ "libquipper_defaults" ], host_supported: true, - enabled: false, proto: { type: "lite", @@ -100,7 +98,6 @@ cc_library_static { name: "libquipper-full", defaults: [ "libquipper_defaults" ], host_supported: true, - enabled: false, srcs: [ "conversion_utils.cc", @@ -116,33 +113,16 @@ cc_library_static { cc_defaults { name: "quipper_test_defaults", + host_supported: true, srcs: [ // Independent test infra. - "dso_test_utils.cc", "perf_test_files.cc", "test_perf_data.cc", "test_runner.cc", - - // Independent tests. - "address_mapper_test.cc", - "binary_data_utils_test.cc", - "buffer_reader_test.cc", - "buffer_writer_test.cc", - "dso_test.cc", - "file_reader_test.cc", - "perf_data_utils_test.cc", - "perf_option_parser_test.cc", - "perf_stat_parser_test.cc", - "run_command_test.cc", - "sample_info_reader_test.cc", - "scoped_temp_path_test.cc", ], local_include_dirs: [ "compat/non_cros", ], - static_libs: [ - "libcap", // For cap_get_proc etc. - ], cflags: [ "-Wno-ignored-qualifiers", "-Wno-missing-field-initializers", @@ -150,6 +130,9 @@ cc_defaults { "-Wno-unused", "-Wno-unused-parameter", ], + static_libs: [ + "libsimpleperf_elf_read", + ], target: { darwin: { enabled: false, @@ -157,11 +140,29 @@ cc_defaults { }, } +cc_defaults { + name: "quipper_android_test_defaults", + defaults: ["quipper_test_defaults"], + srcs: [ + // Independent tests. + "address_mapper_test.cc", + "binary_data_utils_test.cc", + "buffer_reader_test.cc", + "buffer_writer_test.cc", + "file_reader_test.cc", + "perf_data_utils_test.cc", + "perf_option_parser_test.cc", + "perf_stat_parser_test.cc", + "run_command_test.cc", + "sample_info_reader_test.cc", + "scoped_temp_path_test.cc", + ], +} + cc_test { name: "quipper_unit_tests", - defaults: [ "quipper_test_defaults" ], + defaults: [ "quipper_android_test_defaults" ], host_supported: true, - enabled: false, static_libs: [ "libbase", @@ -173,23 +174,68 @@ cc_test { cc_test { name: "quipper-full_unit_tests", - defaults: [ "quipper_test_defaults" ], + defaults: [ "quipper_android_test_defaults" ], host_supported: true, - enabled: false, srcs: [ "test_utils.cc", "conversion_utils_test.cc", - "perf_parser_test.cc", "perf_reader_test.cc", "perf_serializer_test.cc", ], static_libs: [ "libquipper-full", + "libutils", ], shared_libs: [ + "libbase", "libprotobuf-cpp-full", ], + + target: { + // Required for LLVM in libsimpleperf_elf_read. + linux_glibc: { + host_ldlibs: [ + "-lncurses", + ], + }, + }, } + +cc_test { + name: "quipper_libelf_test", + defaults: [ "quipper_test_defaults" ], + device_supported: false, + enabled: false, + + srcs: [ + "dso_test_utils.cc", + "test_utils.cc", + + "dso_test.cc", + "perf_parser_test.cc", + ], + + static_libs: [ + "libcap", // For cap_get_proc etc. + "libelf", // For gelf.h, elf_version, ... + "libquipper-full", + "libutils", + "libz", // For libelf. + ], + shared_libs: [ + "libprotobuf-cpp-full", + ], + + target: { + // Required for LLVM in libsimpleperf_elf_read. + linux_glibc: { + host_ldlibs: [ + "-lncurses", + ], + }, + }, +} + diff --git a/src/quipper/dso_android.cc b/src/quipper/dso_android.cc new file mode 100644 index 0000000..614c4e8 --- /dev/null +++ b/src/quipper/dso_android.cc @@ -0,0 +1,97 @@ +// Copyright 2016 The Chromium OS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "dso.h" + +#include <elf.h> +#include <fcntl.h> +#include <string.h> +#include <sys/stat.h> +#include <sys/sysmacros.h> +#include <unistd.h> + +#include <algorithm> +#include <vector> + +#include <build_id.h> +#include <read_elf.h> + +#include "base/logging.h" +#include "compat/string.h" +#include "file_reader.h" + +namespace quipper { + +void InitializeLibelf() { + // Unnecessary. +} + +bool ReadElfBuildId(const string &filename, string *buildid) { + BuildId id; + ElfStatus status = GetBuildIdFromElfFile(filename, &id); + if (status == ElfStatus::NO_ERROR) { + *buildid = id.ToString(); + return true; + } + return false; +} + +bool ReadElfBuildId(int fd, string *buildid) { + // TODO: Implement. b/74410255. + return false; +} + +// read /sys/module/<module_name>/notes/.note.gnu.build-id +bool ReadModuleBuildId(const string &module_name, string *buildid) { + string note_filename = + "/sys/module/" + module_name + "/notes/.note.gnu.build-id"; + + FileReader file(note_filename); + if (!file.IsOpen()) return false; + + return ReadBuildIdNote(&file, buildid); +} + +bool ReadBuildIdNote(DataReader *data, string *buildid) { + // Non-simpleperf implementation, as a reader is given. + Elf64_Nhdr note_header; + + while (data->ReadData(sizeof(note_header), ¬e_header)) { + size_t name_size = Align<4>(note_header.n_namesz); + size_t desc_size = Align<4>(note_header.n_descsz); + + string name; + if (!data->ReadString(name_size, &name)) return false; + string desc; + if (!data->ReadDataString(desc_size, &desc)) return false; + if (note_header.n_type == NT_GNU_BUILD_ID && name == ELF_NOTE_GNU) { + *buildid = desc; + return true; + } + } + return false; +} + +bool IsKernelNonModuleName(string name) { + // List from kernel: tools/perf/util/dso.c : __kmod_path__parse() + static const std::vector<string> kKernelNonModuleNames{ + "[kernel.kallsyms]", + "[guest.kernel.kallsyms", + "[vdso]", + "[vsyscall]", + }; + + for (const auto &n : kKernelNonModuleNames) { + if (name.compare(0, n.size(), n) == 0) return true; + } + return false; +} + +// Do the |DSOInfo| and |struct stat| refer to the same inode? +bool SameInode(const DSOInfo &dso, const struct stat *s) { + return dso.maj == major(s->st_dev) && dso.min == minor(s->st_dev) && + dso.ino == s->st_ino; +} + +} // namespace quipper diff --git a/src/quipper/dso_test_utils.cc b/src/quipper/dso_test_utils.cc index fd8aae0..9ba4f24 100644 --- a/src/quipper/dso_test_utils.cc +++ b/src/quipper/dso_test_utils.cc @@ -85,6 +85,12 @@ void WriteElfWithMultipleBuildids( int fd = open(filename.data(), O_WRONLY | O_CREAT | O_TRUNC, 0660); CHECK_GE(fd, 0) << strerror(errno); + // ANDROID-CHANGED: Ensure libelf is initialized, as dso_android doesn't. + { + const unsigned int kElfVersionNone = EV_NONE; // correctly typed. + CHECK_NE(kElfVersionNone, elf_version(EV_CURRENT)) << elf_errmsg(-1); + } + Elf *elf = elf_begin(fd, ELF_C_WRITE, nullptr); CHECK(elf) << elf_errmsg(-1); Elf64_Ehdr *elf_header = elf64_newehdr(elf); |