#!/usr/bin/env bash
#
# Copyright (c) 2019-2020, Arm Limited. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#

#
# Run Coverity on a source tree.
# Then:
# - either produce a tarball ready to be submitted to Coverity Scan Online
#   [online mode]
# - or locally analyze and create a text report and HTML pages of the analysis
#   [offline mode]
#
# The following arguments must be passed to this script:
# 1. The command to use to build the software (this can be a script).
# 2. The mode: "online" or "offline".
# 3. The name of the output file to produce.
#    In the online mode, this should be a tarball name.
#    In the offline mode, this should be a text file name.
# 4. In the offline mode, the path to the source tree to analyze.
#
# Assumptions:
# The following tools are loaded in the PATH:
#  - the Coverity tools (cov-configure, cov-build, and so on);
#  - the AArch32 cross-toolchain.

# Bail out as soon as an error is encountered
set -e


function do_check_tools()
{
    local mode="$1"

    echo
    echo "Checking all required tools are available..."
    echo

    # Print version of the Coverity tools.
    # This also serves as a check that the tools are available.
    cov-configure --ident
    cov-build --ident
    if [[ "$mode" == "offline" ]]; then
	cov-analyze --ident
    fi

    # Check that the GNUARM cross-toolchain is available.
    arm-none-eabi-gcc --version

    echo
    echo "Checks complete."
    echo
}


function do_configure()
{
    # Create Coverity's configuration directory and its intermediate directory.
    rm -rf cov-config cov-int
    mkdir cov-config cov-int

    # Generate Coverity's configuration files.
    #
    # This needs to be done for each compiler.
    # Each invocation of the cov-configure command adds a compiler configuration in
    # its own subdirectory, and the top XML configuration file contains an include
    # directive for that compiler-specific configuration.
    #   1) AArch32 compiler
    cov-configure				\
	--comptype gcc				\
	--template				\
	--compiler arm-none-eabi-gcc			\
	--config cov-config/config.xml
}


function do_build()
{
    local build_cmd=("$*")

    echo
    echo "* The software will be built using the following command line:"
    echo "$build_cmd"
    echo

    # Build the instrumented binaries.
    cov-build				\
	--config cov-config/config.xml	\
	--dir cov-int			\
	$build_cmd

    echo
    echo "Build complete."
    echo
}


function do_analyze()
{
    local out="$1"
    local src_tree="$2"
    local profile="$3"
    out="${profile}_${out}"

    echo
    echo "Starting the local analysis..."
    echo "  (Profile: $profile)"
    echo
    echo "The results will be saved into '$out'."
    echo

    results_dir=$(pwd)
    cd "$src_tree"

    # Analyze the instrumented binaries.
    # Get the analysis settings from the right profile file.
    cov-analyze							\
	$(cat $(dirname "$0")/coverity_profile_${profile})	\
	${analysis_settings[@]}					\
	--dir "$results_dir/cov-int"				\
	--verbose 0						\
	--redirect stdout,"$results_dir/$out"

    # Generate HTML pages
    cov-format-errors						\
	--html-output "$results_dir/results/html/${profile}"	\
	--filesort						\
	--dir "$results_dir/cov-int"

    # Generate text report
    mkdir -p "$results_dir/results/text"
    cov-format-errors					\
	--emacs-style					\
	--filesort					\
	--dir "$results_dir/cov-int"			\
	> "$results_dir/results/text/${profile}"
    cd -
    echo "Analysis complete."
}


function create_results_tarball()
{
    local tarball_name="$1"

    echo
    echo "Creating the tarball containing the results of the analysis..."
    echo
    tar -czvf "$tarball_name" cov-int/
    echo
    echo "Complete."
    echo
}


###############################################################################
PHASE="$1"
echo "Coverity: phase '$PHASE'"
shift

case $PHASE in
    check_tools)
	ANALYSIS_MODE="$1"
	do_check_tools "$ANALYSIS_MODE"
    ;;

    configure)
	do_configure
    ;;

    build)
	do_build "$1"
    ;;

    analyze)
	OUTPUT_FILE="$1"
	SOURCE_TREE="$2"
	ANALYSIS_PROFILE="$3"
	do_analyze "$OUTPUT_FILE" "$SOURCE_TREE" "$ANALYSIS_PROFILE"
    ;;

    package)
	OUTPUT_FILE="$1"
	create_results_tarball "$OUTPUT_FILE"
	;;

    *)
	echo "Invalid phase '$PHASE'"
esac
