blob: 9fa575d728b4a85c330f44718bded5e444a2a44e [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#* CompareObjSize.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 ($objs1_aref, $RO_1_href, $RW_1_href, $ZI_1_href, $objs2_aref, $RO_2_href, $RW_2_href, $ZI_2_href, $maxlength);
70
71if(($file1 =~ /\.lis$/) && ($file2 =~ /\.lis$/) or ($file1 =~ /\.map$/) && ($file2 =~ /\.map$/))
72{
73 ($objs1_aref, $RO_1_href, $RW_1_href, $ZI_1_href) = &GetAllOBJs($file1);
74 ($objs2_aref, $RO_2_href, $RW_2_href, $ZI_2_href) = &GetAllOBJs($file2);
75}
76else
77{
78 &Usage();
79}
80
81my @objs1 = @$objs1_aref;
82my @objs2 = @$objs2_aref;
83
84my %objs1 = map{$_ => 1} @objs1;
85my %objs2 = map{$_ => 1} @objs2;
86
87my @inter = grep {$objs1{$_}} @objs2;
88
89my %merge = map {$_ => 1} @objs1,@objs2;
90my @merge = sort keys (%merge);
91
92my @objs1_only = grep {!$objs2{$_}} @merge;
93my @objs2_only = grep {!$objs1{$_}} @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","ObjectName","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 $obj(@merge)
116 {
117 $$RO_2_href{$obj} = 0 if(!defined $$RO_2_href{$obj});
118 $$RO_1_href{$obj} = 0 if(!defined $$RO_1_href{$obj});
119 $$RW_2_href{$obj} = 0 if(!defined $$RW_2_href{$obj});
120 $$RW_1_href{$obj} = 0 if(!defined $$RW_1_href{$obj});
121 $$ZI_2_href{$obj} = 0 if(!defined $$ZI_2_href{$obj});
122 $$ZI_1_href{$obj} = 0 if(!defined $$ZI_1_href{$obj});
123
124 my $RO_diff = $$RO_2_href{$obj} - $$RO_1_href{$obj};
125 my $RW_diff = $$RW_2_href{$obj} - $$RW_1_href{$obj};
126 my $ZI_diff = $$ZI_2_href{$obj} - $$ZI_1_href{$obj};
127
128 my $codebase1 = $$RO_1_href{$obj}.";".$$RW_1_href{$obj}.";".$$ZI_1_href{$obj};
129 my $codebase2 = $$RO_2_href{$obj}.";".$$RW_2_href{$obj}.";".$$ZI_2_href{$obj};
130 my $diff = $RO_diff.";".$RW_diff.";".$ZI_diff;
131
132 $total_RO_1 += $$RO_1_href{$obj};
133 $total_RW_1 += $$RW_1_href{$obj};
134 $total_ZI_1 += $$ZI_1_href{$obj};
135
136 $total_RO_2 += $$RO_2_href{$obj};
137 $total_RW_2 += $$RW_2_href{$obj};
138 $total_ZI_2 += $$ZI_2_href{$obj};
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",$obj,$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 GetAllOBJs
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
177 my @objs = ();
178 my @uni_objs = ();
179 my %RO_Size;
180 my %RW_Size;
181 my %ZI_Size;
182 my %RWZI_Size;
183 my %count;
184
185 if (defined $exeregion_aref)
186 {
187 foreach my $temp(@$exeregion_aref)
188 {
189 my $obj_aref = &LinkerOutputParser::GetObjByExeRegion($temp);
190 if (defined $obj_aref)
191 {
192 foreach (@$obj_aref)
193 {
194 push(@objs, $_);
195 }
196 }
197 }
198 }
199
200 @uni_objs = grep { ++$count{ $_ } < 2; } @objs;
201 $maxlength = 0;
202
203 foreach my $obj(@uni_objs)
204 {
205 my ($nRO_Size, $nRW_Size, $nZI_Size) = (0,0,0);
206
207 if($file1 =~ /\.lis$/)
208 {
209 $nRO_Size = &LinkerOutputParser::ListObjSummaryInfo($obj, "RO Data") + &LinkerOutputParser::ListObjSummaryInfo($obj, "Code");
210 $nRW_Size = &LinkerOutputParser::ListObjSummaryInfo($obj, "RW Data");
211 $nZI_Size = &LinkerOutputParser::ListObjSummaryInfo($obj, "ZI Data");
212 $RO_Size{$obj} = $nRO_Size;
213 $RW_Size{$obj} = $nRW_Size;
214 $ZI_Size{$obj} = $nZI_Size;
215 $maxlength = $maxlength > length($obj) ? $maxlength:length($obj);
216 }
217 elsif($file1 =~ /\.map$/)
218 {
219 $nRO_Size = &LinkerOutputParser::ListObjSummaryInfo($obj, "RO");
220 $nRW_Size = &LinkerOutputParser::ListObjSummaryInfo($obj, "RW");
221 $nZI_Size = &LinkerOutputParser::ListObjSummaryInfo($obj, "ZI");
222 $RO_Size{$obj} = $nRO_Size;
223 $RW_Size{$obj} = $nRW_Size;
224 $ZI_Size{$obj} = $nZI_Size;
225 $maxlength = $maxlength > length($obj) ? $maxlength:length($obj);
226 }
227 }
228
229 $maxlength += 10;
230 return (\@uni_objs, \%RO_Size, \%RW_Size, \%ZI_Size);
231}
232
233
234sub Usage
235{
236 print <<"__EOFUSAGE";
237
238usage: perl CompareobjrarySize.pl lis/map_file_path1 lis/map_file/path2
239
240lis/map_file_path1: lis/map file path for codebase1 you want to compare
241lis/map_file_path2: lis/map file path for codebase2 you want to compare
242
243lis/map_file_path1, lis/map_file_path2 should be the same file type (both .lis file or both .map file, comparison between .lis and .map is not supported)
244
245e.g. perl CompareobjrarySize.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"
246
247Note:
248For GCC linker output, there should be corresponding .sym file in the same folder of .map file.
249
250__EOFUSAGE
251 exit 1;
252}