#!/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 $variant = $ENV{'CURRENT_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;
}
