xref: /aosp_15_r20/external/bcc/src/cc/frontends/clang/loader.cc (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker /*
2*387f9dfdSAndroid Build Coastguard Worker  * Copyright (c) 2015 PLUMgrid, Inc.
3*387f9dfdSAndroid Build Coastguard Worker  *
4*387f9dfdSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*387f9dfdSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*387f9dfdSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*387f9dfdSAndroid Build Coastguard Worker  *
8*387f9dfdSAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
9*387f9dfdSAndroid Build Coastguard Worker  *
10*387f9dfdSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*387f9dfdSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*387f9dfdSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*387f9dfdSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*387f9dfdSAndroid Build Coastguard Worker  * limitations under the License.
15*387f9dfdSAndroid Build Coastguard Worker  */
16*387f9dfdSAndroid Build Coastguard Worker 
17*387f9dfdSAndroid Build Coastguard Worker #include <map>
18*387f9dfdSAndroid Build Coastguard Worker #include <string>
19*387f9dfdSAndroid Build Coastguard Worker #include <algorithm>
20*387f9dfdSAndroid Build Coastguard Worker #include <fcntl.h>
21*387f9dfdSAndroid Build Coastguard Worker #include <ftw.h>
22*387f9dfdSAndroid Build Coastguard Worker #include <map>
23*387f9dfdSAndroid Build Coastguard Worker #include <stdlib.h>
24*387f9dfdSAndroid Build Coastguard Worker #include <stdio.h>
25*387f9dfdSAndroid Build Coastguard Worker #include <string>
26*387f9dfdSAndroid Build Coastguard Worker #include <sys/stat.h>
27*387f9dfdSAndroid Build Coastguard Worker #include <sys/types.h>
28*387f9dfdSAndroid Build Coastguard Worker #include <sys/utsname.h>
29*387f9dfdSAndroid Build Coastguard Worker #include <unistd.h>
30*387f9dfdSAndroid Build Coastguard Worker #include <utility>
31*387f9dfdSAndroid Build Coastguard Worker #include <vector>
32*387f9dfdSAndroid Build Coastguard Worker #include <iostream>
33*387f9dfdSAndroid Build Coastguard Worker #include <linux/bpf.h>
34*387f9dfdSAndroid Build Coastguard Worker 
35*387f9dfdSAndroid Build Coastguard Worker #include <clang/Basic/FileManager.h>
36*387f9dfdSAndroid Build Coastguard Worker #include <clang/Basic/TargetInfo.h>
37*387f9dfdSAndroid Build Coastguard Worker #include <clang/CodeGen/BackendUtil.h>
38*387f9dfdSAndroid Build Coastguard Worker #include <clang/CodeGen/CodeGenAction.h>
39*387f9dfdSAndroid Build Coastguard Worker #include <clang/Driver/Compilation.h>
40*387f9dfdSAndroid Build Coastguard Worker #include <clang/Driver/Driver.h>
41*387f9dfdSAndroid Build Coastguard Worker #include <clang/Driver/Job.h>
42*387f9dfdSAndroid Build Coastguard Worker #include <clang/Driver/Tool.h>
43*387f9dfdSAndroid Build Coastguard Worker #include <clang/Frontend/CompilerInstance.h>
44*387f9dfdSAndroid Build Coastguard Worker #include <clang/Frontend/CompilerInvocation.h>
45*387f9dfdSAndroid Build Coastguard Worker #include <clang/Frontend/FrontendActions.h>
46*387f9dfdSAndroid Build Coastguard Worker #include <clang/Frontend/FrontendDiagnostic.h>
47*387f9dfdSAndroid Build Coastguard Worker #include <clang/Frontend/TextDiagnosticPrinter.h>
48*387f9dfdSAndroid Build Coastguard Worker #include <clang/FrontendTool/Utils.h>
49*387f9dfdSAndroid Build Coastguard Worker #include <clang/Lex/PreprocessorOptions.h>
50*387f9dfdSAndroid Build Coastguard Worker 
51*387f9dfdSAndroid Build Coastguard Worker #include <llvm/IR/Module.h>
52*387f9dfdSAndroid Build Coastguard Worker 
53*387f9dfdSAndroid Build Coastguard Worker #include "bcc_exception.h"
54*387f9dfdSAndroid Build Coastguard Worker #include "bpf_module.h"
55*387f9dfdSAndroid Build Coastguard Worker #include "exported_files.h"
56*387f9dfdSAndroid Build Coastguard Worker #include "kbuild_helper.h"
57*387f9dfdSAndroid Build Coastguard Worker #include "b_frontend_action.h"
58*387f9dfdSAndroid Build Coastguard Worker #include "tp_frontend_action.h"
59*387f9dfdSAndroid Build Coastguard Worker #include "loader.h"
60*387f9dfdSAndroid Build Coastguard Worker #include "arch_helper.h"
61*387f9dfdSAndroid Build Coastguard Worker 
62*387f9dfdSAndroid Build Coastguard Worker using std::map;
63*387f9dfdSAndroid Build Coastguard Worker using std::string;
64*387f9dfdSAndroid Build Coastguard Worker using std::unique_ptr;
65*387f9dfdSAndroid Build Coastguard Worker using std::vector;
66*387f9dfdSAndroid Build Coastguard Worker 
67*387f9dfdSAndroid Build Coastguard Worker namespace ebpf {
68*387f9dfdSAndroid Build Coastguard Worker 
get_func(std::string name)69*387f9dfdSAndroid Build Coastguard Worker optional<FuncInfo &> ProgFuncInfo::get_func(std::string name) {
70*387f9dfdSAndroid Build Coastguard Worker   auto it = funcs_.find(name);
71*387f9dfdSAndroid Build Coastguard Worker   if (it != funcs_.end())
72*387f9dfdSAndroid Build Coastguard Worker     return it->second;
73*387f9dfdSAndroid Build Coastguard Worker   return nullopt;
74*387f9dfdSAndroid Build Coastguard Worker }
75*387f9dfdSAndroid Build Coastguard Worker 
get_func(size_t id)76*387f9dfdSAndroid Build Coastguard Worker optional<FuncInfo &> ProgFuncInfo::get_func(size_t id) {
77*387f9dfdSAndroid Build Coastguard Worker   auto it = func_idx_.find(id);
78*387f9dfdSAndroid Build Coastguard Worker   if (it != func_idx_.end())
79*387f9dfdSAndroid Build Coastguard Worker     return get_func(it->second);
80*387f9dfdSAndroid Build Coastguard Worker   return nullopt;
81*387f9dfdSAndroid Build Coastguard Worker }
82*387f9dfdSAndroid Build Coastguard Worker 
func_name(size_t id)83*387f9dfdSAndroid Build Coastguard Worker optional<std::string &> ProgFuncInfo::func_name(size_t id) {
84*387f9dfdSAndroid Build Coastguard Worker   auto it = func_idx_.find(id);
85*387f9dfdSAndroid Build Coastguard Worker   if (it != func_idx_.end())
86*387f9dfdSAndroid Build Coastguard Worker     return it->second;
87*387f9dfdSAndroid Build Coastguard Worker   return nullopt;
88*387f9dfdSAndroid Build Coastguard Worker }
89*387f9dfdSAndroid Build Coastguard Worker 
for_each_func(std::function<void (std::string,FuncInfo &)> cb)90*387f9dfdSAndroid Build Coastguard Worker void ProgFuncInfo::for_each_func(
91*387f9dfdSAndroid Build Coastguard Worker     std::function<void(std::string, FuncInfo &)> cb) {
92*387f9dfdSAndroid Build Coastguard Worker   for (auto it = funcs_.begin(); it != funcs_.end(); ++it) {
93*387f9dfdSAndroid Build Coastguard Worker     cb(it->first, it->second);
94*387f9dfdSAndroid Build Coastguard Worker   }
95*387f9dfdSAndroid Build Coastguard Worker }
96*387f9dfdSAndroid Build Coastguard Worker 
add_func(std::string name)97*387f9dfdSAndroid Build Coastguard Worker optional<FuncInfo &> ProgFuncInfo::add_func(std::string name) {
98*387f9dfdSAndroid Build Coastguard Worker   auto fn = get_func(name);
99*387f9dfdSAndroid Build Coastguard Worker   if (fn)
100*387f9dfdSAndroid Build Coastguard Worker     return nullopt;
101*387f9dfdSAndroid Build Coastguard Worker   size_t current = funcs_.size();
102*387f9dfdSAndroid Build Coastguard Worker   funcs_.emplace(name, 0);
103*387f9dfdSAndroid Build Coastguard Worker   func_idx_.emplace(current, name);
104*387f9dfdSAndroid Build Coastguard Worker   return get_func(name);
105*387f9dfdSAndroid Build Coastguard Worker }
106*387f9dfdSAndroid Build Coastguard Worker 
ClangLoader(llvm::LLVMContext * ctx,unsigned flags)107*387f9dfdSAndroid Build Coastguard Worker ClangLoader::ClangLoader(llvm::LLVMContext *ctx, unsigned flags)
108*387f9dfdSAndroid Build Coastguard Worker     : ctx_(ctx), flags_(flags)
109*387f9dfdSAndroid Build Coastguard Worker {
110*387f9dfdSAndroid Build Coastguard Worker   for (auto f : ExportedFiles::headers())
111*387f9dfdSAndroid Build Coastguard Worker     remapped_headers_[f.first] = llvm::MemoryBuffer::getMemBuffer(f.second);
112*387f9dfdSAndroid Build Coastguard Worker   for (auto f : ExportedFiles::footers())
113*387f9dfdSAndroid Build Coastguard Worker     remapped_footers_[f.first] = llvm::MemoryBuffer::getMemBuffer(f.second);
114*387f9dfdSAndroid Build Coastguard Worker }
115*387f9dfdSAndroid Build Coastguard Worker 
~ClangLoader()116*387f9dfdSAndroid Build Coastguard Worker ClangLoader::~ClangLoader() {}
117*387f9dfdSAndroid Build Coastguard Worker 
add_remapped_includes(clang::CompilerInvocation & invocation)118*387f9dfdSAndroid Build Coastguard Worker void ClangLoader::add_remapped_includes(clang::CompilerInvocation& invocation)
119*387f9dfdSAndroid Build Coastguard Worker {
120*387f9dfdSAndroid Build Coastguard Worker   // This option instructs clang whether or not to free the file buffers that we
121*387f9dfdSAndroid Build Coastguard Worker   // give to it. Since the embedded header files should be copied fewer times
122*387f9dfdSAndroid Build Coastguard Worker   // and reused if possible, set this flag to true.
123*387f9dfdSAndroid Build Coastguard Worker   invocation.getPreprocessorOpts().RetainRemappedFileBuffers = true;
124*387f9dfdSAndroid Build Coastguard Worker   for (const auto &f : remapped_headers_)
125*387f9dfdSAndroid Build Coastguard Worker     invocation.getPreprocessorOpts().addRemappedFile(f.first, &*f.second);
126*387f9dfdSAndroid Build Coastguard Worker   for (const auto &f : remapped_footers_)
127*387f9dfdSAndroid Build Coastguard Worker     invocation.getPreprocessorOpts().addRemappedFile(f.first, &*f.second);
128*387f9dfdSAndroid Build Coastguard Worker }
129*387f9dfdSAndroid Build Coastguard Worker 
add_main_input(clang::CompilerInvocation & invocation,const std::string & main_path,llvm::MemoryBuffer * main_buf)130*387f9dfdSAndroid Build Coastguard Worker void ClangLoader::add_main_input(clang::CompilerInvocation& invocation,
131*387f9dfdSAndroid Build Coastguard Worker                                  const std::string& main_path,
132*387f9dfdSAndroid Build Coastguard Worker                                  llvm::MemoryBuffer *main_buf)
133*387f9dfdSAndroid Build Coastguard Worker {
134*387f9dfdSAndroid Build Coastguard Worker   invocation.getPreprocessorOpts().addRemappedFile(main_path, main_buf);
135*387f9dfdSAndroid Build Coastguard Worker   invocation.getFrontendOpts().Inputs.clear();
136*387f9dfdSAndroid Build Coastguard Worker   invocation.getFrontendOpts().Inputs.push_back(
137*387f9dfdSAndroid Build Coastguard Worker       clang::FrontendInputFile(
138*387f9dfdSAndroid Build Coastguard Worker         main_path,
139*387f9dfdSAndroid Build Coastguard Worker         clang::FrontendOptions::getInputKindForExtension("c"))
140*387f9dfdSAndroid Build Coastguard Worker   );
141*387f9dfdSAndroid Build Coastguard Worker }
142*387f9dfdSAndroid Build Coastguard Worker 
143*387f9dfdSAndroid Build Coastguard Worker namespace
144*387f9dfdSAndroid Build Coastguard Worker {
145*387f9dfdSAndroid Build Coastguard Worker 
is_dir(const string & path)146*387f9dfdSAndroid Build Coastguard Worker bool is_dir(const string& path)
147*387f9dfdSAndroid Build Coastguard Worker {
148*387f9dfdSAndroid Build Coastguard Worker   struct stat buf;
149*387f9dfdSAndroid Build Coastguard Worker 
150*387f9dfdSAndroid Build Coastguard Worker   if (::stat (path.c_str (), &buf) < 0)
151*387f9dfdSAndroid Build Coastguard Worker     return false;
152*387f9dfdSAndroid Build Coastguard Worker 
153*387f9dfdSAndroid Build Coastguard Worker   return S_ISDIR(buf.st_mode);
154*387f9dfdSAndroid Build Coastguard Worker }
155*387f9dfdSAndroid Build Coastguard Worker 
is_file(const string & path)156*387f9dfdSAndroid Build Coastguard Worker bool is_file(const string& path)
157*387f9dfdSAndroid Build Coastguard Worker {
158*387f9dfdSAndroid Build Coastguard Worker   struct stat buf;
159*387f9dfdSAndroid Build Coastguard Worker 
160*387f9dfdSAndroid Build Coastguard Worker   if (::stat (path.c_str (), &buf) < 0)
161*387f9dfdSAndroid Build Coastguard Worker     return false;
162*387f9dfdSAndroid Build Coastguard Worker 
163*387f9dfdSAndroid Build Coastguard Worker   return S_ISREG(buf.st_mode);
164*387f9dfdSAndroid Build Coastguard Worker }
165*387f9dfdSAndroid Build Coastguard Worker 
get_kernel_path_info(const string kdir)166*387f9dfdSAndroid Build Coastguard Worker std::pair<bool, string> get_kernel_path_info(const string kdir)
167*387f9dfdSAndroid Build Coastguard Worker {
168*387f9dfdSAndroid Build Coastguard Worker   if (is_dir(kdir + "/build") && is_dir(kdir + "/source"))
169*387f9dfdSAndroid Build Coastguard Worker     return std::make_pair (true, "source");
170*387f9dfdSAndroid Build Coastguard Worker 
171*387f9dfdSAndroid Build Coastguard Worker   const char* suffix_from_env = ::getenv("BCC_KERNEL_MODULES_SUFFIX");
172*387f9dfdSAndroid Build Coastguard Worker   if (suffix_from_env)
173*387f9dfdSAndroid Build Coastguard Worker     return std::make_pair(false, string(suffix_from_env));
174*387f9dfdSAndroid Build Coastguard Worker 
175*387f9dfdSAndroid Build Coastguard Worker   return std::make_pair(false, "build");
176*387f9dfdSAndroid Build Coastguard Worker }
177*387f9dfdSAndroid Build Coastguard Worker 
CreateFromArgs(clang::CompilerInvocation & invocation,const llvm::opt::ArgStringList & ccargs,clang::DiagnosticsEngine & diags)178*387f9dfdSAndroid Build Coastguard Worker static int CreateFromArgs(clang::CompilerInvocation &invocation,
179*387f9dfdSAndroid Build Coastguard Worker                           const llvm::opt::ArgStringList &ccargs,
180*387f9dfdSAndroid Build Coastguard Worker                           clang::DiagnosticsEngine &diags)
181*387f9dfdSAndroid Build Coastguard Worker {
182*387f9dfdSAndroid Build Coastguard Worker #if LLVM_VERSION_MAJOR >= 10
183*387f9dfdSAndroid Build Coastguard Worker   return clang::CompilerInvocation::CreateFromArgs(invocation, ccargs, diags);
184*387f9dfdSAndroid Build Coastguard Worker #else
185*387f9dfdSAndroid Build Coastguard Worker   return clang::CompilerInvocation::CreateFromArgs(
186*387f9dfdSAndroid Build Coastguard Worker               invocation, const_cast<const char **>(ccargs.data()),
187*387f9dfdSAndroid Build Coastguard Worker               const_cast<const char **>(ccargs.data()) + ccargs.size(), diags);
188*387f9dfdSAndroid Build Coastguard Worker #endif
189*387f9dfdSAndroid Build Coastguard Worker }
190*387f9dfdSAndroid Build Coastguard Worker 
191*387f9dfdSAndroid Build Coastguard Worker }
192*387f9dfdSAndroid Build Coastguard Worker 
parse(unique_ptr<llvm::Module> * mod,TableStorage & ts,const string & file,bool in_memory,const char * cflags[],int ncflags,const std::string & id,ProgFuncInfo & prog_func_info,std::string & mod_src,const std::string & maps_ns,fake_fd_map_def & fake_fd_map,std::map<std::string,std::vector<std::string>> & perf_events)193*387f9dfdSAndroid Build Coastguard Worker int ClangLoader::parse(
194*387f9dfdSAndroid Build Coastguard Worker     unique_ptr<llvm::Module> *mod, TableStorage &ts, const string &file,
195*387f9dfdSAndroid Build Coastguard Worker     bool in_memory, const char *cflags[], int ncflags, const std::string &id,
196*387f9dfdSAndroid Build Coastguard Worker     ProgFuncInfo &prog_func_info, std::string &mod_src,
197*387f9dfdSAndroid Build Coastguard Worker     const std::string &maps_ns, fake_fd_map_def &fake_fd_map,
198*387f9dfdSAndroid Build Coastguard Worker     std::map<std::string, std::vector<std::string>> &perf_events) {
199*387f9dfdSAndroid Build Coastguard Worker   string main_path = "/virtual/main.c";
200*387f9dfdSAndroid Build Coastguard Worker   unique_ptr<llvm::MemoryBuffer> main_buf;
201*387f9dfdSAndroid Build Coastguard Worker   struct utsname un;
202*387f9dfdSAndroid Build Coastguard Worker   uname(&un);
203*387f9dfdSAndroid Build Coastguard Worker   string kdir, kpath;
204*387f9dfdSAndroid Build Coastguard Worker   const char *kpath_env = ::getenv("BCC_KERNEL_SOURCE");
205*387f9dfdSAndroid Build Coastguard Worker   const char *version_override = ::getenv("BCC_LINUX_VERSION_CODE");
206*387f9dfdSAndroid Build Coastguard Worker   bool has_kpath_source = false;
207*387f9dfdSAndroid Build Coastguard Worker   string vmacro;
208*387f9dfdSAndroid Build Coastguard Worker   std::string tmpdir;
209*387f9dfdSAndroid Build Coastguard Worker 
210*387f9dfdSAndroid Build Coastguard Worker   if (kpath_env) {
211*387f9dfdSAndroid Build Coastguard Worker     kpath = string(kpath_env);
212*387f9dfdSAndroid Build Coastguard Worker   } else {
213*387f9dfdSAndroid Build Coastguard Worker     kdir = string(KERNEL_MODULES_DIR) + "/" + un.release;
214*387f9dfdSAndroid Build Coastguard Worker     auto kernel_path_info = get_kernel_path_info(kdir);
215*387f9dfdSAndroid Build Coastguard Worker     has_kpath_source = kernel_path_info.first;
216*387f9dfdSAndroid Build Coastguard Worker     kpath = kdir + "/" + kernel_path_info.second;
217*387f9dfdSAndroid Build Coastguard Worker   }
218*387f9dfdSAndroid Build Coastguard Worker 
219*387f9dfdSAndroid Build Coastguard Worker   // If all attempts to obtain kheaders fail, check for kheaders.tar.xz in sysfs
220*387f9dfdSAndroid Build Coastguard Worker   // Checking just for kpath existence is unsufficient, since it can refer to
221*387f9dfdSAndroid Build Coastguard Worker   // leftover build directory without headers present anymore.
222*387f9dfdSAndroid Build Coastguard Worker   // See https://github.com/iovisor/bcc/pull/3588 for more details.
223*387f9dfdSAndroid Build Coastguard Worker   if (!is_file(kpath + "/include/linux/kconfig.h")) {
224*387f9dfdSAndroid Build Coastguard Worker     int ret = get_proc_kheaders(tmpdir);
225*387f9dfdSAndroid Build Coastguard Worker     if (!ret) {
226*387f9dfdSAndroid Build Coastguard Worker       kpath = tmpdir;
227*387f9dfdSAndroid Build Coastguard Worker     } else {
228*387f9dfdSAndroid Build Coastguard Worker       std::cout << "Unable to find kernel headers. ";
229*387f9dfdSAndroid Build Coastguard Worker       std::cout << "Try rebuilding kernel with CONFIG_IKHEADERS=m (module) ";
230*387f9dfdSAndroid Build Coastguard Worker       std::cout <<  "or installing the kernel development package for your running kernel version.\n";
231*387f9dfdSAndroid Build Coastguard Worker     }
232*387f9dfdSAndroid Build Coastguard Worker   }
233*387f9dfdSAndroid Build Coastguard Worker 
234*387f9dfdSAndroid Build Coastguard Worker   if (flags_ & DEBUG_PREPROCESSOR)
235*387f9dfdSAndroid Build Coastguard Worker     std::cout << "Running from kernel directory at: " << kpath.c_str() << "\n";
236*387f9dfdSAndroid Build Coastguard Worker 
237*387f9dfdSAndroid Build Coastguard Worker   // clang needs to run inside the kernel dir
238*387f9dfdSAndroid Build Coastguard Worker   DirStack dstack(kpath);
239*387f9dfdSAndroid Build Coastguard Worker   if (!dstack.ok())
240*387f9dfdSAndroid Build Coastguard Worker     return -1;
241*387f9dfdSAndroid Build Coastguard Worker 
242*387f9dfdSAndroid Build Coastguard Worker   string abs_file;
243*387f9dfdSAndroid Build Coastguard Worker   if (in_memory) {
244*387f9dfdSAndroid Build Coastguard Worker     abs_file = main_path;
245*387f9dfdSAndroid Build Coastguard Worker     main_buf = llvm::MemoryBuffer::getMemBuffer(file);
246*387f9dfdSAndroid Build Coastguard Worker   } else {
247*387f9dfdSAndroid Build Coastguard Worker     if (file.substr(0, 1) == "/")
248*387f9dfdSAndroid Build Coastguard Worker       abs_file = file;
249*387f9dfdSAndroid Build Coastguard Worker     else
250*387f9dfdSAndroid Build Coastguard Worker       abs_file = string(dstack.cwd()) + "/" + file;
251*387f9dfdSAndroid Build Coastguard Worker   }
252*387f9dfdSAndroid Build Coastguard Worker 
253*387f9dfdSAndroid Build Coastguard Worker   // -fno-color-diagnostics: this is a workaround for a bug in llvm terminalHasColors() as of
254*387f9dfdSAndroid Build Coastguard Worker   // 22 Jul 2016. Also see bcc #615.
255*387f9dfdSAndroid Build Coastguard Worker   // Enable -O2 for clang. In clang 5.0, -O0 may result in function marking as
256*387f9dfdSAndroid Build Coastguard Worker   // noinline and optnone (if not always inlining).
257*387f9dfdSAndroid Build Coastguard Worker   // Note that first argument is ignored in clang compilation invocation.
258*387f9dfdSAndroid Build Coastguard Worker   // "-D __BPF_TRACING__" below is added to suppress a warning in 4.17+.
259*387f9dfdSAndroid Build Coastguard Worker   // It can be removed once clang supports asm-goto or the kernel removes
260*387f9dfdSAndroid Build Coastguard Worker   // the warning.
261*387f9dfdSAndroid Build Coastguard Worker   vector<const char *> flags_cstr({"-O0", "-O2", "-emit-llvm", "-I", dstack.cwd(),
262*387f9dfdSAndroid Build Coastguard Worker                                    "-D", "__BPF_TRACING__",
263*387f9dfdSAndroid Build Coastguard Worker                                    "-Wno-deprecated-declarations",
264*387f9dfdSAndroid Build Coastguard Worker                                    "-Wno-gnu-variable-sized-type-not-at-end",
265*387f9dfdSAndroid Build Coastguard Worker                                    "-Wno-pragma-once-outside-header",
266*387f9dfdSAndroid Build Coastguard Worker                                    "-Wno-address-of-packed-member",
267*387f9dfdSAndroid Build Coastguard Worker                                    "-Wno-unknown-warning-option",
268*387f9dfdSAndroid Build Coastguard Worker                                    "-fno-color-diagnostics",
269*387f9dfdSAndroid Build Coastguard Worker                                    "-fno-unwind-tables",
270*387f9dfdSAndroid Build Coastguard Worker                                    "-fno-asynchronous-unwind-tables",
271*387f9dfdSAndroid Build Coastguard Worker                                    "-x", "c", "-c", abs_file.c_str()});
272*387f9dfdSAndroid Build Coastguard Worker 
273*387f9dfdSAndroid Build Coastguard Worker   const char *arch = getenv("ARCH");
274*387f9dfdSAndroid Build Coastguard Worker   if (!arch)
275*387f9dfdSAndroid Build Coastguard Worker     arch = un.machine;
276*387f9dfdSAndroid Build Coastguard Worker 
277*387f9dfdSAndroid Build Coastguard Worker   if (!strncmp(arch, "mips", 4)) {
278*387f9dfdSAndroid Build Coastguard Worker     flags_cstr.push_back("-D__MIPSEL__");
279*387f9dfdSAndroid Build Coastguard Worker     flags_cstr.push_back("-D_MIPS_SZLONG=64");
280*387f9dfdSAndroid Build Coastguard Worker   }
281*387f9dfdSAndroid Build Coastguard Worker 
282*387f9dfdSAndroid Build Coastguard Worker   KBuildHelper kbuild_helper(kpath_env ? kpath : kdir, has_kpath_source);
283*387f9dfdSAndroid Build Coastguard Worker 
284*387f9dfdSAndroid Build Coastguard Worker   vector<string> kflags;
285*387f9dfdSAndroid Build Coastguard Worker   if (kbuild_helper.get_flags(un.machine, &kflags))
286*387f9dfdSAndroid Build Coastguard Worker     return -1;
287*387f9dfdSAndroid Build Coastguard Worker #if LLVM_VERSION_MAJOR >= 9
288*387f9dfdSAndroid Build Coastguard Worker   flags_cstr.push_back("-g");
289*387f9dfdSAndroid Build Coastguard Worker   flags_cstr.push_back("-gdwarf-4");
290*387f9dfdSAndroid Build Coastguard Worker #else
291*387f9dfdSAndroid Build Coastguard Worker   if (flags_ & DEBUG_SOURCE)
292*387f9dfdSAndroid Build Coastguard Worker     flags_cstr.push_back("-g");
293*387f9dfdSAndroid Build Coastguard Worker #endif
294*387f9dfdSAndroid Build Coastguard Worker   for (auto it = kflags.begin(); it != kflags.end(); ++it)
295*387f9dfdSAndroid Build Coastguard Worker     flags_cstr.push_back(it->c_str());
296*387f9dfdSAndroid Build Coastguard Worker 
297*387f9dfdSAndroid Build Coastguard Worker   vector<const char *> flags_cstr_rem;
298*387f9dfdSAndroid Build Coastguard Worker 
299*387f9dfdSAndroid Build Coastguard Worker   if (version_override) {
300*387f9dfdSAndroid Build Coastguard Worker     vmacro = "-DLINUX_VERSION_CODE_OVERRIDE=" + string(version_override);
301*387f9dfdSAndroid Build Coastguard Worker 
302*387f9dfdSAndroid Build Coastguard Worker     std::cout << "WARNING: Linux version for eBPF program is being overridden with: " << version_override << "\n";
303*387f9dfdSAndroid Build Coastguard Worker     std::cout << "WARNING: Due to this, the results of the program may be unpredictable\n";
304*387f9dfdSAndroid Build Coastguard Worker     flags_cstr_rem.push_back(vmacro.c_str());
305*387f9dfdSAndroid Build Coastguard Worker   }
306*387f9dfdSAndroid Build Coastguard Worker 
307*387f9dfdSAndroid Build Coastguard Worker   flags_cstr_rem.push_back("-include");
308*387f9dfdSAndroid Build Coastguard Worker   flags_cstr_rem.push_back("/virtual/include/bcc/helpers.h");
309*387f9dfdSAndroid Build Coastguard Worker   flags_cstr_rem.push_back("-isystem");
310*387f9dfdSAndroid Build Coastguard Worker   flags_cstr_rem.push_back("/virtual/include");
311*387f9dfdSAndroid Build Coastguard Worker   if (cflags) {
312*387f9dfdSAndroid Build Coastguard Worker     for (auto i = 0; i < ncflags; ++i)
313*387f9dfdSAndroid Build Coastguard Worker       flags_cstr_rem.push_back(cflags[i]);
314*387f9dfdSAndroid Build Coastguard Worker   }
315*387f9dfdSAndroid Build Coastguard Worker #ifdef CUR_CPU_IDENTIFIER
316*387f9dfdSAndroid Build Coastguard Worker   string cur_cpu_flag = string("-DCUR_CPU_IDENTIFIER=") + CUR_CPU_IDENTIFIER;
317*387f9dfdSAndroid Build Coastguard Worker   flags_cstr_rem.push_back(cur_cpu_flag.c_str());
318*387f9dfdSAndroid Build Coastguard Worker #endif
319*387f9dfdSAndroid Build Coastguard Worker 
320*387f9dfdSAndroid Build Coastguard Worker   if (do_compile(mod, ts, in_memory, flags_cstr, flags_cstr_rem, main_path,
321*387f9dfdSAndroid Build Coastguard Worker                  main_buf, id, prog_func_info, mod_src, true, maps_ns,
322*387f9dfdSAndroid Build Coastguard Worker                  fake_fd_map, perf_events)) {
323*387f9dfdSAndroid Build Coastguard Worker #if BCC_BACKUP_COMPILE != 1
324*387f9dfdSAndroid Build Coastguard Worker     return -1;
325*387f9dfdSAndroid Build Coastguard Worker #else
326*387f9dfdSAndroid Build Coastguard Worker     // try one more time to compile with system bpf.h
327*387f9dfdSAndroid Build Coastguard Worker     llvm::errs() << "WARNING: compilation failure, trying with system bpf.h\n";
328*387f9dfdSAndroid Build Coastguard Worker 
329*387f9dfdSAndroid Build Coastguard Worker     ts.DeletePrefix(Path({id}));
330*387f9dfdSAndroid Build Coastguard Worker     prog_func_info.clear();
331*387f9dfdSAndroid Build Coastguard Worker     mod_src.clear();
332*387f9dfdSAndroid Build Coastguard Worker     fake_fd_map.clear();
333*387f9dfdSAndroid Build Coastguard Worker     if (do_compile(mod, ts, in_memory, flags_cstr, flags_cstr_rem, main_path,
334*387f9dfdSAndroid Build Coastguard Worker                    main_buf, id, prog_func_info, mod_src, false, maps_ns,
335*387f9dfdSAndroid Build Coastguard Worker                    fake_fd_map, perf_events))
336*387f9dfdSAndroid Build Coastguard Worker       return -1;
337*387f9dfdSAndroid Build Coastguard Worker #endif
338*387f9dfdSAndroid Build Coastguard Worker   }
339*387f9dfdSAndroid Build Coastguard Worker 
340*387f9dfdSAndroid Build Coastguard Worker   return 0;
341*387f9dfdSAndroid Build Coastguard Worker }
342*387f9dfdSAndroid Build Coastguard Worker 
get_clang_target_cb(bcc_arch_t arch,bool for_syscall)343*387f9dfdSAndroid Build Coastguard Worker void *get_clang_target_cb(bcc_arch_t arch, bool for_syscall)
344*387f9dfdSAndroid Build Coastguard Worker {
345*387f9dfdSAndroid Build Coastguard Worker   const char *ret;
346*387f9dfdSAndroid Build Coastguard Worker 
347*387f9dfdSAndroid Build Coastguard Worker   switch(arch) {
348*387f9dfdSAndroid Build Coastguard Worker     case BCC_ARCH_PPC_LE:
349*387f9dfdSAndroid Build Coastguard Worker       ret = "powerpc64le-unknown-linux-gnu";
350*387f9dfdSAndroid Build Coastguard Worker       break;
351*387f9dfdSAndroid Build Coastguard Worker     case BCC_ARCH_PPC:
352*387f9dfdSAndroid Build Coastguard Worker       ret = "powerpc64-unknown-linux-gnu";
353*387f9dfdSAndroid Build Coastguard Worker       break;
354*387f9dfdSAndroid Build Coastguard Worker     case BCC_ARCH_S390X:
355*387f9dfdSAndroid Build Coastguard Worker       ret = "s390x-ibm-linux-gnu";
356*387f9dfdSAndroid Build Coastguard Worker       break;
357*387f9dfdSAndroid Build Coastguard Worker     case BCC_ARCH_ARM64:
358*387f9dfdSAndroid Build Coastguard Worker       ret = "aarch64-unknown-linux-gnu";
359*387f9dfdSAndroid Build Coastguard Worker       break;
360*387f9dfdSAndroid Build Coastguard Worker     case BCC_ARCH_MIPS:
361*387f9dfdSAndroid Build Coastguard Worker       ret = "mips64el-unknown-linux-gnuabi64";
362*387f9dfdSAndroid Build Coastguard Worker       break;
363*387f9dfdSAndroid Build Coastguard Worker     case BCC_ARCH_RISCV64:
364*387f9dfdSAndroid Build Coastguard Worker       ret = "riscv64-unknown-linux-gnu";
365*387f9dfdSAndroid Build Coastguard Worker       break;
366*387f9dfdSAndroid Build Coastguard Worker     case BCC_ARCH_LOONGARCH:
367*387f9dfdSAndroid Build Coastguard Worker       ret = "loongarch64-unknown-linux-gnu";
368*387f9dfdSAndroid Build Coastguard Worker       break;
369*387f9dfdSAndroid Build Coastguard Worker     default:
370*387f9dfdSAndroid Build Coastguard Worker       ret = "x86_64-unknown-linux-gnu";
371*387f9dfdSAndroid Build Coastguard Worker   }
372*387f9dfdSAndroid Build Coastguard Worker 
373*387f9dfdSAndroid Build Coastguard Worker   return (void *)ret;
374*387f9dfdSAndroid Build Coastguard Worker }
375*387f9dfdSAndroid Build Coastguard Worker 
get_clang_target(void)376*387f9dfdSAndroid Build Coastguard Worker string get_clang_target(void) {
377*387f9dfdSAndroid Build Coastguard Worker   const char *ret;
378*387f9dfdSAndroid Build Coastguard Worker 
379*387f9dfdSAndroid Build Coastguard Worker   ret = (const char *)run_arch_callback(get_clang_target_cb);
380*387f9dfdSAndroid Build Coastguard Worker   return string(ret);
381*387f9dfdSAndroid Build Coastguard Worker }
382*387f9dfdSAndroid Build Coastguard Worker 
do_compile(unique_ptr<llvm::Module> * mod,TableStorage & ts,bool in_memory,const vector<const char * > & flags_cstr_in,const vector<const char * > & flags_cstr_rem,const std::string & main_path,const unique_ptr<llvm::MemoryBuffer> & main_buf,const std::string & id,ProgFuncInfo & prog_func_info,std::string & mod_src,bool use_internal_bpfh,const std::string & maps_ns,fake_fd_map_def & fake_fd_map,std::map<std::string,std::vector<std::string>> & perf_events)383*387f9dfdSAndroid Build Coastguard Worker int ClangLoader::do_compile(
384*387f9dfdSAndroid Build Coastguard Worker     unique_ptr<llvm::Module> *mod, TableStorage &ts, bool in_memory,
385*387f9dfdSAndroid Build Coastguard Worker     const vector<const char *> &flags_cstr_in,
386*387f9dfdSAndroid Build Coastguard Worker     const vector<const char *> &flags_cstr_rem, const std::string &main_path,
387*387f9dfdSAndroid Build Coastguard Worker     const unique_ptr<llvm::MemoryBuffer> &main_buf, const std::string &id,
388*387f9dfdSAndroid Build Coastguard Worker     ProgFuncInfo &prog_func_info, std::string &mod_src, bool use_internal_bpfh,
389*387f9dfdSAndroid Build Coastguard Worker     const std::string &maps_ns, fake_fd_map_def &fake_fd_map,
390*387f9dfdSAndroid Build Coastguard Worker     std::map<std::string, std::vector<std::string>> &perf_events) {
391*387f9dfdSAndroid Build Coastguard Worker   using namespace clang;
392*387f9dfdSAndroid Build Coastguard Worker 
393*387f9dfdSAndroid Build Coastguard Worker   vector<const char *> flags_cstr = flags_cstr_in;
394*387f9dfdSAndroid Build Coastguard Worker   if (use_internal_bpfh) {
395*387f9dfdSAndroid Build Coastguard Worker     flags_cstr.push_back("-include");
396*387f9dfdSAndroid Build Coastguard Worker     flags_cstr.push_back("/virtual/include/bcc/bpf.h");
397*387f9dfdSAndroid Build Coastguard Worker   }
398*387f9dfdSAndroid Build Coastguard Worker   flags_cstr.push_back("-include");
399*387f9dfdSAndroid Build Coastguard Worker   flags_cstr.push_back("/virtual/include/bcc/bpf_workaround.h");
400*387f9dfdSAndroid Build Coastguard Worker   flags_cstr.insert(flags_cstr.end(), flags_cstr_rem.begin(),
401*387f9dfdSAndroid Build Coastguard Worker                     flags_cstr_rem.end());
402*387f9dfdSAndroid Build Coastguard Worker 
403*387f9dfdSAndroid Build Coastguard Worker   // set up the error reporting class
404*387f9dfdSAndroid Build Coastguard Worker   IntrusiveRefCntPtr<DiagnosticOptions> diag_opts(new DiagnosticOptions());
405*387f9dfdSAndroid Build Coastguard Worker   auto diag_client = new TextDiagnosticPrinter(llvm::errs(), &*diag_opts);
406*387f9dfdSAndroid Build Coastguard Worker 
407*387f9dfdSAndroid Build Coastguard Worker   IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
408*387f9dfdSAndroid Build Coastguard Worker   DiagnosticsEngine diags(DiagID, &*diag_opts, diag_client);
409*387f9dfdSAndroid Build Coastguard Worker 
410*387f9dfdSAndroid Build Coastguard Worker   // set up the command line argument wrapper
411*387f9dfdSAndroid Build Coastguard Worker 
412*387f9dfdSAndroid Build Coastguard Worker   string target_triple = get_clang_target();
413*387f9dfdSAndroid Build Coastguard Worker   driver::Driver drv("", target_triple, diags);
414*387f9dfdSAndroid Build Coastguard Worker 
415*387f9dfdSAndroid Build Coastguard Worker #if LLVM_VERSION_MAJOR >= 4
416*387f9dfdSAndroid Build Coastguard Worker   if (target_triple == "x86_64-unknown-linux-gnu" || target_triple == "aarch64-unknown-linux-gnu")
417*387f9dfdSAndroid Build Coastguard Worker     flags_cstr.push_back("-fno-jump-tables");
418*387f9dfdSAndroid Build Coastguard Worker #endif
419*387f9dfdSAndroid Build Coastguard Worker 
420*387f9dfdSAndroid Build Coastguard Worker   drv.setTitle("bcc-clang-driver");
421*387f9dfdSAndroid Build Coastguard Worker   drv.setCheckInputsExist(false);
422*387f9dfdSAndroid Build Coastguard Worker 
423*387f9dfdSAndroid Build Coastguard Worker   unique_ptr<driver::Compilation> compilation(drv.BuildCompilation(flags_cstr));
424*387f9dfdSAndroid Build Coastguard Worker   if (!compilation)
425*387f9dfdSAndroid Build Coastguard Worker     return -1;
426*387f9dfdSAndroid Build Coastguard Worker 
427*387f9dfdSAndroid Build Coastguard Worker   // expect exactly 1 job, otherwise error
428*387f9dfdSAndroid Build Coastguard Worker   const driver::JobList &jobs = compilation->getJobs();
429*387f9dfdSAndroid Build Coastguard Worker   if (jobs.size() != 1 || !isa<driver::Command>(*jobs.begin())) {
430*387f9dfdSAndroid Build Coastguard Worker     SmallString<256> msg;
431*387f9dfdSAndroid Build Coastguard Worker     llvm::raw_svector_ostream os(msg);
432*387f9dfdSAndroid Build Coastguard Worker     jobs.Print(os, "; ", true);
433*387f9dfdSAndroid Build Coastguard Worker     diags.Report(diag::err_fe_expected_compiler_job) << os.str();
434*387f9dfdSAndroid Build Coastguard Worker     return -1;
435*387f9dfdSAndroid Build Coastguard Worker   }
436*387f9dfdSAndroid Build Coastguard Worker 
437*387f9dfdSAndroid Build Coastguard Worker   const driver::Command &cmd = cast<driver::Command>(*jobs.begin());
438*387f9dfdSAndroid Build Coastguard Worker   if (llvm::StringRef(cmd.getCreator().getName()) != "clang") {
439*387f9dfdSAndroid Build Coastguard Worker     diags.Report(diag::err_fe_expected_clang_command);
440*387f9dfdSAndroid Build Coastguard Worker     return -1;
441*387f9dfdSAndroid Build Coastguard Worker   }
442*387f9dfdSAndroid Build Coastguard Worker 
443*387f9dfdSAndroid Build Coastguard Worker   // Initialize a compiler invocation object from the clang (-cc1) arguments.
444*387f9dfdSAndroid Build Coastguard Worker   const llvm::opt::ArgStringList &ccargs = cmd.getArguments();
445*387f9dfdSAndroid Build Coastguard Worker 
446*387f9dfdSAndroid Build Coastguard Worker   if (flags_ & DEBUG_PREPROCESSOR) {
447*387f9dfdSAndroid Build Coastguard Worker     llvm::errs() << "clang";
448*387f9dfdSAndroid Build Coastguard Worker     for (auto arg : ccargs)
449*387f9dfdSAndroid Build Coastguard Worker       llvm::errs() << " " << arg;
450*387f9dfdSAndroid Build Coastguard Worker     llvm::errs() << "\n";
451*387f9dfdSAndroid Build Coastguard Worker   }
452*387f9dfdSAndroid Build Coastguard Worker 
453*387f9dfdSAndroid Build Coastguard Worker   // pre-compilation pass for generating tracepoint structures
454*387f9dfdSAndroid Build Coastguard Worker   CompilerInstance compiler0;
455*387f9dfdSAndroid Build Coastguard Worker   CompilerInvocation &invocation0 = compiler0.getInvocation();
456*387f9dfdSAndroid Build Coastguard Worker   if (!CreateFromArgs(invocation0, ccargs, diags))
457*387f9dfdSAndroid Build Coastguard Worker     return -1;
458*387f9dfdSAndroid Build Coastguard Worker 
459*387f9dfdSAndroid Build Coastguard Worker   add_remapped_includes(invocation0);
460*387f9dfdSAndroid Build Coastguard Worker 
461*387f9dfdSAndroid Build Coastguard Worker   if (in_memory) {
462*387f9dfdSAndroid Build Coastguard Worker     add_main_input(invocation0, main_path, &*main_buf);
463*387f9dfdSAndroid Build Coastguard Worker   }
464*387f9dfdSAndroid Build Coastguard Worker   invocation0.getFrontendOpts().DisableFree = false;
465*387f9dfdSAndroid Build Coastguard Worker 
466*387f9dfdSAndroid Build Coastguard Worker   compiler0.createDiagnostics(new IgnoringDiagConsumer());
467*387f9dfdSAndroid Build Coastguard Worker 
468*387f9dfdSAndroid Build Coastguard Worker   // capture the rewritten c file
469*387f9dfdSAndroid Build Coastguard Worker   string out_str;
470*387f9dfdSAndroid Build Coastguard Worker   llvm::raw_string_ostream os(out_str);
471*387f9dfdSAndroid Build Coastguard Worker   TracepointFrontendAction tpact(os);
472*387f9dfdSAndroid Build Coastguard Worker   compiler0.ExecuteAction(tpact); // ignore errors, they will be reported later
473*387f9dfdSAndroid Build Coastguard Worker   unique_ptr<llvm::MemoryBuffer> out_buf = llvm::MemoryBuffer::getMemBuffer(out_str);
474*387f9dfdSAndroid Build Coastguard Worker 
475*387f9dfdSAndroid Build Coastguard Worker   // first pass
476*387f9dfdSAndroid Build Coastguard Worker   CompilerInstance compiler1;
477*387f9dfdSAndroid Build Coastguard Worker   CompilerInvocation &invocation1 = compiler1.getInvocation();
478*387f9dfdSAndroid Build Coastguard Worker   if (!CreateFromArgs( invocation1, ccargs, diags))
479*387f9dfdSAndroid Build Coastguard Worker     return -1;
480*387f9dfdSAndroid Build Coastguard Worker 
481*387f9dfdSAndroid Build Coastguard Worker   add_remapped_includes(invocation1);
482*387f9dfdSAndroid Build Coastguard Worker   add_main_input(invocation1, main_path, &*out_buf);
483*387f9dfdSAndroid Build Coastguard Worker   invocation1.getFrontendOpts().DisableFree = false;
484*387f9dfdSAndroid Build Coastguard Worker 
485*387f9dfdSAndroid Build Coastguard Worker   compiler1.createDiagnostics();
486*387f9dfdSAndroid Build Coastguard Worker 
487*387f9dfdSAndroid Build Coastguard Worker   // capture the rewritten c file
488*387f9dfdSAndroid Build Coastguard Worker   string out_str1;
489*387f9dfdSAndroid Build Coastguard Worker   llvm::raw_string_ostream os1(out_str1);
490*387f9dfdSAndroid Build Coastguard Worker   BFrontendAction bact(os1, flags_, ts, id, main_path, prog_func_info, mod_src,
491*387f9dfdSAndroid Build Coastguard Worker                        maps_ns, fake_fd_map, perf_events);
492*387f9dfdSAndroid Build Coastguard Worker   if (!compiler1.ExecuteAction(bact))
493*387f9dfdSAndroid Build Coastguard Worker     return -1;
494*387f9dfdSAndroid Build Coastguard Worker   unique_ptr<llvm::MemoryBuffer> out_buf1 = llvm::MemoryBuffer::getMemBuffer(out_str1);
495*387f9dfdSAndroid Build Coastguard Worker 
496*387f9dfdSAndroid Build Coastguard Worker   // second pass, clear input and take rewrite buffer
497*387f9dfdSAndroid Build Coastguard Worker   CompilerInstance compiler2;
498*387f9dfdSAndroid Build Coastguard Worker   CompilerInvocation &invocation2 = compiler2.getInvocation();
499*387f9dfdSAndroid Build Coastguard Worker   if (!CreateFromArgs(invocation2, ccargs, diags))
500*387f9dfdSAndroid Build Coastguard Worker     return -1;
501*387f9dfdSAndroid Build Coastguard Worker 
502*387f9dfdSAndroid Build Coastguard Worker   add_remapped_includes(invocation2);
503*387f9dfdSAndroid Build Coastguard Worker   add_main_input(invocation2, main_path, &*out_buf1);
504*387f9dfdSAndroid Build Coastguard Worker   invocation2.getFrontendOpts().DisableFree = false;
505*387f9dfdSAndroid Build Coastguard Worker   invocation2.getCodeGenOpts().DisableFree = false;
506*387f9dfdSAndroid Build Coastguard Worker   // Resort to normal inlining. In -O0 the default is OnlyAlwaysInlining and
507*387f9dfdSAndroid Build Coastguard Worker   // clang might add noinline attribute even for functions with inline hint.
508*387f9dfdSAndroid Build Coastguard Worker   invocation2.getCodeGenOpts().setInlining(CodeGenOptions::NormalInlining);
509*387f9dfdSAndroid Build Coastguard Worker   // suppress warnings in the 2nd pass, but bail out on errors (our fault)
510*387f9dfdSAndroid Build Coastguard Worker   invocation2.getDiagnosticOpts().IgnoreWarnings = true;
511*387f9dfdSAndroid Build Coastguard Worker   compiler2.createDiagnostics();
512*387f9dfdSAndroid Build Coastguard Worker 
513*387f9dfdSAndroid Build Coastguard Worker   EmitLLVMOnlyAction ir_act(&*ctx_);
514*387f9dfdSAndroid Build Coastguard Worker   if (!compiler2.ExecuteAction(ir_act))
515*387f9dfdSAndroid Build Coastguard Worker     return -1;
516*387f9dfdSAndroid Build Coastguard Worker   *mod = ir_act.takeModule();
517*387f9dfdSAndroid Build Coastguard Worker 
518*387f9dfdSAndroid Build Coastguard Worker   return 0;
519*387f9dfdSAndroid Build Coastguard Worker }
520*387f9dfdSAndroid Build Coastguard Worker }  // namespace ebpf
521