#!/bin/sh # Profile workload for gcc profile feedback (autofdo) using Linux perf. # Auto generated. To regenerate for new CPUs run # contrib/gen_autofdo_event.py --script --all in gcc source # usages: # gcc-auto-profile program (profile program and children) # gcc-auto-profile -a sleep X (profile all for X secs, may need root) # gcc-auto-profile -p PID sleep X (profile PID) # gcc-auto-profile --kernel -a sleep X (profile kernel) # gcc-auto-profile --all -a sleep X (profile kernel and user space) # Identify branches taken event for CPU. # FLAGS=u if [ "$1" = "--kernel" ] ; then FLAGS=k shift fi if [ "$1" = "--all" ] ; then FLAGS=uk shift fi if ! grep -q Intel /proc/cpuinfo ; then echo >&2 "Only Intel CPUs supported" exit 1 fi if grep -q hypervisor /proc/cpuinfo ; then echo >&2 "Warning: branch profiling may not be functional in VMs" fi case `egrep -q "^cpu family\s*: 6" /proc/cpuinfo && egrep "^model\s*:" /proc/cpuinfo | head -n1` in model*:\ 55|\ model*:\ 77|\ model*:\ 76|\ model*:\ 92|\ model*:\ 95|\ model*:\ 87|\ model*:\ 133|\ model*:\ 122) E="cpu/event=0xC4,umask=0xFE/p$FLAGS" ;; model*:\ 42|\ model*:\ 45|\ model*:\ 58|\ model*:\ 62|\ model*:\ 60|\ model*:\ 69|\ model*:\ 70|\ model*:\ 63|\ model*:\ 61|\ model*:\ 71|\ model*:\ 79|\ model*:\ 86|\ model*:\ 78|\ model*:\ 94|\ model*:\ 142|\ model*:\ 158|\ model*:\ 165|\ model*:\ 166|\ model*:\ 85|\ model*:\ 85) E="cpu/event=0xC4,umask=0x20/p$FLAGS" ;; model*:\ 46|\ model*:\ 30|\ model*:\ 31|\ model*:\ 26|\ model*:\ 47|\ model*:\ 37|\ model*:\ 44) E="cpu/event=0x88,umask=0x40/p$FLAGS" ;; model*:\ 28|\ model*:\ 38|\ model*:\ 39|\ model*:\ 54|\ model*:\ 53) E="cpu/event=0x88,umask=0x41/p$FLAGS" ;; model*:\ 126|\ model*:\ 140|\ model*:\ 141|\ model*:\ 106|\ model*:\ 108) E="cpu/event=0xc4,umask=0x20/p$FLAGS" ;; *) echo >&2 "Unknown CPU. Run contrib/gen_autofdo_event.py --all --script to update script." exit 1 ;; esac set -x if ! perf record -e $E -b "$@" ; then # PEBS may not actually be working even if the processor supports it # (e.g., in a virtual machine). Trying to run without /p. set +x echo >&2 "Retrying without /p." E="$(echo "${E}" | sed -e 's/\/p/\//')" set -x exec perf record -e $E -b "$@" set +x fi