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

Rafael Avila de Espindola via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 17 14:07:08 PST 2017


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';
> +        }
>        }
>      }
>    }


More information about the llvm-commits mailing list