#!/usr/bin/env perl

# Copyright (C) 2006-2008, 2016 Apple Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1.  Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
# 2.  Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# "check-for-exit-time-destructors" script for WebKit Open Source Project

# Intended to be invoked from an Xcode build step to check if there are
# any exit-time destructors in a target.

use warnings;
use strict;

use File::Basename;
use File::Spec;
use Getopt::Long;

sub touch($);
sub printFunctions($$);

my $coverageBuild;
my $executablePath;
my @files;
my $showHelp;
my $tempDir;

if (@ARGV) {
    # Running in interactive mode with arguments.
    my $result = GetOptions(
        "h|help" => \$showHelp,
    );
    $executablePath = glob(shift @ARGV);

    if (!$result || $showHelp || @ARGV > 0) {
        print STDERR "Check for exit-time destructors.\n";
        print STDERR "Usage: " . basename($0) . " [options] path/to/executable\n";
        print STDERR <<END;
  [-h|--help]                    show this help message
END
        exit 1;
    }

    $tempDir = File::Spec->tmpdir();
    @files = ($executablePath);
} else {
    # Running from Xcode build phase script with no arguments.
    $coverageBuild = $ENV{'WEBKIT_COVERAGE_BUILD'};
    $executablePath = "$ENV{'TARGET_BUILD_DIR'}/$ENV{'EXECUTABLE_PATH'}";
    $tempDir = $ENV{'TARGET_TEMP_DIR'};

    my $arch = $ENV{'CURRENT_ARCH'};
    my @variants = split(" ", $ENV{'BUILD_VARIANTS'});
    my $variant = $variants[0];  # FIXME: Multi-variant builds only check first variant.
    my $list = $ENV{"LINK_FILE_LIST_${variant}_${arch}"};
    open LIST, $list || die "ERROR: Could not open $list\n";
    @files = <LIST>;
    chomp @files;
    close LIST;
}

my $buildTimestampPath = File::Spec->catfile($tempDir, basename($0) . ".timestamp");
my $buildTimestampAge = -M $buildTimestampPath;
my $scriptAge = -M $0;

my $sawError = 0;

for my $file (sort @files) {
    if (defined $buildTimestampAge && $buildTimestampAge < $scriptAge) {
        my $fileAge = -M $file;
        next if defined $fileAge && $fileAge > $buildTimestampAge;
    }
    if (!open NM, "(nm '$file' | sed 's/^/STDOUT:/') 2>&1 |") {
        print "ERROR: Could not open $file\n";
        $sawError = 1;
        next;
    }
    my $sawAtExit = 0;
    my $shortName = $file;
    $shortName =~ s/.*\///;

    while (<NM>) {
        if (/^STDOUT:/) {
            # With GC logging enabled Heap.o may contain finalizers, so we ignore them.
            $sawAtExit = 1 if (/___cxa_atexit/ && ($shortName ne "Heap.o"));
        } else {
            print STDERR if $_ ne "nm: no name list\n";
        }
    }
    close NM;
    next unless $sawAtExit;

    $sawError = 1 if printFunctions($shortName, $file);
}

if ($sawError and !$coverageBuild) {
    print "ERROR: Use static NeverDestroyed<T> from <wtf/NeverDestroyed.h>\n";
    unlink $executablePath;
    exit 1;
}

touch($buildTimestampPath);
exit 0;

sub touch($)
{
    my ($path) = @_;
    open(TOUCH, ">", $path) or die "$!";
    close(TOUCH);
}

sub demangle($)
{
    my ($symbol) = @_;
    if (!open FILT, "c++filt $symbol |") {
        print "ERROR: Could not open c++filt\n";
        return;
    }
    my $result = <FILT>;
    close FILT;
    chomp $result;
    return $result;
}

sub printFunctions($$)
{
    my ($shortName, $path) = @_;
    if (!open OTOOL, "otool -tV '$path' |") {
        print "WARNING: Could not open $path\n";
        return 0;
    }
    my %functions;
    my $currentSymbol = "";
    while (<OTOOL>) {
        $currentSymbol = $1 if /^(\w+):$/;
        next unless $currentSymbol;
        $functions{demangle($currentSymbol)} = 1 if /___cxa_atexit/;
    }
    close OTOOL;
    my $result = 0;
    for my $function (sort keys %functions) {
        if (!$result) {
            print "ERROR: $shortName has exit time destructors in it! ($path)\n";
            $result = 1;
        }
        print "ERROR: In function $function\n";
    }
    return $result;
}
