#!/usr/bin/env perl

# Copyright (C) 2006-2008, 2010, 2013, 2015 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-weak-vtables-and-externals" script for WebKit Open Source Project

# Intended to be invoked from an Xcode build step to check if there are
# any weak vtables or weak externals in a target.

use warnings;
use strict;

use File::Basename;
use File::Spec;
use FindBin;
use lib $FindBin::Bin;
use webkitdirs;

sub touch($);

my $arch = $ENV{'CURRENT_ARCH'};
my $configuration = $ENV{'CONFIGURATION'};
my $target = $ENV{'TARGET_NAME'};
my $coverageBuild = $ENV{'WEBKIT_COVERAGE_BUILD'};
my $debugRoot = $ENV{'WEBKIT_DEBUG_ROOT'};

my $executablePath = "$ENV{'TARGET_BUILD_DIR'}/$ENV{'EXECUTABLE_PATH'}";

my $buildTimestampPath = $ENV{'TARGET_TEMP_DIR'} . "/" . basename($0) . ".timestamp";
my $buildTimestampAge = -M $buildTimestampPath;
my $executablePathAge = -M $executablePath;

my $sawError = 0;

if (!defined $executablePathAge || !defined $buildTimestampAge || $executablePathAge < $buildTimestampAge) {
    if (!open NM, "(nm -m '$executablePath' | sed 's/^/STDOUT:/') 2>&1 |") {
        print "ERROR: Could not open $executablePath\n";
        $sawError = 1;
        next;
    }
    my @weakVTableClasses = ();
    my @weakExternalSymbols = ();
    while (<NM>) {
        if (/^STDOUT:/) {
            # Ignore undefined, RTTI and typeinfo symbols.
            next if /\bundefined\b/ or /\b__ZT[IS]/;

            # ASan compiler-rt calls into __asan_mapping_offset and __asan_mapping_scale
            next if /\b___asan/;

            # Ignore weak symbols present when compiling with coverage enabled.
            next if /\b(___llvm_profile_filename|___llvm_profile_raw_version|_lprofDirMode)/ && coverageIsEnabled();

            if (/weak external vtable for (.*)$/) {
                push @weakVTableClasses, $1;
            } elsif (/weak external (.*)$/) {
                push @weakExternalSymbols, $1;
            }
        } else {
            print STDERR if $_ ne "nm: no name list\n";
        }
    }
    close NM;

    my $shortName = $executablePath;
    $shortName =~ s/.*\///;

    if (@weakVTableClasses) {
        print "ERROR: $shortName has a weak vtable in it ($executablePath)\n";
        print "ERROR: Fix by making sure the first virtual function in each of these classes is not an inline:\n";
        for my $class (sort @weakVTableClasses) {
            print "ERROR: class $class\n";
        }
        $sawError = 1;
    }

    if (@weakExternalSymbols) {
        print "ERROR: $shortName has a weak external symbol in it ($executablePath)\n";
        print "ERROR: A weak external symbol is generated when a symbol is defined in multiple compilation units and is also marked as being exported from the library.\n";
        print "ERROR: A common cause of weak external symbols is when an inline function is listed in the linker export file.\n";
        for my $symbol (sort @weakExternalSymbols) {
            print "ERROR: symbol $symbol\n";
        }
        $sawError = 1;
    }
}

if ($sawError and !$coverageBuild) {
    unlink $executablePath;
    exit 1;
}

touch($buildTimestampPath);

exit 0;

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