[Feature]Upload Modem source code
Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/tools/MemoryUtility/CompareLibrarySize.pl b/mcu/tools/MemoryUtility/CompareLibrarySize.pl
new file mode 100644
index 0000000..0094902
--- /dev/null
+++ b/mcu/tools/MemoryUtility/CompareLibrarySize.pl
@@ -0,0 +1,235 @@
+#!/usr/bin/perl
+#
+# Copyright Statement:
+# --------------------
+# This software is protected by Copyright and the information contained
+# herein is confidential. The software may not be copied and the information
+# contained herein may not be used or disclosed except with the written
+# permission of MediaTek Inc. (C) 2006
+#
+# BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+# THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+# RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+# AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+# NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+# SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+# SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+# THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+# NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+# SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+#
+# BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+# LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+# AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+# OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+# MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+#
+# THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+# WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+# LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+# RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+# THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+#
+#*****************************************************************************
+#*
+#* Filename:
+#* ---------
+#* CompareLibrarySize.pl
+#*
+#* Project:
+#* --------
+#*
+#*
+#* Description:
+#* ------------
+#*
+#*
+#*
+#* Author:
+#* -------
+#* Carl Kao (mtk08237)
+#*
+#*------------------------------------------------------------------------------
+#* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+#*============================================================================
+#****************************************************************************/
+use strict;
+BEGIN { push @INC, "./" , '../', './tools/', './tools/MemoryUtility/' }
+use LinkerOutputParser;
+use File::Basename;
+
+&Usage() if ($#ARGV != 1);
+
+my ($file1, $file2) = @ARGV;
+$file1 =~ s/\\/\\\\/;
+$file2 =~ s/\\/\\\\/;
+
+my ($libs1_aref, $RO_1_href, $RW_1_href, $ZI_1_href, $libs2_aref, $RO_2_href, $RW_2_href, $ZI_2_href, $maxlength);
+
+if(($file1 =~ /\.map$/) && ($file2 =~ /\.map$/))
+{
+ ($libs1_aref, $RO_1_href, $RW_1_href, $ZI_1_href) = &GetAllLibs($file1);
+ ($libs2_aref, $RO_2_href, $RW_2_href, $ZI_2_href) = &GetAllLibs($file2);
+}
+else
+{
+ &Usage();
+}
+
+my @libs1 = @$libs1_aref;
+my @libs2 = @$libs2_aref;
+
+my %libs1 = map{$_ => 1} @libs1;
+my %libs2 = map{$_ => 1} @libs2;
+
+my @inter = grep {$libs1{$_}} @libs2;
+
+my %merge = map {$_ => 1} @libs1,@libs2;
+my @merge = sort keys (%merge);
+
+my @libs1_only = grep {!$libs2{$_}} @merge;
+my @libs2_only = grep {!$libs1{$_}} @merge;
+
+print "Compare result as below:\n";
+
+ printf "*" x ($maxlength+105) . "\n";
+ printf ("%-${maxlength}s%-35s%-35s\n"," ","Codebase1","Codebase2");
+ printf ("%-${maxlength}s%-35s%-35s%-35s\n","LibraryName","ROSize;RWSize;ZISize","ROSize;RWSize;ZISize","ROSize;RWSize;ZISize");
+ printf "*" x ($maxlength+105) . "\n";
+
+ my $total_RO_1 = 0;
+ my $total_RW_1 = 0;
+ my $total_ZI_1 = 0;
+ my $total_RO_2 = 0;
+ my $total_RW_2 = 0;
+ my $total_ZI_2 = 0;
+ my $total_RO_diff = 0;
+ my $total_RW_diff = 0;
+ my $total_ZI_diff = 0;
+ my $total_codebase1;
+ my $total_codebase2;
+ my $total_diff;
+
+ foreach my $lib(@merge)
+ {
+ $$RO_2_href{$lib} = 0 if(!defined $$RO_2_href{$lib});
+ $$RO_1_href{$lib} = 0 if(!defined $$RO_1_href{$lib});
+ $$RW_2_href{$lib} = 0 if(!defined $$RW_2_href{$lib});
+ $$RW_1_href{$lib} = 0 if(!defined $$RW_1_href{$lib});
+ $$ZI_2_href{$lib} = 0 if(!defined $$ZI_2_href{$lib});
+ $$ZI_1_href{$lib} = 0 if(!defined $$ZI_1_href{$lib});
+
+ my $RO_diff = $$RO_2_href{$lib} - $$RO_1_href{$lib};
+ my $RW_diff = $$RW_2_href{$lib} - $$RW_1_href{$lib};
+ my $ZI_diff = $$ZI_2_href{$lib} - $$ZI_1_href{$lib};
+
+ my $codebase1 = $$RO_1_href{$lib}.";".$$RW_1_href{$lib}.";".$$ZI_1_href{$lib};
+ my $codebase2 = $$RO_2_href{$lib}.";".$$RW_2_href{$lib}.";".$$ZI_2_href{$lib};
+ my $diff = $RO_diff.";".$RW_diff.";".$ZI_diff;
+
+ $total_RO_1 += $$RO_1_href{$lib};
+ $total_RW_1 += $$RW_1_href{$lib};
+ $total_ZI_1 += $$ZI_1_href{$lib};
+
+ $total_RO_2 += $$RO_2_href{$lib};
+ $total_RW_2 += $$RW_2_href{$lib};
+ $total_ZI_2 += $$ZI_2_href{$lib};
+
+ $total_RO_diff += $RO_diff;
+ $total_RW_diff += $RW_diff;
+ $total_ZI_diff += $ZI_diff;
+
+ $total_codebase1 = $total_RO_1.";".$total_RW_1.";".$total_ZI_1;
+ $total_codebase2 = $total_RO_2.";".$total_RW_2.";".$total_ZI_2;
+ $total_diff = $total_RO_diff.";".$total_RW_diff.";".$total_ZI_diff;
+
+ printf ("%-${maxlength}s%-35s%-35s%-35s\n",$lib,$codebase1,$codebase2,$diff);
+
+ }
+
+ printf ("%-${maxlength}s%-35s%-35s%-35s\n","Total",$total_codebase1,$total_codebase2,$total_diff);
+ printf "*" x ($maxlength+105) . "\n";
+
+
+sub GetAllLibs
+{
+ my ($file) = @_;
+ my $symfile = $file;
+ my $exeregion_aref;
+
+ if($file =~ /\.map$/)
+ {
+ $symfile =~ s/map/sym/;
+ if(!-f $symfile)
+ {
+ my $file = basename($symfile);
+ my $dirname = dirname($symfile);
+ $symfile = $dirname."\/dummy_$file";
+ }
+ &LinkerOutputParser::FileParse($symfile);
+ }
+ &LinkerOutputParser::FileParse($file);
+ $exeregion_aref = &LinkerOutputParser::ListAllExeRegion(1);
+
+ my %libs = ();
+ my @uni_libs = ();
+ my %RO_Size = ();
+ my %RW_Size = ();
+ my %ZI_Size = ();
+
+ if (defined $exeregion_aref)
+ {
+ foreach my $temp(@$exeregion_aref)
+ {
+ my $lib_aref = &LinkerOutputParser::GetLibByExeRegion($temp);
+ if (defined $lib_aref)
+ {
+ foreach (@$lib_aref)
+ {
+ map { $libs{$_} = 1} @$lib_aref;
+ }
+ }
+ }
+ }
+
+ foreach my $lib(keys %libs)
+ {
+ push (@uni_libs, $lib);
+ my ($nRO_Size, $nRW_Size, $nZI_Size) = (0,0,0);
+
+ if($file1 =~ /\.map$/)
+ {
+ $nRO_Size = &LinkerOutputParser::ListLibSummaryInfo($lib, "RO");
+ $nRW_Size = &LinkerOutputParser::ListLibSummaryInfo($lib, "RW");
+ $nZI_Size = &LinkerOutputParser::ListLibSummaryInfo($lib, "ZI");
+ $RO_Size{$lib} = $nRO_Size;
+ $RW_Size{$lib} = $nRW_Size;
+ $ZI_Size{$lib} = $nZI_Size;
+ $maxlength = $maxlength > length($lib) ? $maxlength:length($lib);
+ }
+ }
+
+ $maxlength += 10;
+ return (\@uni_libs, \%RO_Size, \%RW_Size, \%ZI_Size);
+}
+
+
+sub Usage
+{
+ print <<"__EOFUSAGE";
+
+usage: perl CompareLibrarySize.pl map_file_path1 map_file/path2
+
+map_file_path1: map file path for codebase1 you want to compare
+map_file_path2: map file path for codebase2 you want to compare
+
+e.g. perl CompareLibrarySize.pl "E:\\mtk80506\\MT6280_EVB_R7R8_PCB01_hspa_MT6280_S00\\MT6280_EVB_R7R8_PCB01_hspa_MT6280_S00.map" "E:\\mtk80506\\MT6280_EVB_R7R8_PCB01_hspa_MT6280_S00.map"
+
+Note:
+For GCC linker output, there should be corresponding .sym file in the same folder of .map file.
+
+__EOFUSAGE
+ exit 1;
+}