#!/bin/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 AArch64 cross-toolchain;
#  - 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 AArch64 cross-toolchain is available.
    aarch64-none-elf-gcc --version

    # Check that the AArch32 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) AArch64 compiler
    cov-configure				\
	--comptype gcc				\
	--template				\
	--compiler aarch64-none-elf-gcc	\
	--config cov-config/config.xml
    #   2) 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
