#!/usr/bin/perl

# Try:
#  gcc -static -o test test.c -Wl,--print-map | perl parse-map.pl | unflatten -l 3 | dot -Tpng > map.png
#
# This won't show all edges!  An archive member is only listed the first
# time it needs to get included.  But this shows at least one reason why each
# archive member appears in the final object.

my $flag = 0;
my $line = "";
print "digraph map {\n";
print "rankdir = LR;";
while(<>)
{
    $flag++ if /^Archive member included because of file \(symbol\)$/;
    $flag++ if /^$/;
    next unless $flag == 2;

    chomp ($line .= $_);
    if ($line =~ /^(\S+)\s+(\S+)\s+\(([^)]+)\)$/s) {
	$line = "";
	my $archive_member = $1;
	my $because_file = $2;
	my $because_symbol = $3;
	$archive_member =~ s|.*/([^/]+)|$1|;
	$because_file =~ s|.*/([^/]+)|$1|;
	print "\"$because_file\" -> \"$archive_member\";\n";
    }
}
print "}\n";