All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 0/2] perf-probe: Improbe non-C language support
@ 2024-11-13  0:21 Masami Hiramatsu (Google)
  2024-11-13  0:21 ` [PATCH v3 1/2] perf-probe: Replace unacceptable characters when generating event name Masami Hiramatsu (Google)
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Masami Hiramatsu (Google) @ 2024-11-13  0:21 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Namhyung Kim
  Cc: Peter Zijlstra, Ingo Molnar, Masami Hiramatsu, Ian Rogers,
	Dima Kogan, Alexander Lobakin, Przemek Kitszel, linux-perf-users,
	linux-kernel

Hi,

Here is the 3rd version of patches for perf probe to improve non-C language
(e.g. Rust, Go) support.

This ported the last patch on top of tmp.perf-tools-next, and add a fix patch
for compilation errors.

https://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools-next.git tmp.perf-tools-next

https://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools-next.git/log/?h=tmp.perf-tools-next

Thank you,

---

Masami Hiramatsu (Google) (2):
      perf-probe: Replace unacceptable characters when generating event name
      perf disasm: Fix compilation error with stubs


 tools/perf/util/disasm.c       |    7 ++++---
 tools/perf/util/probe-event.c  |   32 +++++++++++++++++++++++++-------
 tools/perf/util/probe-event.h  |    3 ++-
 tools/perf/util/probe-finder.c |   15 +++++++++++++++
 tools/perf/util/probe-finder.h |    5 +++++
 5 files changed, 51 insertions(+), 11 deletions(-)

--
Masami Hiramatsu (Google) <mhiramat@kernel.org>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH v3 1/2] perf-probe: Replace unacceptable characters when generating event name
  2024-11-13  0:21 [PATCH v3 0/2] perf-probe: Improbe non-C language support Masami Hiramatsu (Google)
@ 2024-11-13  0:21 ` Masami Hiramatsu (Google)
  2024-11-13  0:21 ` [PATCH v3 2/2] perf disasm: Fix compilation error with stubs Masami Hiramatsu (Google)
  2024-12-10 18:40 ` [PATCH v3 0/2] perf-probe: Improbe non-C language support Arnaldo Carvalho de Melo
  2 siblings, 0 replies; 4+ messages in thread
From: Masami Hiramatsu (Google) @ 2024-11-13  0:21 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Namhyung Kim
  Cc: Peter Zijlstra, Ingo Molnar, Masami Hiramatsu, Ian Rogers,
	Dima Kogan, Alexander Lobakin, Przemek Kitszel, linux-perf-users,
	linux-kernel

From: Masami Hiramatsu (Google) <mhiramat@kernel.org>

Replace unacceptable characters with '_' when generating event name from
the probing function name. This is not for C program. For the C program,
it will continue to remove suffixes.
Note that this language checking depends on the debuginfo. So without the
debuginfo, perf probe will always replaces unacceptable characters with
'_'.

For example.

$ ./perf probe -x cro3 -D \"cro3::cmd::servo::run_show\"
p:probe_cro3/cro3_cmd_servo_run_show /work/cro3/target/x86_64-unknown-linux-gnu/debug/cro3:0x197530

$ ./perf probe -x /work/go/example/outyet/main -D 'main.(*Server).poll'
p:probe_main/main_Server_poll /work/go/example/outyet/main:0x353040

Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
---
 Changes in v3:
  - Update for the latest perf-tools.
 Changes in v2:
  - Check dwarf language instead of checking wildcards.
---
 tools/perf/util/probe-event.c  |   32 +++++++++++++++++++++++++-------
 tools/perf/util/probe-event.h  |    3 ++-
 tools/perf/util/probe-finder.c |   15 +++++++++++++++
 tools/perf/util/probe-finder.h |    5 +++++
 4 files changed, 47 insertions(+), 8 deletions(-)

diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 1d5184697871..a5e42055a2f4 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -2774,7 +2774,7 @@ int show_perf_probe_events(struct strfilter *filter)
 
 static int get_new_event_name(char *buf, size_t len, const char *base,
 			      struct strlist *namelist, bool ret_event,
-			      bool allow_suffix)
+			      bool allow_suffix, bool not_C_symname)
 {
 	int i, ret;
 	char *p, *nbase;
@@ -2785,10 +2785,24 @@ static int get_new_event_name(char *buf, size_t len, const char *base,
 	if (!nbase)
 		return -ENOMEM;
 
-	/* Cut off the dot suffixes (e.g. .const, .isra) and version suffixes */
-	p = strpbrk(nbase, ".@");
-	if (p && p != nbase)
-		*p = '\0';
+	if (not_C_symname) {
+		/* Replace non-alnum with '_' */
+		char *s, *d;
+
+		s = d = nbase;
+		do {
+			if (*s && !isalnum(*s)) {
+				if (d != nbase && *(d - 1) != '_')
+					*d++ = '_';
+			} else
+				*d++ = *s;
+		} while (*s++);
+	} else {
+		/* Cut off the dot suffixes (e.g. .const, .isra) and version suffixes */
+		p = strpbrk(nbase, ".@");
+		if (p && p != nbase)
+			*p = '\0';
+	}
 
 	/* Try no suffix number */
 	ret = e_snprintf(buf, len, "%s%s", nbase, ret_event ? "__return" : "");
@@ -2883,6 +2897,7 @@ static int probe_trace_event__set_name(struct probe_trace_event *tev,
 				       bool allow_suffix)
 {
 	const char *event, *group;
+	bool not_C_symname = true;
 	char buf[MAX_EVENT_NAME_LEN];
 	int ret;
 
@@ -2897,8 +2912,10 @@ static int probe_trace_event__set_name(struct probe_trace_event *tev,
 			(strncmp(pev->point.function, "0x", 2) != 0) &&
 			!strisglob(pev->point.function))
 			event = pev->point.function;
-		else
+		else {
 			event = tev->point.realname;
+			not_C_symname = !is_known_C_lang(tev->lang);
+		}
 	}
 	if (pev->group && !pev->sdt)
 		group = pev->group;
@@ -2915,7 +2932,8 @@ static int probe_trace_event__set_name(struct probe_trace_event *tev,
 
 	/* Get an unused new event name */
 	ret = get_new_event_name(buf, sizeof(buf), event, namelist,
-				 tev->point.retprobe, allow_suffix);
+				 tev->point.retprobe, allow_suffix,
+				 not_C_symname);
 	if (ret < 0)
 		return ret;
 
diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h
index 4850e52f274e..ab9d07034170 100644
--- a/tools/perf/util/probe-event.h
+++ b/tools/perf/util/probe-event.h
@@ -57,7 +57,8 @@ struct probe_trace_event {
 	char				*event;	/* Event name */
 	char				*group;	/* Group name */
 	struct probe_trace_point	point;	/* Trace point */
-	int				nargs;	/* Number of args */
+	int					nargs;	/* Number of args */
+	int					lang;	/* Dwarf language code */
 	bool				uprobes;	/* uprobes only */
 	struct probe_trace_arg		*args;	/* Arguments */
 };
diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index 7f2ee0cb43ca..863147c4b7d6 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -35,6 +35,19 @@
 /* Kprobe tracer basic type is up to u64 */
 #define MAX_BASIC_TYPE_BITS	64
 
+bool is_known_C_lang(int lang)
+{
+	switch (lang) {
+	case DW_LANG_C89:
+	case DW_LANG_C:
+	case DW_LANG_C99:
+	case DW_LANG_C11:
+		return true;
+	default:
+		return false;
+	}
+}
+
 /*
  * Probe finder related functions
  */
@@ -1269,6 +1282,8 @@ static int add_probe_trace_event(Dwarf_Die *sc_die, struct probe_finder *pf)
 		ret = -ENOMEM;
 		goto end;
 	}
+	tev->lang = dwarf_srclang(dwarf_diecu(sc_die, &pf->cu_die,
+										  NULL, NULL));
 
 	pr_debug("Probe point found: %s+%lu\n", tev->point.symbol,
 		 tev->point.offset);
diff --git a/tools/perf/util/probe-finder.h b/tools/perf/util/probe-finder.h
index be7b46ea2460..dcf6cc1e1cbe 100644
--- a/tools/perf/util/probe-finder.h
+++ b/tools/perf/util/probe-finder.h
@@ -26,6 +26,9 @@ static inline int is_c_varname(const char *name)
 #include "dwarf-aux.h"
 #include "debuginfo.h"
 
+/* Check the language code is known C */
+bool is_known_C_lang(int lang);
+
 /* Find probe_trace_events specified by perf_probe_event from debuginfo */
 int debuginfo__find_trace_events(struct debuginfo *dbg,
 				 struct perf_probe_event *pev,
@@ -103,6 +106,8 @@ struct line_finder {
 	int			found;
 };
 
+#else
+#define is_known_C_lang(lang) (false)
 #endif /* HAVE_LIBDW_SUPPORT */
 
 #endif /*_PROBE_FINDER_H */


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v3 2/2] perf disasm: Fix compilation error with stubs
  2024-11-13  0:21 [PATCH v3 0/2] perf-probe: Improbe non-C language support Masami Hiramatsu (Google)
  2024-11-13  0:21 ` [PATCH v3 1/2] perf-probe: Replace unacceptable characters when generating event name Masami Hiramatsu (Google)
@ 2024-11-13  0:21 ` Masami Hiramatsu (Google)
  2024-12-10 18:40 ` [PATCH v3 0/2] perf-probe: Improbe non-C language support Arnaldo Carvalho de Melo
  2 siblings, 0 replies; 4+ messages in thread
From: Masami Hiramatsu (Google) @ 2024-11-13  0:21 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Namhyung Kim
  Cc: Peter Zijlstra, Ingo Molnar, Masami Hiramatsu, Ian Rogers,
	Dima Kogan, Alexander Lobakin, Przemek Kitszel, linux-perf-users,
	linux-kernel

From: Masami Hiramatsu (Google) <mhiramat@kernel.org>

Commit 333ea1451083 ("perf disasm: Define stubs for the LLVM and capstone
 disassemblers") introduces stubs but that causes compilation errors when
LIBCAPSTONE=n or LIBLLVM=n. This fixes those errors.

Fixes: 333ea1451083 ("perf disasm: Define stubs for the LLVM and capstone disassemblers")
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
---
 tools/perf/util/disasm.c |    7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/tools/perf/util/disasm.c b/tools/perf/util/disasm.c
index df6c172c9c7f..88f71f6e5e70 100644
--- a/tools/perf/util/disasm.c
+++ b/tools/perf/util/disasm.c
@@ -1422,14 +1422,14 @@ read_symbol(const char *filename, struct map *map, struct symbol *sym,
 	free(buf);
 	return NULL;
 }
-#else // defined(HAVE_LIBCAPSTONE_SUPPORT) || defined(HAVE_LIBLLVM_SUPPORT)
+#endif // defined(HAVE_LIBCAPSTONE_SUPPORT) || defined(HAVE_LIBLLVM_SUPPORT)
+
 static void symbol__disassembler_missing(const char *disassembler, const char *filename,
 					 struct symbol *sym)
 {
 	pr_debug("The %s disassembler isn't linked in for %s in %s\n",
 		 disassembler, sym->name, filename);
 }
-#endif
 
 #ifdef HAVE_LIBCAPSTONE_SUPPORT
 static void print_capstone_detail(cs_insn *insn, char *buf, size_t len,
@@ -1724,7 +1724,8 @@ static int symbol__disassemble_capstone(char *filename, struct symbol *sym,
 }
 #else // HAVE_LIBCAPSTONE_SUPPORT
 static int symbol__disassemble_capstone(char *filename, struct symbol *sym,
-					struct annotate_args *args)
+					struct annotate_args *args __maybe_unused)
+{
 	symbol__disassembler_missing("capstone", filename, sym);
 	return -1;
 }


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v3 0/2] perf-probe: Improbe non-C language support
  2024-11-13  0:21 [PATCH v3 0/2] perf-probe: Improbe non-C language support Masami Hiramatsu (Google)
  2024-11-13  0:21 ` [PATCH v3 1/2] perf-probe: Replace unacceptable characters when generating event name Masami Hiramatsu (Google)
  2024-11-13  0:21 ` [PATCH v3 2/2] perf disasm: Fix compilation error with stubs Masami Hiramatsu (Google)
@ 2024-12-10 18:40 ` Arnaldo Carvalho de Melo
  2 siblings, 0 replies; 4+ messages in thread
From: Arnaldo Carvalho de Melo @ 2024-12-10 18:40 UTC (permalink / raw)
  To: Masami Hiramatsu (Google)
  Cc: Namhyung Kim, Peter Zijlstra, Ingo Molnar, Ian Rogers, Dima Kogan,
	Alexander Lobakin, Przemek Kitszel, linux-perf-users,
	linux-kernel

On Wed, Nov 13, 2024 at 09:21:13AM +0900, Masami Hiramatsu (Google) wrote:
> Hi,
> 
> Here is the 3rd version of patches for perf probe to improve non-C language
> (e.g. Rust, Go) support.
> 
> This ported the last patch on top of tmp.perf-tools-next, and add a fix patch
> for compilation errors.
> 
> https://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools-next.git tmp.perf-tools-next
> 
> https://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools-next.git/log/?h=tmp.perf-tools-next


Thanks, applied the first patch to perf-tools-next, the other was folded
into the patch that introduced those problems, to avoid bisection
problems.

- Arnaldo
 
> Thank you,
> 
> ---
> 
> Masami Hiramatsu (Google) (2):
>       perf-probe: Replace unacceptable characters when generating event name
>       perf disasm: Fix compilation error with stubs
> 
> 
>  tools/perf/util/disasm.c       |    7 ++++---
>  tools/perf/util/probe-event.c  |   32 +++++++++++++++++++++++++-------
>  tools/perf/util/probe-event.h  |    3 ++-
>  tools/perf/util/probe-finder.c |   15 +++++++++++++++
>  tools/perf/util/probe-finder.h |    5 +++++
>  5 files changed, 51 insertions(+), 11 deletions(-)
> 
> --
> Masami Hiramatsu (Google) <mhiramat@kernel.org>

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2024-12-10 18:41 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-13  0:21 [PATCH v3 0/2] perf-probe: Improbe non-C language support Masami Hiramatsu (Google)
2024-11-13  0:21 ` [PATCH v3 1/2] perf-probe: Replace unacceptable characters when generating event name Masami Hiramatsu (Google)
2024-11-13  0:21 ` [PATCH v3 2/2] perf disasm: Fix compilation error with stubs Masami Hiramatsu (Google)
2024-12-10 18:40 ` [PATCH v3 0/2] perf-probe: Improbe non-C language support Arnaldo Carvalho de Melo

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.