From ea5023a4ed658a5e0800a2459f9fa8db0de8673f Mon Sep 17 00:00:00 2001 From: Brenden Blanco Date: Thu, 24 Sep 2015 06:52:08 -0700 Subject: [PATCH] Add pointer dereference support to probe_read Allows things like: ```c int kprobe__foo(struct pt_regs *ctx, u64 *ptr) { bpf_trace_printk("%lx\n", *ptr); ``` Signed-off-by: Brenden Blanco --- src/cc/frontends/clang/b_frontend_action.cc | 17 +++++++++++++++++ src/cc/frontends/clang/b_frontend_action.h | 1 + 2 files changed, 18 insertions(+) diff --git a/src/cc/frontends/clang/b_frontend_action.cc b/src/cc/frontends/clang/b_frontend_action.cc index 7d3ac2c..49e3c00 100644 --- a/src/cc/frontends/clang/b_frontend_action.cc +++ b/src/cc/frontends/clang/b_frontend_action.cc @@ -158,6 +158,23 @@ bool ProbeVisitor::VisitBinaryOperator(BinaryOperator *E) { } return true; } +bool ProbeVisitor::VisitUnaryOperator(UnaryOperator *E) { + if (E->getOpcode() != UO_Deref) + return true; + if (memb_visited_.find(E) != memb_visited_.end()) + return true; + if (!ProbeChecker(E, ptregs_).needs_probe()) + return true; + memb_visited_.insert(E); + Expr *sub = E->getSubExpr(); + string rhs = rewriter_.getRewrittenText(SourceRange(sub->getLocStart(), sub->getLocEnd())); + string text; + text = "({ typeof(" + E->getType().getAsString() + ") _val; memset(&_val, 0, sizeof(_val));"; + text += " bpf_probe_read(&_val, sizeof(_val), (u64)"; + text += rhs + "); _val; })"; + rewriter_.ReplaceText(SourceRange(E->getLocStart(), E->getLocEnd()), text); + return true; +} bool ProbeVisitor::VisitMemberExpr(MemberExpr *E) { if (memb_visited_.find(E) != memb_visited_.end()) return true; diff --git a/src/cc/frontends/clang/b_frontend_action.h b/src/cc/frontends/clang/b_frontend_action.h index 1cfcc00..c30314d 100644 --- a/src/cc/frontends/clang/b_frontend_action.h +++ b/src/cc/frontends/clang/b_frontend_action.h @@ -85,6 +85,7 @@ class ProbeVisitor : public clang::RecursiveASTVisitor { bool VisitVarDecl(clang::VarDecl *Decl); bool VisitCallExpr(clang::CallExpr *Call); bool VisitBinaryOperator(clang::BinaryOperator *E); + bool VisitUnaryOperator(clang::UnaryOperator *E); bool VisitMemberExpr(clang::MemberExpr *E); void set_ptreg(clang::Decl *D) { ptregs_.insert(D); } private: -- 2.7.4