aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Gampe <agampe@google.com>2018-03-10 04:28:26 +0000
committerandroid-build-merger <android-build-merger@google.com>2018-03-10 04:28:26 +0000
commit6a8d0ff7682b5b7347c2be180b53dbf29c4a653e (patch)
treef352fe7b5e91bdfe93ff6b89d6683d3cc2eea7b4
parent41c87d0a0df0569db739a480d4c2eea770d397ae (diff)
parentbb494ed3b95b1725659684e606da6acb56d74fb5 (diff)
downloadperf_data_converter-6a8d0ff7682b5b7347c2be180b53dbf29c4a653e.tar.gz
PerfDataConverter: Use simpleperf's ELF reading capabilities
am: bb494ed3b9 Change-Id: I435f36a32688dfb5ee46696d1465085d278e341b
-rw-r--r--src/quipper/Android.bp104
-rw-r--r--src/quipper/dso_android.cc97
-rw-r--r--src/quipper/dso_test_utils.cc6
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), &note_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);