diff options
Diffstat (limited to 'tools/perf/util/c++/clang.cpp')
-rw-r--r-- | tools/perf/util/c++/clang.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/tools/perf/util/c++/clang.cpp b/tools/perf/util/c++/clang.cpp index 2a1a75df204f..1e974152cac2 100644 --- a/tools/perf/util/c++/clang.cpp +++ b/tools/perf/util/c++/clang.cpp | |||
@@ -163,4 +163,33 @@ void perf_clang__cleanup(void) | |||
163 | perf::LLVMCtx.reset(nullptr); | 163 | perf::LLVMCtx.reset(nullptr); |
164 | llvm::llvm_shutdown(); | 164 | llvm::llvm_shutdown(); |
165 | } | 165 | } |
166 | |||
167 | int perf_clang__compile_bpf(const char *filename, | ||
168 | void **p_obj_buf, | ||
169 | size_t *p_obj_buf_sz) | ||
170 | { | ||
171 | using namespace perf; | ||
172 | |||
173 | if (!p_obj_buf || !p_obj_buf_sz) | ||
174 | return -EINVAL; | ||
175 | |||
176 | llvm::opt::ArgStringList CFlags; | ||
177 | auto M = getModuleFromSource(std::move(CFlags), filename); | ||
178 | if (!M) | ||
179 | return -EINVAL; | ||
180 | auto O = getBPFObjectFromModule(&*M); | ||
181 | if (!O) | ||
182 | return -EINVAL; | ||
183 | |||
184 | size_t size = O->size_in_bytes(); | ||
185 | void *buffer; | ||
186 | |||
187 | buffer = malloc(size); | ||
188 | if (!buffer) | ||
189 | return -ENOMEM; | ||
190 | memcpy(buffer, O->data(), size); | ||
191 | *p_obj_buf = buffer; | ||
192 | *p_obj_buf_sz = size; | ||
193 | return 0; | ||
194 | } | ||
166 | } | 195 | } |