1 1.1 mrg #!/bin/sh 2 1.1.1.2 mrg # Profile workload for gcc profile feedback (autofdo) using Linux perf. 3 1.1.1.2 mrg # Auto generated. To regenerate for new CPUs run 4 1.1.1.2 mrg # contrib/gen_autofdo_event.py --script --all in gcc source 5 1.1 mrg 6 1.1 mrg # usages: 7 1.1 mrg # gcc-auto-profile program (profile program and children) 8 1.1 mrg # gcc-auto-profile -a sleep X (profile all for X secs, may need root) 9 1.1 mrg # gcc-auto-profile -p PID sleep X (profile PID) 10 1.1 mrg # gcc-auto-profile --kernel -a sleep X (profile kernel) 11 1.1 mrg # gcc-auto-profile --all -a sleep X (profile kernel and user space) 12 1.1 mrg 13 1.1.1.2 mrg # Identify branches taken event for CPU. 14 1.1 mrg # 15 1.1 mrg 16 1.1 mrg FLAGS=u 17 1.1 mrg 18 1.1 mrg if [ "$1" = "--kernel" ] ; then 19 1.1 mrg FLAGS=k 20 1.1 mrg shift 21 1.1 mrg fi 22 1.1 mrg if [ "$1" = "--all" ] ; then 23 1.1 mrg FLAGS=uk 24 1.1 mrg shift 25 1.1 mrg fi 26 1.1 mrg 27 1.1 mrg if ! grep -q Intel /proc/cpuinfo ; then 28 1.1 mrg echo >&2 "Only Intel CPUs supported" 29 1.1 mrg exit 1 30 1.1 mrg fi 31 1.1 mrg 32 1.1 mrg if grep -q hypervisor /proc/cpuinfo ; then 33 1.1 mrg echo >&2 "Warning: branch profiling may not be functional in VMs" 34 1.1 mrg fi 35 1.1 mrg 36 1.1 mrg case `egrep -q "^cpu family\s*: 6" /proc/cpuinfo && 37 1.1 mrg egrep "^model\s*:" /proc/cpuinfo | head -n1` in 38 1.1 mrg model*:\ 55|\ 39 1.1 mrg model*:\ 77|\ 40 1.1.1.2 mrg model*:\ 76|\ 41 1.1.1.2 mrg model*:\ 92|\ 42 1.1.1.2 mrg model*:\ 95|\ 43 1.1.1.2 mrg model*:\ 87|\ 44 1.1.1.2 mrg model*:\ 133|\ 45 1.1.1.2 mrg model*:\ 122) E="cpu/event=0xC4,umask=0xFE/p$FLAGS" ;; 46 1.1 mrg model*:\ 42|\ 47 1.1 mrg model*:\ 45|\ 48 1.1 mrg model*:\ 58|\ 49 1.1 mrg model*:\ 62|\ 50 1.1 mrg model*:\ 60|\ 51 1.1 mrg model*:\ 69|\ 52 1.1 mrg model*:\ 70|\ 53 1.1 mrg model*:\ 63|\ 54 1.1 mrg model*:\ 61|\ 55 1.1 mrg model*:\ 71|\ 56 1.1.1.2 mrg model*:\ 79|\ 57 1.1 mrg model*:\ 86|\ 58 1.1 mrg model*:\ 78|\ 59 1.1.1.2 mrg model*:\ 94|\ 60 1.1.1.2 mrg model*:\ 142|\ 61 1.1.1.2 mrg model*:\ 158|\ 62 1.1.1.2 mrg model*:\ 165|\ 63 1.1.1.2 mrg model*:\ 166|\ 64 1.1.1.2 mrg model*:\ 85|\ 65 1.1.1.2 mrg model*:\ 85) E="cpu/event=0xC4,umask=0x20/p$FLAGS" ;; 66 1.1 mrg model*:\ 46|\ 67 1.1 mrg model*:\ 30|\ 68 1.1 mrg model*:\ 31|\ 69 1.1 mrg model*:\ 26|\ 70 1.1 mrg model*:\ 47|\ 71 1.1 mrg model*:\ 37|\ 72 1.1 mrg model*:\ 44) E="cpu/event=0x88,umask=0x40/p$FLAGS" ;; 73 1.1 mrg model*:\ 28|\ 74 1.1 mrg model*:\ 38|\ 75 1.1 mrg model*:\ 39|\ 76 1.1 mrg model*:\ 54|\ 77 1.1 mrg model*:\ 53) E="cpu/event=0x88,umask=0x41/p$FLAGS" ;; 78 1.1.1.2 mrg model*:\ 126|\ 79 1.1.1.2 mrg model*:\ 140|\ 80 1.1.1.2 mrg model*:\ 141|\ 81 1.1.1.2 mrg model*:\ 106|\ 82 1.1.1.2 mrg model*:\ 108) E="cpu/event=0xc4,umask=0x20/p$FLAGS" ;; 83 1.1 mrg *) 84 1.1 mrg echo >&2 "Unknown CPU. Run contrib/gen_autofdo_event.py --all --script to update script." 85 1.1 mrg exit 1 ;; 86 1.1 mrg esac 87 1.1.1.2 mrg set -x 88 1.1.1.2 mrg if ! perf record -e $E -b "$@" ; then 89 1.1.1.2 mrg # PEBS may not actually be working even if the processor supports it 90 1.1.1.2 mrg # (e.g., in a virtual machine). Trying to run without /p. 91 1.1.1.2 mrg set +x 92 1.1.1.2 mrg echo >&2 "Retrying without /p." 93 1.1.1.2 mrg E="$(echo "${E}" | sed -e 's/\/p/\//')" 94 1.1.1.2 mrg set -x 95 1.1.1.2 mrg exec perf record -e $E -b "$@" 96 1.1.1.2 mrg set +x 97 1.1.1.2 mrg fi 98