aboutsummaryrefslogtreecommitdiff
path: root/src/cc/frontends/clang/b_frontend_action.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/cc/frontends/clang/b_frontend_action.cc')
-rw-r--r--src/cc/frontends/clang/b_frontend_action.cc38
1 files changed, 26 insertions, 12 deletions
diff --git a/src/cc/frontends/clang/b_frontend_action.cc b/src/cc/frontends/clang/b_frontend_action.cc
index 7bfc4ed7..9b2853a9 100644
--- a/src/cc/frontends/clang/b_frontend_action.cc
+++ b/src/cc/frontends/clang/b_frontend_action.cc
@@ -811,10 +811,23 @@ bool BTypeVisitor::VisitFunctionDecl(FunctionDecl *D) {
if (fe_.is_rewritable_ext_func(D)) {
current_fn_ = string(D->getName());
string bd = rewriter_.getRewrittenText(expansionRange(D->getSourceRange()));
- fe_.func_src_.set_src(current_fn_, bd);
+ auto func_info = fe_.prog_func_info_.add_func(current_fn_);
+ if (!func_info) {
+ // We should only reach add_func above once per function seen, but the
+ // BPF_PROG-helper using macros in export/helpers.h (KFUNC_PROBE ..
+ // LSM_PROBE) break this logic. TODO: adjust export/helpers.h to not
+ // do so and bail out here, or find a better place to do add_func
+ func_info = fe_.prog_func_info_.get_func(current_fn_);
+ //error(GET_BEGINLOC(D), "redefinition of existing function");
+ //return false;
+ }
+ func_info->src_ = bd;
fe_.func_range_[current_fn_] = expansionRange(D->getSourceRange());
- string attr = string("__attribute__((section(\"") + BPF_FN_PREFIX + D->getName().str() + "\")))\n";
- rewriter_.InsertText(real_start_loc, attr);
+ if (!D->getAttr<SectionAttr>()) {
+ string attr = string("__attribute__((section(\"") + BPF_FN_PREFIX +
+ D->getName().str() + "\")))\n";
+ rewriter_.InsertText(real_start_loc, attr);
+ }
if (D->param_size() > MAX_CALLING_CONV_REGS + 1) {
error(GET_BEGINLOC(D->getParamDecl(MAX_CALLING_CONV_REGS + 1)),
"too many arguments, bcc only supports in-register parameters");
@@ -1689,13 +1702,12 @@ void BTypeConsumer::HandleTranslationUnit(ASTContext &Context) {
}
-BFrontendAction::BFrontendAction(llvm::raw_ostream &os, unsigned flags,
- TableStorage &ts, const std::string &id,
- const std::string &main_path,
- 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)
+BFrontendAction::BFrontendAction(
+ llvm::raw_ostream &os, unsigned flags, TableStorage &ts,
+ const std::string &id, const std::string &main_path,
+ 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)
: os_(os),
flags_(flags),
ts_(ts),
@@ -1703,7 +1715,7 @@ BFrontendAction::BFrontendAction(llvm::raw_ostream &os, unsigned flags,
maps_ns_(maps_ns),
rewriter_(new Rewriter),
main_path_(main_path),
- func_src_(func_src),
+ prog_func_info_(prog_func_info),
mod_src_(mod_src),
next_fake_fd_(-1),
fake_fd_map_(fake_fd_map),
@@ -1781,7 +1793,9 @@ void BFrontendAction::EndSourceFileAction() {
for (auto func : func_range_) {
auto f = func.first;
string bd = rewriter_->getRewrittenText(func_range_[f]);
- func_src_.set_src_rewritten(f, bd);
+ auto fn = prog_func_info_.get_func(f);
+ if (fn)
+ fn->src_rewritten_ = bd;
}
rewriter_->getEditBuffer(rewriter_->getSourceMgr().getMainFileID()).write(os_);
os_.flush();