Skip to content
Snippets Groups Projects
frama-c-callgrind.sh 2.53 KiB
#!/bin/bash
##########################################################################
#                                                                        #
#  This file is part of Frama-C.                                         #
#                                                                        #
#  Copyright (C) 2007-2022                                               #
#    CEA (Commissariat à l'énergie atomique et aux énergies              #
#         alternatives)                                                  #
#                                                                        #
#  you can redistribute it and/or modify it under the terms of the GNU   #
#  Lesser General Public License as published by the Free Software       #
#  Foundation, version 2.1.                                              #
#                                                                        #
#  It is distributed in the hope that it will be useful,                 #
#  but WITHOUT ANY WARRANTY; without even the implied warranty of        #
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         #
#  GNU Lesser General Public License for more details.                   #
#                                                                        #
#  See the GNU Lesser General Public License version 2.1                 #
#  for more details (enclosed in the file licenses/LGPLv2.1).            #
#                                                                        #
##########################################################################

# Script for profiling Frama-C with callgrind (a valgrind tool).
# Note: execution time with valgrind is about 15x-20x slower.
#
# Use this script at the root of the repository, so local_export.sh can be found
# in bin.
# For more focused results, you can activate the profiling only after entering
# a specific function. For instance, to only profile Eva, add
#
#   --toggle-collect='*Eva__Analysis__force_compute*'
#
# to the command line below.
#
# Example of invocation :
#
#   devel_tools/frama-c-callgrind tests/idct/*.c -eva -float-normal -no-warn-signed-overflow
#
# This creates a 'callgrind.out' file (Callgrind format), which can be viewed
# with a tool such as kcachegrind:
#
#   kcachegrind callgrind.out

BASH_ARGV0="bin/frama-c" # hackish way to tell local_export that its dir is bin

. bin/local_export.sh

valgrind \
  --tool=callgrind --callgrind-out-file=callgrind.out --dump-instr=yes \
  --separate-callers=2 --collect-jumps=yes --fn-skip='caml_*' \
  $BINDIR/toplevel.opt "$@"