-
Notifications
You must be signed in to change notification settings - Fork 114
/
Copy pathllvm_propeller_file_perf_data_provider.h
119 lines (100 loc) · 4.2 KB
/
llvm_propeller_file_perf_data_provider.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#ifndef AUTOFDOLLVM_PROPELLER_FILE_PERF_DATA_PROVIDER_H_
#define AUTOFDOLLVM_PROPELLER_FILE_PERF_DATA_PROVIDER_H_
#include "third_party/abseil/absl/base/nullability.h"
#if defined(HAVE_LLVM)
#include <memory>
#include <optional>
#include <string>
#include <utility>
#include <vector>
#include "llvm_propeller_perf_data_provider.h"
#include "third_party/abseil/absl/status/status.h"
#include "third_party/abseil/absl/status/statusor.h"
#include "third_party/abseil/absl/strings/str_cat.h"
#include "third_party/abseil/absl/strings/string_view.h"
#include "llvm/Support/ErrorOr.h"
#include "llvm/Support/MemoryBuffer.h"
#include "base/status_macros.h"
namespace devtools_crosstool_autofdo {
// File reader interface used by `FilePerfDataProvider`.
class FileReader {
public:
virtual ~FileReader() = default;
absl::Status stat;
// Reads and returns the content of the file specified with the path
// `file_name`.
virtual absl::StatusOr<std::unique_ptr<llvm::MemoryBuffer>> ReadFile(
absl::string_view file_name) = 0;
};
// Generic file reader using LLVM MemoryBuffer API.
class GenericFileReader : public FileReader {
public:
GenericFileReader() = default;
GenericFileReader(const GenericFileReader&) = delete;
GenericFileReader(GenericFileReader&&) = default;
GenericFileReader& operator=(const GenericFileReader&) = delete;
GenericFileReader& operator=(GenericFileReader&&) = default;
absl::StatusOr<std::unique_ptr<llvm::MemoryBuffer>> ReadFile(
absl::string_view file_name) override {
llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> perf_file_content =
llvm::MemoryBuffer::getFile(file_name, /*IsText=*/false,
/*RequiresNullTerminator=*/false,
/*IsVolatile=*/false);
if (!perf_file_content) {
return absl::InternalError(
absl::StrCat(perf_file_content.getError().message(),
"; When reading file ", file_name));
}
return std::move(perf_file_content.get());
}
};
// A perf.data provider interface for reading from files.
class FilePerfDataProvider : public PerfDataProvider {
public:
FilePerfDataProvider(absl::Nonnull<std::unique_ptr<FileReader>> file_reader,
std::vector<std::string> file_names)
: file_reader_(std::move(file_reader)),
file_names_(std::move(file_names)),
index_(0) {}
FilePerfDataProvider(const FilePerfDataProvider&) = delete;
FilePerfDataProvider(FilePerfDataProvider&&) = default;
FilePerfDataProvider& operator=(const FilePerfDataProvider&) = delete;
FilePerfDataProvider& operator=(FilePerfDataProvider&&) = default;
absl::StatusOr<std::optional<PerfDataProvider::BufferHandle>> GetNext()
override;
// Returns all perf data files upon the first call. Every next call returns
// an empty vector.
absl::StatusOr<std::vector<PerfDataProvider::BufferHandle>>
GetAllAvailableOrNext() override {
std::vector<PerfDataProvider::BufferHandle> result;
while (true) {
ASSIGN_OR_RETURN(std::optional<PerfDataProvider::BufferHandle> next,
GetNext());
if (!next.has_value()) return result;
result.push_back(std::move(next.value()));
}
return result;
}
private:
std::unique_ptr<FileReader> file_reader_;
std::vector<std::string> file_names_;
// Index into `file_names_` pointing to the file to be read by the next
// invocation of `GetNext()`.
int index_;
};
// Generic perf.data file provider using LLVM MemoryBuffer API.
class GenericFilePerfDataProvider : public FilePerfDataProvider {
public:
explicit GenericFilePerfDataProvider(std::vector<std::string> file_names)
: FilePerfDataProvider(std::make_unique<GenericFileReader>(),
std::move(file_names)) {}
GenericFilePerfDataProvider(const GenericFilePerfDataProvider&) = delete;
GenericFilePerfDataProvider(GenericFilePerfDataProvider&&) = default;
GenericFilePerfDataProvider& operator=(const GenericFilePerfDataProvider&) =
delete;
GenericFilePerfDataProvider& operator=(GenericFilePerfDataProvider&&) =
default;
};
} // namespace devtools_crosstool_autofdo
#endif // HAVE_LLVM
#endif // AUTOFDOLLVM_PROPELLER_FILE_PERF_DATA_PROVIDER_H_