#!/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;
}

