[Concept,v2,08/29] sandbox: Add gprof profiling support

Message ID 20260103200510.3605009-9-sjg@u-boot.org
State New
Headers
Series Malloc debugging and test/py improvements |

Commit Message

Simon Glass Jan. 3, 2026, 8:04 p.m. UTC
  From: Simon Glass <simon.glass@canonical.com>

Add a GPROF=1 build option to enable gprof profiling for sandbox. This
adds the -pg flag to both compiler and linker when GPROF=1 is set,
following the same pattern as the existing FTRACE option.

Usage:
  make GPROF=1 sandbox_defconfig all
  ./u-boot -T -c "ut dm"
  ...
  gprof u-boot gmon.out

Co-developed-by: Claude <noreply@anthropic.com>
Signed-off-by: Simon Glass <simon.glass@canonical.com>
---

(no changes since v1)

 arch/sandbox/config.mk |  4 ++++
 config.mk              |  4 ++++
 doc/develop/trace.rst  | 40 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 48 insertions(+)
  

Patch

diff --git a/arch/sandbox/config.mk b/arch/sandbox/config.mk
index b92c259d2e3..92bac07963e 100644
--- a/arch/sandbox/config.mk
+++ b/arch/sandbox/config.mk
@@ -10,6 +10,10 @@  PLATFORM_LIBS += -L$(GCC_LIB_DIR) -lbacktrace
 endif
 PLATFORM_LIBS += -lrt
 
+ifdef GPROF
+PLATFORM_LIBS += -pg
+endif
+
 SDL_CONFIG ?= sdl2-config
 
 # Define this to avoid linking with SDL, which requires SDL libraries
diff --git a/config.mk b/config.mk
index e294be2a4c4..82fdbf3b4f6 100644
--- a/config.mk
+++ b/config.mk
@@ -63,6 +63,10 @@  ifdef FTRACE
 PLATFORM_CPPFLAGS += -finstrument-functions -DFTRACE
 endif
 
+ifdef GPROF
+PLATFORM_CPPFLAGS += -pg
+endif
+
 #########################################################################
 
 RELFLAGS := $(PLATFORM_RELFLAGS)
diff --git a/doc/develop/trace.rst b/doc/develop/trace.rst
index d3c8628d124..d3393244658 100644
--- a/doc/develop/trace.rst
+++ b/doc/develop/trace.rst
@@ -491,6 +491,46 @@  can dramatically increase the size of the trace output as well as the execution
 time.
 
 
+Wall-clock Profiling with gprof (Sandbox)
+-----------------------------------------
+
+For sandbox builds, an alternative to U-Boot's internal tracing is to use
+the standard GNU gprof profiler. This provides wall-clock profiling with
+less overhead than function instrumentation, and produces output that can
+be analysed with standard tools.
+
+To build sandbox with gprof support::
+
+    make GPROF=1 O=/tmp/b/sandbox sandbox_defconfig
+    make GPROF=1 O=/tmp/b/sandbox
+
+Then run U-Boot. A `gmon.out` file is created in the current directory when
+the program exits::
+
+    cd /tmp/b/sandbox
+    ./u-boot -T -c "ut dm dm_test_rtc_set_get"
+
+Analyse the results with gprof::
+
+    gprof u-boot gmon.out | less
+
+This shows a flat profile (functions sorted by time) and a call graph. The
+flat profile shows which functions consume the most CPU time::
+
+    %   cumulative   self              self     total
+    time   seconds   seconds    calls  ms/call  ms/call  name
+    29.41      0.05     0.05    36922     0.00     0.00  memset
+    17.65      0.08     0.03                             read_uleb128
+    11.76      0.10     0.02   328472     0.00     0.00  string
+    ...
+
+The call graph shows the call hierarchy and time spent in each call chain.
+
+Note that gprof measures CPU time, not wall-clock time, so I/O wait time is
+not captured. For boot-time optimisation where I/O is significant, use
+bootstage or the internal trace system instead.
+
+
 Future Work
 -----------