#!/usr/bin/perl

# Copyright (C) 2006, 2007, 2008 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.
# 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
#     its contributors may be used to endorse or promote products derived
#     from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY APPLE 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 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-global-initializers" script for WebKit Open Source Project

# Intended to be invoked from an Xcode build step to check if there are
# any global initializers in a target.

use warnings;
use strict;

use File::Basename;

sub touch($);
sub demangle($);

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

$arch = $ENV{'NATIVE_ARCH'} if !$arch; # for Xcode 2.1, which does not have CURRENT_ARCH
$variant = "normal" if !$variant; # for Xcode 2.1, which does not have CURRENT_VARIANT

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

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

my $list = $ENV{"LINK_FILE_LIST_${variant}_${arch}"};

if (!open LIST, $list) {
    print "ERROR: Could not open $list\n";
    exit 1;
}

my @files = <LIST>;
chomp @files;
close LIST;

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 $sawGlobal = 0;
    my @globals;
    while (<NM>) {
        if (/^STDOUT:/) {
            my $line = $_;
            if ($line =~ /__GLOBAL__I(.+)$/) {
                $sawGlobal = 1;
                push(@globals, demangle($1));
            }
        } else {
            print STDERR if $_ ne "nm: no name list\n";
        }
    }
    close NM;
    if ($sawGlobal) {
        my $shortName = $file;
        $shortName =~ s/.*\///;

        # Special cases for files that have initializers in debug builds.
        if ($configuration eq "Debug" or $variant eq "debug" or $debugRoot) {
            if ($target eq "JavaScriptCore") {
                next if $shortName eq "AllInOneFile.o";
                next if $shortName eq "Opcode.o";
                next if $shortName eq "Structure.o";
                next if $shortName eq "nodes.o";
            }
            if ($target eq "WebCore") {
                next if $shortName eq "BidiRun.o";
                next if $shortName eq "CachedPage.o";
                next if $shortName eq "CachedResource.o";
                next if $shortName eq "FEGaussianBlur.o";
                next if $shortName eq "Frame.o";
                next if $shortName eq "JSCustomSQLTransactionCallback.o";
                next if $shortName eq "JSLazyEventListener.o";
                next if $shortName eq "Node.o";
                next if $shortName eq "Page.o";
                next if $shortName eq "Range.o";
                next if $shortName eq "RenderObject.o";
                next if $shortName eq "SVGElementInstance.o";
                next if $shortName eq "SubresourceLoader.o";
                next if $shortName eq "XMLHttpRequest.o";
            }
            if ($target eq "WebKit") {
                next if $shortName eq "HostedNetscapePluginStream.o";
                next if $shortName eq "NetscapePluginInstanceProxy.o";
            }
            if ($target eq "WebKit2") {
                next if $shortName eq "WebContext.o";
                next if $shortName eq "WebFrame.o";
                next if $shortName eq "WebPage.o";
                next if $shortName eq "WebPageProxy.o";
            }
        }

        print "ERROR: $shortName has one or more global initializers in it! ($file), near @globals\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);
}

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;
}

