diff options
Diffstat (limited to 'src/cc/frontends/clang/loader.cc')
-rw-r--r-- | src/cc/frontends/clang/loader.cc | 104 |
1 files changed, 59 insertions, 45 deletions
diff --git a/src/cc/frontends/clang/loader.cc b/src/cc/frontends/clang/loader.cc index 4f9914a2..d0f4d880 100644 --- a/src/cc/frontends/clang/loader.cc +++ b/src/cc/frontends/clang/loader.cc @@ -66,6 +66,44 @@ using std::vector; namespace ebpf { +optional<FuncInfo &> ProgFuncInfo::get_func(std::string name) { + auto it = funcs_.find(name); + if (it != funcs_.end()) + return it->second; + return nullopt; +} + +optional<FuncInfo &> ProgFuncInfo::get_func(size_t id) { + auto it = func_idx_.find(id); + if (it != func_idx_.end()) + return get_func(it->second); + return nullopt; +} + +optional<std::string &> ProgFuncInfo::func_name(size_t id) { + auto it = func_idx_.find(id); + if (it != func_idx_.end()) + return it->second; + return nullopt; +} + +void ProgFuncInfo::for_each_func( + std::function<void(std::string, FuncInfo &)> cb) { + for (auto it = funcs_.begin(); it != funcs_.end(); ++it) { + cb(it->first, it->second); + } +} + +optional<FuncInfo &> ProgFuncInfo::add_func(std::string name) { + auto fn = get_func(name); + if (fn) + return nullopt; + size_t current = funcs_.size(); + funcs_.emplace(name, 0); + func_idx_.emplace(current, name); + return get_func(name); +} + ClangLoader::ClangLoader(llvm::LLVMContext *ctx, unsigned flags) : ctx_(ctx), flags_(flags) { @@ -152,13 +190,12 @@ static int CreateFromArgs(clang::CompilerInvocation &invocation, } -int ClangLoader::parse(unique_ptr<llvm::Module> *mod, TableStorage &ts, - const string &file, bool in_memory, const char *cflags[], - int ncflags, const std::string &id, FuncSource &func_src, - 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) { +int ClangLoader::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) { string main_path = "/virtual/main.c"; unique_ptr<llvm::MemoryBuffer> main_buf; struct utsname un; @@ -249,6 +286,7 @@ int ClangLoader::parse(unique_ptr<llvm::Module> *mod, TableStorage &ts, return -1; #if LLVM_MAJOR_VERSION >= 9 flags_cstr.push_back("-g"); + flags_cstr.push_back("-gdwarf-4"); #else if (flags_ & DEBUG_SOURCE) flags_cstr.push_back("-g"); @@ -280,7 +318,8 @@ int ClangLoader::parse(unique_ptr<llvm::Module> *mod, TableStorage &ts, #endif if (do_compile(mod, ts, in_memory, flags_cstr, flags_cstr_rem, main_path, - main_buf, id, func_src, mod_src, true, maps_ns, fake_fd_map, perf_events)) { + main_buf, id, prog_func_info, mod_src, true, maps_ns, + fake_fd_map, perf_events)) { #if BCC_BACKUP_COMPILE != 1 return -1; #else @@ -288,11 +327,12 @@ int ClangLoader::parse(unique_ptr<llvm::Module> *mod, TableStorage &ts, llvm::errs() << "WARNING: compilation failure, trying with system bpf.h\n"; ts.DeletePrefix(Path({id})); - func_src.clear(); + prog_func_info.clear(); mod_src.clear(); fake_fd_map.clear(); if (do_compile(mod, ts, in_memory, flags_cstr, flags_cstr_rem, main_path, - main_buf, id, func_src, mod_src, false, maps_ns, fake_fd_map, perf_events)) + main_buf, id, prog_func_info, mod_src, false, maps_ns, + fake_fd_map, perf_events)) return -1; #endif } @@ -334,17 +374,14 @@ string get_clang_target(void) { return string(ret); } -int ClangLoader::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, FuncSource &func_src, - 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) { +int ClangLoader::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) { using namespace clang; vector<const char *> flags_cstr = flags_cstr_in; @@ -444,7 +481,7 @@ int ClangLoader::do_compile(unique_ptr<llvm::Module> *mod, TableStorage &ts, // capture the rewritten c file string out_str1; llvm::raw_string_ostream os1(out_str1); - BFrontendAction bact(os1, flags_, ts, id, main_path, func_src, mod_src, + BFrontendAction bact(os1, flags_, ts, id, main_path, prog_func_info, mod_src, maps_ns, fake_fd_map, perf_events); if (!compiler1.ExecuteAction(bact)) return -1; @@ -474,27 +511,4 @@ int ClangLoader::do_compile(unique_ptr<llvm::Module> *mod, TableStorage &ts, return 0; } - -const char * FuncSource::src(const std::string& name) { - auto src = funcs_.find(name); - if (src == funcs_.end()) - return ""; - return src->second.src_.data(); -} - -const char * FuncSource::src_rewritten(const std::string& name) { - auto src = funcs_.find(name); - if (src == funcs_.end()) - return ""; - return src->second.src_rewritten_.data(); -} - -void FuncSource::set_src(const std::string& name, const std::string& src) { - funcs_[name].src_ = src; -} - -void FuncSource::set_src_rewritten(const std::string& name, const std::string& src) { - funcs_[name].src_rewritten_ = src; -} - } // namespace ebpf |