|
|
13109d |
From c17a12ac030c5d9c812e611f8132570af0e795af Mon Sep 17 00:00:00 2001
|
|
|
13109d |
From: Yonghong Song <yhs@fb.com>
|
|
|
13109d |
Date: Sat, 13 Aug 2022 17:50:07 -0700
|
|
|
13109d |
Subject: [PATCH 1/2] Fix bpf_pseudo_fd() type conversion error
|
|
|
13109d |
|
|
|
13109d |
With llvm15 and llvm16, the following command line
|
|
|
13109d |
sudo ./trace.py 'smp_call_function_single "%K", arg1'
|
|
|
13109d |
will cause error:
|
|
|
13109d |
/virtual/main.c:60:36: error: incompatible integer to pointer conversion passing 'u64'
|
|
|
13109d |
(aka 'unsigned long long') to parameter of type 'void *' [-Wint-conversion]
|
|
|
13109d |
bpf_perf_event_output(ctx, bpf_pseudo_fd(1, -1), CUR_CPU_IDENTIFIER, &__data, sizeof(__data));
|
|
|
13109d |
^~~~~~~~~~~~~~~~~~~~
|
|
|
13109d |
1 error generated.
|
|
|
13109d |
Failed to compile BPF module <text>
|
|
|
13109d |
|
|
|
13109d |
In helpers.h, we have
|
|
|
13109d |
u64 bpf_pseudo_fd(u64, u64) asm("llvm.bpf.pseudo");
|
|
|
13109d |
Apparently, <= llvm14 can tolerate u64 -> 'void *' conversion, but
|
|
|
13109d |
llvm15 by default will cause an error.
|
|
|
13109d |
|
|
|
13109d |
Let us explicitly convert bpf_pseudo_fd to 'void *' to avoid
|
|
|
13109d |
such errors.
|
|
|
13109d |
|
|
|
13109d |
Signed-off-by: Yonghong Song <yhs@fb.com>
|
|
|
13109d |
---
|
|
|
13109d |
src/cc/frontends/clang/b_frontend_action.cc | 10 +++++-----
|
|
|
13109d |
1 file changed, 5 insertions(+), 5 deletions(-)
|
|
|
13109d |
|
|
|
13109d |
diff --git a/src/cc/frontends/clang/b_frontend_action.cc b/src/cc/frontends/clang/b_frontend_action.cc
|
|
|
13109d |
index a4e05b16..dbeba3e4 100644
|
|
|
13109d |
--- a/src/cc/frontends/clang/b_frontend_action.cc
|
|
|
13109d |
+++ b/src/cc/frontends/clang/b_frontend_action.cc
|
|
|
13109d |
@@ -957,7 +957,7 @@ bool BTypeVisitor::VisitCallExpr(CallExpr *Call) {
|
|
|
13109d |
string arg0 = rewriter_.getRewrittenText(expansionRange(Call->getArg(0)->getSourceRange()));
|
|
|
13109d |
string args_other = rewriter_.getRewrittenText(expansionRange(SourceRange(GET_BEGINLOC(Call->getArg(1)),
|
|
|
13109d |
GET_ENDLOC(Call->getArg(2)))));
|
|
|
13109d |
- txt = "bpf_perf_event_output(" + arg0 + ", bpf_pseudo_fd(1, " + fd + ")";
|
|
|
13109d |
+ txt = "bpf_perf_event_output(" + arg0 + ", (void *)bpf_pseudo_fd(1, " + fd + ")";
|
|
|
13109d |
txt += ", CUR_CPU_IDENTIFIER, " + args_other + ")";
|
|
|
13109d |
|
|
|
13109d |
// e.g.
|
|
|
13109d |
@@ -986,7 +986,7 @@ bool BTypeVisitor::VisitCallExpr(CallExpr *Call) {
|
|
|
13109d |
string meta_len = rewriter_.getRewrittenText(expansionRange(Call->getArg(3)->getSourceRange()));
|
|
|
13109d |
txt = "bpf_perf_event_output(" +
|
|
|
13109d |
skb + ", " +
|
|
|
13109d |
- "bpf_pseudo_fd(1, " + fd + "), " +
|
|
|
13109d |
+ "(void *)bpf_pseudo_fd(1, " + fd + "), " +
|
|
|
13109d |
"((__u64)" + skb_len + " << 32) | BPF_F_CURRENT_CPU, " +
|
|
|
13109d |
meta + ", " +
|
|
|
13109d |
meta_len + ");";
|
|
|
13109d |
@@ -1006,12 +1006,12 @@ bool BTypeVisitor::VisitCallExpr(CallExpr *Call) {
|
|
|
13109d |
string keyp = rewriter_.getRewrittenText(expansionRange(Call->getArg(1)->getSourceRange()));
|
|
|
13109d |
string flag = rewriter_.getRewrittenText(expansionRange(Call->getArg(2)->getSourceRange()));
|
|
|
13109d |
txt = "bpf_" + string(memb_name) + "(" + ctx + ", " +
|
|
|
13109d |
- "bpf_pseudo_fd(1, " + fd + "), " + keyp + ", " + flag + ");";
|
|
|
13109d |
+ "(void *)bpf_pseudo_fd(1, " + fd + "), " + keyp + ", " + flag + ");";
|
|
|
13109d |
} else if (memb_name == "ringbuf_output") {
|
|
|
13109d |
string name = string(Ref->getDecl()->getName());
|
|
|
13109d |
string args = rewriter_.getRewrittenText(expansionRange(SourceRange(GET_BEGINLOC(Call->getArg(0)),
|
|
|
13109d |
GET_ENDLOC(Call->getArg(2)))));
|
|
|
13109d |
- txt = "bpf_ringbuf_output(bpf_pseudo_fd(1, " + fd + ")";
|
|
|
13109d |
+ txt = "bpf_ringbuf_output((void *)bpf_pseudo_fd(1, " + fd + ")";
|
|
|
13109d |
txt += ", " + args + ")";
|
|
|
13109d |
|
|
|
13109d |
// e.g.
|
|
|
13109d |
@@ -1033,7 +1033,7 @@ bool BTypeVisitor::VisitCallExpr(CallExpr *Call) {
|
|
|
13109d |
} else if (memb_name == "ringbuf_reserve") {
|
|
|
13109d |
string name = string(Ref->getDecl()->getName());
|
|
|
13109d |
string arg0 = rewriter_.getRewrittenText(expansionRange(Call->getArg(0)->getSourceRange()));
|
|
|
13109d |
- txt = "bpf_ringbuf_reserve(bpf_pseudo_fd(1, " + fd + ")";
|
|
|
13109d |
+ txt = "bpf_ringbuf_reserve((void *)bpf_pseudo_fd(1, " + fd + ")";
|
|
|
13109d |
txt += ", " + arg0 + ", 0)"; // Flags in reserve are meaningless
|
|
|
13109d |
} else if (memb_name == "ringbuf_discard") {
|
|
|
13109d |
string name = string(Ref->getDecl()->getName());
|
|
|
13109d |
--
|
|
|
13109d |
2.38.1
|
|
|
13109d |
|