Hi

Attached is a shell script (pokes Chris) which calculates the size of
the specified symbol across a set of .exe files.

[joel@rtbf64c samples]$ /tmp/cmp_sizes -a sparc -s
_Workspace_Allocate_or_fatal_error *.exe
Size report for _Workspace_Allocate_or_fatal_error
         base_sp.exe - 0x4000c5a0 - 0x4000c5e0 (64)
         capture.exe - 0x400162a0 - 0x400162dc (60)
          cdtest.exe - 0x4001e6c4 - 0x4001e700 (60)
    cxx_iostream.exe - 0x4005cbdc - 0x4005cc20 (68)
          fileio.exe - 0x40020720 - 0x4002075c (60)
           hello.exe - 0x4000ac50 - 0x4000aca0 (80)
         minimum.exe - 0x40006240 - 0x40006280 (64)
           nsecs.exe - 0x4000c668 - 0x4000c6c0 (88)
        paranoia.exe - 0x4001426c - 0x400142c0 (84)
          ticker.exe - 0x4000d328 - 0x4000d380 (88)
       unlimited.exe - 0x4000cc0c - 0x4000cc60 (84)

NOTE: Each SPARC instruction is ALWAYS 4 bytes. That will be
important as we look at instruction addresses.

I objdump'ed (sparc-rtems5-objdump -S) each exe as I got to it in
the analysis. ( sparc-rtems5-objdump -S XXX.exe >XXX.dmp)

I started looking at the smallest one (capture.exe). It looks to
follow the pattern one expects when there is no padding needed
between it and the next method. [1]

Then I looked at ticker.dmp since it was one of the largest ones.
It puts a line with "..." at the end of the method and there was
a fairly large gap (0x360 - 0x380 - 4) which is 0x1c bytes of gap.

BUG 1: It looks like the output of objdump has changed its output
a bit and ObjdumpProcessor.cc is not recognizing the "..." line as
the end of a method. If you fix this issue, I suspect the ones ~80
bytes will be the right size.

Now let's move on to another one with a smaller size difference.
It is also an easier fix.  Look at base_sp.dmp. The last instruction is:

4000c5dc: 00 00 00 00 unimp  0

Now look in Target_sparc.cc in IsNopLine(). That "instruction" is
not recognized as a nop.

BUG 2: Add logic to Target_sparc.cc to process that line as a nop.

As a final check, I looked at cxx_iostream.dmp which is 8 bytes
(e.g. 2 instructions) of padding. it uses the "..." line to indicate
padding.

So there's two bugs to fix which should address the situation.
The bugs are important but it is just as important that you understand
the process of how I tracked down what was going wrong. These
two are common problems.

  (a) issues processing the objdump
  (b) not understanding a nop

Once you get all the input into the C++ structures, life tends to
just be magically delicious. :)

[1] Padding is inserted by ld when linking the program to put
the first part of a function on a cache line boundary.

--joel

Attachment: cmp_sizes
Description: Binary data

_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to