1*4882a593Smuzhiyun#!/bin/sh 2*4882a593Smuzhiyun# build id cache operations 3*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun# skip if there's no readelf 6*4882a593Smuzhiyunif ! [ -x "$(command -v readelf)" ]; then 7*4882a593Smuzhiyun echo "failed: no readelf, install binutils" 8*4882a593Smuzhiyun exit 2 9*4882a593Smuzhiyunfi 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun# skip if there's no compiler 12*4882a593Smuzhiyunif ! [ -x "$(command -v cc)" ]; then 13*4882a593Smuzhiyun echo "failed: no compiler, install gcc" 14*4882a593Smuzhiyun exit 2 15*4882a593Smuzhiyunfi 16*4882a593Smuzhiyun 17*4882a593Smuzhiyunex_md5=$(mktemp /tmp/perf.ex.MD5.XXX) 18*4882a593Smuzhiyunex_sha1=$(mktemp /tmp/perf.ex.SHA1.XXX) 19*4882a593Smuzhiyun 20*4882a593Smuzhiyunecho 'int main(void) { return 0; }' | cc -Wl,--build-id=sha1 -o ${ex_sha1} -x c - 21*4882a593Smuzhiyunecho 'int main(void) { return 0; }' | cc -Wl,--build-id=md5 -o ${ex_md5} -x c - 22*4882a593Smuzhiyun 23*4882a593Smuzhiyunecho "test binaries: ${ex_sha1} ${ex_md5}" 24*4882a593Smuzhiyun 25*4882a593Smuzhiyuncheck() 26*4882a593Smuzhiyun{ 27*4882a593Smuzhiyun id=`readelf -n ${1} 2>/dev/null | grep 'Build ID' | awk '{print $3}'` 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun echo "build id: ${id}" 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun link=${build_id_dir}/.build-id/${id:0:2}/${id:2} 32*4882a593Smuzhiyun echo "link: ${link}" 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun if [ ! -h $link ]; then 35*4882a593Smuzhiyun echo "failed: link ${link} does not exist" 36*4882a593Smuzhiyun exit 1 37*4882a593Smuzhiyun fi 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun file=${build_id_dir}/.build-id/${id:0:2}/`readlink ${link}`/elf 40*4882a593Smuzhiyun echo "file: ${file}" 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun if [ ! -x $file ]; then 43*4882a593Smuzhiyun echo "failed: file ${file} does not exist" 44*4882a593Smuzhiyun exit 1 45*4882a593Smuzhiyun fi 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun diff ${file} ${1} 48*4882a593Smuzhiyun if [ $? -ne 0 ]; then 49*4882a593Smuzhiyun echo "failed: ${file} do not match" 50*4882a593Smuzhiyun exit 1 51*4882a593Smuzhiyun fi 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun echo "OK for ${1}" 54*4882a593Smuzhiyun} 55*4882a593Smuzhiyun 56*4882a593Smuzhiyuntest_add() 57*4882a593Smuzhiyun{ 58*4882a593Smuzhiyun build_id_dir=$(mktemp -d /tmp/perf.debug.XXX) 59*4882a593Smuzhiyun perf="perf --buildid-dir ${build_id_dir}" 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun ${perf} buildid-cache -v -a ${1} 62*4882a593Smuzhiyun if [ $? -ne 0 ]; then 63*4882a593Smuzhiyun echo "failed: add ${1} to build id cache" 64*4882a593Smuzhiyun exit 1 65*4882a593Smuzhiyun fi 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun check ${1} 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun rm -rf ${build_id_dir} 70*4882a593Smuzhiyun} 71*4882a593Smuzhiyun 72*4882a593Smuzhiyuntest_record() 73*4882a593Smuzhiyun{ 74*4882a593Smuzhiyun data=$(mktemp /tmp/perf.data.XXX) 75*4882a593Smuzhiyun build_id_dir=$(mktemp -d /tmp/perf.debug.XXX) 76*4882a593Smuzhiyun perf="perf --buildid-dir ${build_id_dir}" 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun ${perf} record --buildid-all -o ${data} ${1} 79*4882a593Smuzhiyun if [ $? -ne 0 ]; then 80*4882a593Smuzhiyun echo "failed: record ${1}" 81*4882a593Smuzhiyun exit 1 82*4882a593Smuzhiyun fi 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun check ${1} 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun rm -rf ${build_id_dir} 87*4882a593Smuzhiyun rm -rf ${data} 88*4882a593Smuzhiyun} 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun# add binaries manual via perf buildid-cache -a 91*4882a593Smuzhiyuntest_add ${ex_sha1} 92*4882a593Smuzhiyuntest_add ${ex_md5} 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun# add binaries via perf record post processing 95*4882a593Smuzhiyuntest_record ${ex_sha1} 96*4882a593Smuzhiyuntest_record ${ex_md5} 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun# cleanup 99*4882a593Smuzhiyunrm ${ex_sha1} ${ex_md5} 100*4882a593Smuzhiyun 101*4882a593Smuzhiyunexit ${err} 102