blob: 009490256f27dea43655e5ea7e443dd10a70b6ea [file] [log] [blame]
rjw6c1fd8f2022-11-30 14:33:01 +08001#!/usr/bin/perl
2#
3# Copyright Statement:
4# --------------------
5# This software is protected by Copyright and the information contained
6# herein is confidential. The software may not be copied and the information
7# contained herein may not be used or disclosed except with the written
8# permission of MediaTek Inc. (C) 2006
9#
10# BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
11# THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
12# RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
13# AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
14# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
15# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
16# NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
17# SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
18# SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
19# THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
20# NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
21# SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
22#
23# BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
24# LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
25# AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
26# OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
27# MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
28#
29# THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
30# WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
31# LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
32# RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
33# THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
34#
35#*****************************************************************************
36#*
37#* Filename:
38#* ---------
39#* CompareLibrarySize.pl
40#*
41#* Project:
42#* --------
43#*
44#*
45#* Description:
46#* ------------
47#*
48#*
49#*
50#* Author:
51#* -------
52#* Carl Kao (mtk08237)
53#*
54#*------------------------------------------------------------------------------
55#* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
56#*============================================================================
57#****************************************************************************/
58use strict;
59BEGIN { push @INC, "./" , '../', './tools/', './tools/MemoryUtility/' }
60use LinkerOutputParser;
61use File::Basename;
62
63&Usage() if ($#ARGV != 1);
64
65my ($file1, $file2) = @ARGV;
66$file1 =~ s/\\/\\\\/;
67$file2 =~ s/\\/\\\\/;
68
69my ($libs1_aref, $RO_1_href, $RW_1_href, $ZI_1_href, $libs2_aref, $RO_2_href, $RW_2_href, $ZI_2_href, $maxlength);
70
71if(($file1 =~ /\.map$/) && ($file2 =~ /\.map$/))
72{
73 ($libs1_aref, $RO_1_href, $RW_1_href, $ZI_1_href) = &GetAllLibs($file1);
74 ($libs2_aref, $RO_2_href, $RW_2_href, $ZI_2_href) = &GetAllLibs($file2);
75}
76else
77{
78 &Usage();
79}
80
81my @libs1 = @$libs1_aref;
82my @libs2 = @$libs2_aref;
83
84my %libs1 = map{$_ => 1} @libs1;
85my %libs2 = map{$_ => 1} @libs2;
86
87my @inter = grep {$libs1{$_}} @libs2;
88
89my %merge = map {$_ => 1} @libs1,@libs2;
90my @merge = sort keys (%merge);
91
92my @libs1_only = grep {!$libs2{$_}} @merge;
93my @libs2_only = grep {!$libs1{$_}} @merge;
94
95print "Compare result as below:\n";
96
97 printf "*" x ($maxlength+105) . "\n";
98 printf ("%-${maxlength}s%-35s%-35s\n"," ","Codebase1","Codebase2");
99 printf ("%-${maxlength}s%-35s%-35s%-35s\n","LibraryName","ROSize;RWSize;ZISize","ROSize;RWSize;ZISize","ROSize;RWSize;ZISize");
100 printf "*" x ($maxlength+105) . "\n";
101
102 my $total_RO_1 = 0;
103 my $total_RW_1 = 0;
104 my $total_ZI_1 = 0;
105 my $total_RO_2 = 0;
106 my $total_RW_2 = 0;
107 my $total_ZI_2 = 0;
108 my $total_RO_diff = 0;
109 my $total_RW_diff = 0;
110 my $total_ZI_diff = 0;
111 my $total_codebase1;
112 my $total_codebase2;
113 my $total_diff;
114
115 foreach my $lib(@merge)
116 {
117 $$RO_2_href{$lib} = 0 if(!defined $$RO_2_href{$lib});
118 $$RO_1_href{$lib} = 0 if(!defined $$RO_1_href{$lib});
119 $$RW_2_href{$lib} = 0 if(!defined $$RW_2_href{$lib});
120 $$RW_1_href{$lib} = 0 if(!defined $$RW_1_href{$lib});
121 $$ZI_2_href{$lib} = 0 if(!defined $$ZI_2_href{$lib});
122 $$ZI_1_href{$lib} = 0 if(!defined $$ZI_1_href{$lib});
123
124 my $RO_diff = $$RO_2_href{$lib} - $$RO_1_href{$lib};
125 my $RW_diff = $$RW_2_href{$lib} - $$RW_1_href{$lib};
126 my $ZI_diff = $$ZI_2_href{$lib} - $$ZI_1_href{$lib};
127
128 my $codebase1 = $$RO_1_href{$lib}.";".$$RW_1_href{$lib}.";".$$ZI_1_href{$lib};
129 my $codebase2 = $$RO_2_href{$lib}.";".$$RW_2_href{$lib}.";".$$ZI_2_href{$lib};
130 my $diff = $RO_diff.";".$RW_diff.";".$ZI_diff;
131
132 $total_RO_1 += $$RO_1_href{$lib};
133 $total_RW_1 += $$RW_1_href{$lib};
134 $total_ZI_1 += $$ZI_1_href{$lib};
135
136 $total_RO_2 += $$RO_2_href{$lib};
137 $total_RW_2 += $$RW_2_href{$lib};
138 $total_ZI_2 += $$ZI_2_href{$lib};
139
140 $total_RO_diff += $RO_diff;
141 $total_RW_diff += $RW_diff;
142 $total_ZI_diff += $ZI_diff;
143
144 $total_codebase1 = $total_RO_1.";".$total_RW_1.";".$total_ZI_1;
145 $total_codebase2 = $total_RO_2.";".$total_RW_2.";".$total_ZI_2;
146 $total_diff = $total_RO_diff.";".$total_RW_diff.";".$total_ZI_diff;
147
148 printf ("%-${maxlength}s%-35s%-35s%-35s\n",$lib,$codebase1,$codebase2,$diff);
149
150 }
151
152 printf ("%-${maxlength}s%-35s%-35s%-35s\n","Total",$total_codebase1,$total_codebase2,$total_diff);
153 printf "*" x ($maxlength+105) . "\n";
154
155
156sub GetAllLibs
157{
158 my ($file) = @_;
159 my $symfile = $file;
160 my $exeregion_aref;
161
162 if($file =~ /\.map$/)
163 {
164 $symfile =~ s/map/sym/;
165 if(!-f $symfile)
166 {
167 my $file = basename($symfile);
168 my $dirname = dirname($symfile);
169 $symfile = $dirname."\/dummy_$file";
170 }
171 &LinkerOutputParser::FileParse($symfile);
172 }
173 &LinkerOutputParser::FileParse($file);
174 $exeregion_aref = &LinkerOutputParser::ListAllExeRegion(1);
175
176 my %libs = ();
177 my @uni_libs = ();
178 my %RO_Size = ();
179 my %RW_Size = ();
180 my %ZI_Size = ();
181
182 if (defined $exeregion_aref)
183 {
184 foreach my $temp(@$exeregion_aref)
185 {
186 my $lib_aref = &LinkerOutputParser::GetLibByExeRegion($temp);
187 if (defined $lib_aref)
188 {
189 foreach (@$lib_aref)
190 {
191 map { $libs{$_} = 1} @$lib_aref;
192 }
193 }
194 }
195 }
196
197 foreach my $lib(keys %libs)
198 {
199 push (@uni_libs, $lib);
200 my ($nRO_Size, $nRW_Size, $nZI_Size) = (0,0,0);
201
202 if($file1 =~ /\.map$/)
203 {
204 $nRO_Size = &LinkerOutputParser::ListLibSummaryInfo($lib, "RO");
205 $nRW_Size = &LinkerOutputParser::ListLibSummaryInfo($lib, "RW");
206 $nZI_Size = &LinkerOutputParser::ListLibSummaryInfo($lib, "ZI");
207 $RO_Size{$lib} = $nRO_Size;
208 $RW_Size{$lib} = $nRW_Size;
209 $ZI_Size{$lib} = $nZI_Size;
210 $maxlength = $maxlength > length($lib) ? $maxlength:length($lib);
211 }
212 }
213
214 $maxlength += 10;
215 return (\@uni_libs, \%RO_Size, \%RW_Size, \%ZI_Size);
216}
217
218
219sub Usage
220{
221 print <<"__EOFUSAGE";
222
223usage: perl CompareLibrarySize.pl map_file_path1 map_file/path2
224
225map_file_path1: map file path for codebase1 you want to compare
226map_file_path2: map file path for codebase2 you want to compare
227
228e.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"
229
230Note:
231For GCC linker output, there should be corresponding .sym file in the same folder of .map file.
232
233__EOFUSAGE
234 exit 1;
235}