summaryrefslogtreecommitdiff
path: root/internal/generate/codegen.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-05-29 10:26:01 +0300
committerPaul Buetow <paul@buetow.org>2026-05-29 10:26:01 +0300
commit55f52dc3d270bd0edbaa1f338c8798598721e2f1 (patch)
treeddc0a76fceb30fffeb0231fbe2d2dd09a2836767 /internal/generate/codegen.go
parent59451a70fc82b3b6b5522986b08b4c16cda24301 (diff)
codegen: suppress unreachable sys_exit handlers for noreturn syscalls
exit and exit_group never return to userspace, so their sys_exit tracepoints can never fire. The generator previously emitted matching EXIT_RET_EVENT handlers anyway, producing dead code in the generated BPF program. classifySyscall now skips exit-handler emission for noreturn syscalls via isNoreturnSyscall, and the regenerated artifacts drop the sys_exit_exit / sys_exit_exit_group handlers (enter handlers are kept). Tests updated to match the new reality: - TestGenerateExitNoreturnHandlers asserts no exit handler is emitted. - TestClassifySyscallPairEmitsAllFamilies exempts noreturn syscalls from the exit-handler-required assertion while staying strict for all others. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Diffstat (limited to 'internal/generate/codegen.go')
-rw-r--r--internal/generate/codegen.go21
1 files changed, 20 insertions, 1 deletions
diff --git a/internal/generate/codegen.go b/internal/generate/codegen.go
index 3848b93..339dc1f 100644
--- a/internal/generate/codegen.go
+++ b/internal/generate/codegen.go
@@ -125,7 +125,11 @@ func classifySyscall(sc Syscall) ([]GeneratedTracepoint, string) {
if sc.Enter != nil {
result = append(result, GeneratedTracepoint{Format: sc.Enter, Classification: enterClass})
}
- if sc.Exit != nil {
+ // Emit the exit handler only for syscalls that can actually return.
+ // Noreturn syscalls (exit, exit_group) never return to userspace, so their
+ // sys_exit tracepoint never fires; emitting a handler would be dead code in
+ // the generated BPF program. We still emit their enter handler above.
+ if sc.Exit != nil && !isNoreturnSyscall(sc.Name) {
result = append(result, GeneratedTracepoint{Format: sc.Exit, Classification: exitClass})
}
return result, ""
@@ -146,6 +150,21 @@ func isEnterRejected(kind TracepointKind) bool {
return !lookupKind(kind).enterAccepted
}
+// noreturnSyscalls lists syscalls that never return control to userspace.
+// Their sys_exit tracepoint can never fire, so the generator suppresses the
+// matching exit handler (see classifySyscall) to avoid dead code in the
+// generated BPF program.
+var noreturnSyscalls = map[string]bool{
+ "exit": true,
+ "exit_group": true,
+}
+
+// isNoreturnSyscall reports whether the named syscall never returns and thus
+// must not have an exit handler emitted.
+func isNoreturnSyscall(name string) bool {
+ return noreturnSyscalls[name]
+}
+
func syscallFormatNames(sc Syscall) []string {
var names []string
if sc.Enter != nil {