[PATCH] D40128: [ELF] - Reveal layout of synthetic mergeable sections when producing -Map

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 17 21:07:42 PST 2017


I'm inclined to directly implement what Samuel and other people want to lld
if it is useful for not only Chrome but also for other large projects that
want to keep track of their binary size and analyze their binary contents.

Such "analyze pass" is an independent pass, so it can be designed
separately than other passes in the linker.

We could emit enough information in a map file or something so that a
post-processor can analyze binary size, but it might be much easier to do
that in the linker, because the linker naturally knows almost everything.


On Fri, Nov 17, 2017 at 4:07 PM, Rafael Avila de Espindola <
rafael.espindola at gmail.com> wrote:

> Samuel, would the information included in this patch solve your problem?
>
> I agree that printing an address for each input section is bogus.
> Keeping the synthetic in the output is probably a good thing, since that
> is what has an address and it shows the final size of each merge.
>
> So what we have to figure out is a format that
> * Doesn't print a bogus address for input SHF_MERGE.
> * Still includes synthetic sections.
>
> This map is a direct textual dump of lld's internal state and it is a
> fact that some input sections are added directly to output sections
> and some are not. How about replacing "Out In" with "Section tree" and
> allowing it to have 2 or 3 levels?
>
> BTW, .eh_frame could also show up as 3 levels.
>
> Cheers,
> Rafael
>
>
> George Rimar via Phabricator <reviews at reviews.llvm.org> writes:
>
> > grimar created this revision.
> > Herald added subscribers: arichardson, emaste.
> >
> > It is inspired by comments for PR35248 though not directly relative to
> it.
> > It turns out we do not show the internal layout for mergeable sections
> when
> > producing Map file. Though it can be useful to show where is content
> coming from and
> > what is initial size (before mrging) and final size.
> > Patch adds support for dumping such sections.
> >
> >
> > https://reviews.llvm.org/D40128
> >
> > Files:
> >   ELF/MapFile.cpp
> >   ELF/SyntheticSections.h
> >   test/ELF/Inputs/map-file2.s
> >   test/ELF/map-file.s
> >
> >
> > Index: test/ELF/map-file.s
> > ===================================================================
> > --- test/ELF/map-file.s
> > +++ test/ELF/map-file.s
> > @@ -29,6 +29,9 @@
> >  abs = 0xAB5
> >  labs = 0x1AB5
> >
> > +.section .strings,"MS", at progbits,1
> > +.asciz "AAA"
> > +
> >  // CHECK:      Address          Size             Align Out     In
> Symbol
> >  // CHECK-NEXT: 0000000000200158 0000000000000030     8 .eh_frame
> >  // CHECK-NEXT: 0000000000200158 0000000000000030     8
>  <internal>:(.eh_frame)
> > @@ -49,12 +52,18 @@
> >  // CHECK-NEXT: 0000000000202000 0000000000000004    16 .bss
> >  // CHECK-NEXT: 0000000000202000 0000000000000004    16
>  {{.*}}{{/|\\}}map-file.s.tmp1.o:(COMMON)
> >  // CHECK-NEXT: 0000000000202000 0000000000000004     0
>  common
> > +// CHECK-NEXT: 0000000000000000 0000000000000008     2 .strings
> > +// CHECK-NEXT: 0000000000000000 0000000000000004     1
>  <internal>:(.strings)
> > +// CHECK-NEXT: 0000000000000000 0000000000000004     1
>  {{.*}}{{/|\\}}map-file.s.tmp1.o:(.strings)
> > +// CHECK-NEXT: 0000000000000004 0000000000000004     2
>  <internal>:(.strings)
> > +// CHECK-NEXT: 0000000000000000 0000000000000008     2
>  {{.*}}{{/|\\}}map-file.s.tmp2.o:(.strings)
> >  // CHECK-NEXT: 0000000000000000 0000000000000008     1 .comment
>
>
>
>
>
>
> >  // CHECK-NEXT: 0000000000000000 0000000000000008     1
>  <internal>:(.comment)
> > +// CHECK-NEXT: 0000000000000000 0000000000000008     1
>  <internal>:(.comment)
> >  // CHECK-NEXT: 0000000000000000 0000000000000120     8 .symtab
> >  // CHECK-NEXT: 0000000000000000 0000000000000120     8
>  <internal>:(.symtab)
> > -// CHECK-NEXT: 0000000000000000 0000000000000039     1 .shstrtab
> > -// CHECK-NEXT: 0000000000000000 0000000000000039     1
>  <internal>:(.shstrtab)
> > +// CHECK-NEXT: 0000000000000000 0000000000000042     1 .shstrtab
> > +// CHECK-NEXT: 0000000000000000 0000000000000042     1
>  <internal>:(.shstrtab)
> >  // CHECK-NEXT: 0000000000000000 0000000000000038     1 .strtab
> >  // CHECK-NEXT: 0000000000000000 0000000000000038     1
>  <internal>:(.strtab)
> >
> > Index: test/ELF/Inputs/map-file2.s
> > ===================================================================
> > --- test/ELF/Inputs/map-file2.s
> > +++ test/ELF/Inputs/map-file2.s
> > @@ -6,3 +6,7 @@
> >  .section .text.zed,"ax", at progbits
> >  .global zed
> >  zed:
> > +.section .strings,"MS", at progbits,1
> > +.align 2
> > +.asciz "AAA"
> > +.asciz "AAA"
> > Index: ELF/SyntheticSections.h
> > ===================================================================
> > --- ELF/SyntheticSections.h
> > +++ ELF/SyntheticSections.h
> > @@ -682,6 +682,8 @@
> >  public:
> >    void addSection(MergeInputSection *MS);
> >
> > +  ArrayRef<MergeInputSection *> getSections() { return Sections; }
> > +
> >  protected:
> >    MergeSyntheticSection(StringRef Name, uint32_t Type, uint64_t Flags,
> >                          uint32_t Alignment)
> > Index: ELF/MapFile.cpp
> > ===================================================================
> > --- ELF/MapFile.cpp
> > +++ ELF/MapFile.cpp
> > @@ -27,9 +27,11 @@
> >  #include "SymbolTable.h"
> >  #include "SyntheticSections.h"
> >  #include "lld/Common/Threads.h"
> > +#include "llvm/BinaryFormat/ELF.h"
> >  #include "llvm/Support/raw_ostream.h"
> >
> >  using namespace llvm;
> > +using namespace llvm::ELF;
> >  using namespace llvm::object;
> >
> >  using namespace lld;
> > @@ -132,6 +134,15 @@
> >          OS << indent(1) << toString(IS) << '\n';
> >          for (Defined *Sym : SectionSyms[IS])
> >            OS << SymStr[Sym] << '\n';
> > +
> > +        // Dump synthetic mergeable sections layout.
> > +        if (!isa<SyntheticSection>(IS) || !(IS->Flags & SHF_MERGE))
> > +          continue;
> > +        MergeSyntheticSection *MS = static_cast<MergeSyntheticSection
> *>(IS);
> > +        for (MergeInputSection *Sec : MS->getSections()) {
> > +          writeHeader(OS, 0, Sec->getSize(), Sec->Alignment);
> > +          OS << indent(2) << toString(Sec) << '\n';
> > +        }
> >        }
> >      }
> >    }
> >
> >
> > Index: test/ELF/map-file.s
> > ===================================================================
> > --- test/ELF/map-file.s
> > +++ test/ELF/map-file.s
> > @@ -29,6 +29,9 @@
> >  abs = 0xAB5
> >  labs = 0x1AB5
> >
> > +.section .strings,"MS", at progbits,1
> > +.asciz "AAA"
> > +
> >  // CHECK:      Address          Size             Align Out     In
> Symbol
> >  // CHECK-NEXT: 0000000000200158 0000000000000030     8 .eh_frame
> >  // CHECK-NEXT: 0000000000200158 0000000000000030     8
>  <internal>:(.eh_frame)
> > @@ -49,12 +52,18 @@
> >  // CHECK-NEXT: 0000000000202000 0000000000000004    16 .bss
> >  // CHECK-NEXT: 0000000000202000 0000000000000004    16
>  {{.*}}{{/|\\}}map-file.s.tmp1.o:(COMMON)
> >  // CHECK-NEXT: 0000000000202000 0000000000000004     0
>  common
> > +// CHECK-NEXT: 0000000000000000 0000000000000008     2 .strings
> > +// CHECK-NEXT: 0000000000000000 0000000000000004     1
>  <internal>:(.strings)
> > +// CHECK-NEXT: 0000000000000000 0000000000000004     1
>  {{.*}}{{/|\\}}map-file.s.tmp1.o:(.strings)
> > +// CHECK-NEXT: 0000000000000004 0000000000000004     2
>  <internal>:(.strings)
> > +// CHECK-NEXT: 0000000000000000 0000000000000008     2
>  {{.*}}{{/|\\}}map-file.s.tmp2.o:(.strings)
> >  // CHECK-NEXT: 0000000000000000 0000000000000008     1 .comment
> >  // CHECK-NEXT: 0000000000000000 0000000000000008     1
>  <internal>:(.comment)
> > +// CHECK-NEXT: 0000000000000000 0000000000000008     1
>  <internal>:(.comment)
> >  // CHECK-NEXT: 0000000000000000 0000000000000120     8 .symtab
> >  // CHECK-NEXT: 0000000000000000 0000000000000120     8
>  <internal>:(.symtab)
> > -// CHECK-NEXT: 0000000000000000 0000000000000039     1 .shstrtab
> > -// CHECK-NEXT: 0000000000000000 0000000000000039     1
>  <internal>:(.shstrtab)
> > +// CHECK-NEXT: 0000000000000000 0000000000000042     1 .shstrtab
> > +// CHECK-NEXT: 0000000000000000 0000000000000042     1
>  <internal>:(.shstrtab)
> >  // CHECK-NEXT: 0000000000000000 0000000000000038     1 .strtab
> >  // CHECK-NEXT: 0000000000000000 0000000000000038     1
>  <internal>:(.strtab)
> >
> > Index: test/ELF/Inputs/map-file2.s
> > ===================================================================
> > --- test/ELF/Inputs/map-file2.s
> > +++ test/ELF/Inputs/map-file2.s
> > @@ -6,3 +6,7 @@
> >  .section .text.zed,"ax", at progbits
> >  .global zed
> >  zed:
> > +.section .strings,"MS", at progbits,1
> > +.align 2
> > +.asciz "AAA"
> > +.asciz "AAA"
> > Index: ELF/SyntheticSections.h
> > ===================================================================
> > --- ELF/SyntheticSections.h
> > +++ ELF/SyntheticSections.h
> > @@ -682,6 +682,8 @@
> >  public:
> >    void addSection(MergeInputSection *MS);
> >
> > +  ArrayRef<MergeInputSection *> getSections() { return Sections; }
> > +
> >  protected:
> >    MergeSyntheticSection(StringRef Name, uint32_t Type, uint64_t Flags,
> >                          uint32_t Alignment)
> > Index: ELF/MapFile.cpp
> > ===================================================================
> > --- ELF/MapFile.cpp
> > +++ ELF/MapFile.cpp
> > @@ -27,9 +27,11 @@
> >  #include "SymbolTable.h"
> >  #include "SyntheticSections.h"
> >  #include "lld/Common/Threads.h"
> > +#include "llvm/BinaryFormat/ELF.h"
> >  #include "llvm/Support/raw_ostream.h"
> >
> >  using namespace llvm;
> > +using namespace llvm::ELF;
> >  using namespace llvm::object;
> >
> >  using namespace lld;
> > @@ -132,6 +134,15 @@
> >          OS << indent(1) << toString(IS) << '\n';
> >          for (Defined *Sym : SectionSyms[IS])
> >            OS << SymStr[Sym] << '\n';
> > +
> > +        // Dump synthetic mergeable sections layout.
> > +        if (!isa<SyntheticSection>(IS) || !(IS->Flags & SHF_MERGE))
> > +          continue;
> > +        MergeSyntheticSection *MS = static_cast<MergeSyntheticSection
> *>(IS);
> > +        for (MergeInputSection *Sec : MS->getSections()) {
> > +          writeHeader(OS, 0, Sec->getSize(), Sec->Alignment);
> > +          OS << indent(2) << toString(Sec) << '\n';
> > +        }
> >        }
> >      }
> >    }
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171117/fa231dca/attachment.html>


More information about the llvm-commits mailing list