[lld] r329271 - [ELF] - Print LMA in a -Map file.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 5 03:51:06 PDT 2018


Author: grimar
Date: Thu Apr  5 03:51:06 2018
New Revision: 329271

URL: http://llvm.org/viewvc/llvm-project?rev=329271&view=rev
Log:
[ELF] - Print LMA in a -Map file.

Currently, LLD prints VA, but not LMA in a map file.
It seems can be useful to print both to reveal layout
details and patch implements it.

Differential revision: https://reviews.llvm.org/D44899

Added:
    lld/trunk/test/ELF/linkerscript/Inputs/map-file2.s
    lld/trunk/test/ELF/linkerscript/map-file2.test
Modified:
    lld/trunk/ELF/MapFile.cpp
    lld/trunk/test/ELF/linkerscript/map-file.test
    lld/trunk/test/ELF/map-file.s

Modified: lld/trunk/ELF/MapFile.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/MapFile.cpp?rev=329271&r1=329270&r2=329271&view=diff
==============================================================================
--- lld/trunk/ELF/MapFile.cpp (original)
+++ lld/trunk/ELF/MapFile.cpp Thu Apr  5 03:51:06 2018
@@ -44,10 +44,10 @@ static const std::string Indent8 = "
 static const std::string Indent16 = "                "; // 16 spaces
 
 // Print out the first three columns of a line.
-static void writeHeader(raw_ostream &OS, uint64_t Addr, uint64_t Size,
-                        uint64_t Align) {
+static void writeHeader(raw_ostream &OS, uint64_t VMA, uint64_t LMA,
+                        uint64_t Size, uint64_t Align) {
   int W = Config->Is64 ? 16 : 8;
-  OS << format("%0*llx %0*llx %5lld ", W, Addr, W, Size, Align);
+  OS << format("%*llx %9llx %*llx %5lld ", W, VMA, LMA, W, Size, Align);
 }
 
 // Returns a list of all symbols that we want to print out.
@@ -102,7 +102,10 @@ getSymbolStrings(ArrayRef<Symbol *> Syms
   std::vector<std::string> Str(Syms.size());
   parallelForEachN(0, Syms.size(), [&](size_t I) {
     raw_string_ostream OS(Str[I]);
-    writeHeader(OS, Syms[I]->getVA(), Syms[I]->getSize(), 1);
+    OutputSection *OSec = Syms[I]->getOutputSection();
+    uint64_t VMA = Syms[I]->getVA();
+    uint64_t LMA = OSec ? OSec->getLMA() + VMA - OSec->getVA(0) : 0;
+    writeHeader(OS, VMA, LMA, Syms[I]->getSize(), 1);
     OS << Indent16 << toString(*Syms[I]);
   });
 
@@ -143,7 +146,8 @@ static void printEhFrame(raw_ostream &OS
 
   // Print out section pieces.
   for (EhSectionPiece &P : Pieces) {
-    writeHeader(OS, OSec->Addr + P.OutputOff, P.Size, 1);
+    writeHeader(OS, OSec->Addr + P.OutputOff, OSec->getLMA() + P.OutputOff,
+                P.Size, 1);
     OS << Indent8 << toString(P.Sec->File) << ":(" << P.Sec->Name << "+0x"
        << Twine::utohexstr(P.InputOff) + ")\n";
   }
@@ -168,12 +172,12 @@ void elf::writeMapFile() {
 
   // Print out the header line.
   int W = Config->Is64 ? 16 : 8;
-  OS << left_justify("Address", W) << ' ' << left_justify("Size", W)
-     << " Align Out     In      Symbol\n";
+  OS << right_justify("VMA", W) << ' ' << right_justify("LMA", 9) << ' '
+     << right_justify("Size", W) << " Align Out     In      Symbol\n";
 
   // Print out file contents.
   for (OutputSection *OSec : OutputSections) {
-    writeHeader(OS, OSec->Addr, OSec->Size, OSec->Alignment);
+    writeHeader(OS, OSec->Addr, OSec->getLMA(), OSec->Size, OSec->Alignment);
     OS << OSec->Name << '\n';
 
     // Dump symbols for each input section.
@@ -185,7 +189,8 @@ void elf::writeMapFile() {
             continue;
           }
 
-          writeHeader(OS, IS->getVA(0), IS->getSize(), IS->Alignment);
+          writeHeader(OS, IS->getVA(0), OSec->getLMA() + IS->getOffset(0),
+                      IS->getSize(), IS->Alignment);
           OS << Indent8 << toString(IS) << '\n';
           for (Symbol *Sym : SectionSyms[IS])
             OS << SymStr[Sym] << '\n';
@@ -194,13 +199,15 @@ void elf::writeMapFile() {
       }
 
       if (auto *Cmd = dyn_cast<ByteCommand>(Base)) {
-        writeHeader(OS, OSec->Addr + Cmd->Offset, Cmd->Size, 1);
+        writeHeader(OS, OSec->Addr + Cmd->Offset, OSec->getLMA() + Cmd->Offset,
+                    Cmd->Size, 1);
         OS << Indent8 << Cmd->CommandString << '\n';
         continue;
       }
 
       if (auto *Cmd = dyn_cast<SymbolAssignment>(Base)) {
-        writeHeader(OS, Cmd->Addr, Cmd->Size, 1);
+        writeHeader(OS, Cmd->Addr, OSec->getLMA() + Cmd->Addr - OSec->getVA(0),
+                    Cmd->Size, 1);
         OS << Indent8 << Cmd->CommandString << '\n';
         continue;
       }

Added: lld/trunk/test/ELF/linkerscript/Inputs/map-file2.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/Inputs/map-file2.s?rev=329271&view=auto
==============================================================================
--- lld/trunk/test/ELF/linkerscript/Inputs/map-file2.s (added)
+++ lld/trunk/test/ELF/linkerscript/Inputs/map-file2.s Thu Apr  5 03:51:06 2018
@@ -0,0 +1,19 @@
+.global _start
+_start:
+.global _Z1fi
+_Z1fi:
+.cfi_startproc
+nop
+.cfi_endproc
+
+.section .aaa, "a";
+.quad 1;
+
+.section .bbb, "a";
+.quad 2;
+
+.section .ccc, "a";
+.quad 3;
+
+.section .ddd, "a";
+.quad 4

Modified: lld/trunk/test/ELF/linkerscript/map-file.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/map-file.test?rev=329271&r1=329270&r2=329271&view=diff
==============================================================================
--- lld/trunk/test/ELF/linkerscript/map-file.test (original)
+++ lld/trunk/test/ELF/linkerscript/map-file.test Thu Apr  5 03:51:06 2018
@@ -22,16 +22,24 @@ SECTIONS {
   }
 }
 
-# CHECK:      Address          Size             Align Out     In      Symbol
-# CHECK-NEXT: 0000000000001000 000000000000125d     1 .foo
-# CHECK-NEXT: 0000000000001000 0000000000000001     1         BYTE ( 0x11 )
-# CHECK-NEXT: 0000000000001001 0000000000000002     1         SHORT ( 0x1122 )
-# CHECK-NEXT: 0000000000001003 0000000000000004     1         LONG ( 0x11223344 )
-# CHECK-NEXT: 0000000000001007 0000000000000008     1         QUAD ( 0x1122334455667788 )
-# CHECK-NEXT: 000000000000100f 0000000000001000     1         . += 0x1000
-# CHECK-NEXT: 000000000000200f 0000000000000008     1         {{.*}}{{/|\\}}map-file.test.tmp.o:(.foo.1)
-# CHECK-NEXT: 0000000000002017 0000000000000246     1         . += 0x123 * ( 1 + 1 )
-# CHECK-NEXT: 000000000000225d 0000000000000000     1         foo = .
-# CHECK-NEXT: 000000000000225d 0000000000000000     1         bar = 0x42 - 0x26
-# CHECK-NEXT: 0000000000002260 0000000000000000     4 .text
-# CHECK-NEXT: 0000000000002260 0000000000000000     4         {{.*}}{{/|\\}}map-file.test.tmp.o:(.text)
+# CHECK:        VMA       LMA             Size Align Out     In      Symbol
+# CHECK-NEXT:  1000      1000             125d     1 .foo
+# CHECK-NEXT:  1000      1000                1     1         BYTE ( 0x11 )
+# CHECK-NEXT:  1001      1001                2     1         SHORT ( 0x1122 )
+# CHECK-NEXT:  1003      1003                4     1         LONG ( 0x11223344 )
+# CHECK-NEXT:  1007      1007                8     1         QUAD ( 0x1122334455667788 )
+# CHECK-NEXT:  100f      100f             1000     1         . += 0x1000
+# CHECK-NEXT:  200f      200f                8     1         {{.*}}{{/|\\}}map-file.test.tmp.o:(.foo.1)
+# CHECK-NEXT:  2017      2017              246     1         . += 0x123 * ( 1 + 1 )
+# CHECK-NEXT:  225d      225d                0     1         foo = .
+# CHECK-NEXT:  225d      225d                0     1         bar = 0x42 - 0x26
+# CHECK-NEXT:  2260      2260                0     4 .text
+# CHECK-NEXT:  2260      2260                0     4         {{.*}}{{/|\\}}map-file.test.tmp.o:(.text)
+# CHECK-NEXT:     0         0                8     1 .comment
+# CHECK-NEXT:     0         0                8     1         <internal>:(.comment)
+# CHECK-NEXT:     0         0               48     8 .symtab
+# CHECK-NEXT:     0         0               48     8         <internal>:(.symtab)
+# CHECK-NEXT:     0         0               2f     1 .shstrtab
+# CHECK-NEXT:     0         0               2f     1         <internal>:(.shstrtab)
+# CHECK-NEXT:     0         0                9     1 .strtab
+# CHECK-NEXT:     0         0                9     1         <internal>:(.strtab)

Added: lld/trunk/test/ELF/linkerscript/map-file2.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/map-file2.test?rev=329271&view=auto
==============================================================================
--- lld/trunk/test/ELF/linkerscript/map-file2.test (added)
+++ lld/trunk/test/ELF/linkerscript/map-file2.test Thu Apr  5 03:51:06 2018
@@ -0,0 +1,43 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/map-file2.s -o %t.o
+# RUN: ld.lld -o %t %t.o -Map=%t.map --script %s
+# RUN: FileCheck -strict-whitespace %s < %t.map
+
+SECTIONS {
+  . = 0x1000;
+  .aaa : { *(.aaa.*) }
+  .bbb : AT(0x2000) { *(.bbb.*) }
+  .ccc : AT(0x3000) { *(.ccc.*) }
+  .ddd : {
+    BYTE(0x11)
+    . += 0x100;
+    *(.ddd.*)
+  }
+  .text : { *(.text.*) }
+}
+
+# CHECK:             VMA       LMA             Size Align Out     In      Symbol
+# CHECK-NEXT:       1000      1000                8     1 .aaa
+# CHECK-NEXT:       1000      1000                8     1         {{.*}}{{/|\\}}map-file2.test.tmp.o:(.aaa)
+# CHECK-NEXT:       1008      2000                8     1 .bbb
+# CHECK-NEXT:       1008      2000                8     1         {{.*}}{{/|\\}}map-file2.test.tmp.o:(.bbb)
+# CHECK-NEXT:       1010      3000                8     1 .ccc
+# CHECK-NEXT:       1010      3000                8     1         {{.*}}{{/|\\}}map-file2.test.tmp.o:(.ccc)
+# CHECK-NEXT:       1018      3008              109     1 .ddd
+# CHECK-NEXT:       1018      3008                1     1         BYTE ( 0x11 )
+# CHECK-NEXT:       1019      3009              100     1         . += 0x100
+# CHECK-NEXT:       1119      3109                8     1         {{.*}}{{/|\\}}map-file2.test.tmp.o:(.ddd)
+# CHECK-NEXT:       1124      3114                1     4 .text
+# CHECK-NEXT:       1124      3114                1     4         {{.*}}{{/|\\}}map-file2.test.tmp.o:(.text)
+# CHECK-NEXT:       1124      3114                0     1                 f(int)
+# CHECK-NEXT:       1124      3114                0     1                 _start
+# CHECK-NEXT:       1128      3118               30     8 .eh_frame
+# CHECK-NEXT:       1128      3118               30     1         {{.*}}{{/|\\}}map-file2.test.tmp.o:(.eh_frame+0x0)
+# CHECK-NEXT:          0         0                8     1 .comment
+# CHECK-NEXT:          0         0                8     1         <internal>:(.comment)
+# CHECK-NEXT:          0         0               48     8 .symtab
+# CHECK-NEXT:          0         0               48     8         <internal>:(.symtab)
+# CHECK-NEXT:          0         0               48     1 .shstrtab
+# CHECK-NEXT:          0         0               48     1         <internal>:(.shstrtab)
+# CHECK-NEXT:          0         0                e     1 .strtab
+# CHECK-NEXT:          0         0                e     1         <internal>:(.strtab)

Modified: lld/trunk/test/ELF/map-file.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/map-file.s?rev=329271&r1=329270&r2=329271&view=diff
==============================================================================
--- lld/trunk/test/ELF/map-file.s (original)
+++ lld/trunk/test/ELF/map-file.s Thu Apr  5 03:51:06 2018
@@ -40,60 +40,60 @@ local:
 abs = 0xAB5
 labs = 0x1AB5
 
-// CHECK:      Address          Size             Align Out     In      Symbol
-// CHECK-NEXT: 00000000002001c8 0000000000000078     8 .dynsym
-// CHECK-NEXT: 00000000002001c8 0000000000000078     8         <internal>:(.dynsym)
-// CHECK-NEXT: 0000000000200240 000000000000002c     8 .gnu.hash
-// CHECK-NEXT: 0000000000200240 000000000000002c     8         <internal>:(.gnu.hash)
-// CHECK-NEXT: 000000000020026c 0000000000000030     4 .hash
-// CHECK-NEXT: 000000000020026c 0000000000000030     4         <internal>:(.hash)
-// CHECK-NEXT: 000000000020029c 0000000000000031     1 .dynstr
-// CHECK-NEXT: 000000000020029c 0000000000000031     1         <internal>:(.dynstr)
-// CHECK-NEXT: 00000000002002d0 0000000000000030     8 .rela.dyn
-// CHECK-NEXT: 00000000002002d0 0000000000000030     8         <internal>:(.rela.dyn)
-// CHECK-NEXT: 0000000000200300 0000000000000030     8 .rela.plt
-// CHECK-NEXT: 0000000000200300 0000000000000030     8         <internal>:(.rela.plt)
-// CHECK-NEXT: 0000000000200330 0000000000000060     8 .eh_frame
-// CHECK-NEXT: 0000000000200330 000000000000002c     1         {{.*}}{{/|\\}}map-file.s.tmp1.o:(.eh_frame+0x0)
-// CHECK-NEXT: 0000000000200360 0000000000000014     1         {{.*}}{{/|\\}}map-file.s.tmp1.o:(.eh_frame+0x2c)
-// CHECK-NEXT: 0000000000200378 0000000000000018     1         {{.*}}{{/|\\}}map-file.s.tmp2.o:(.eh_frame+0x18)
-// CHECK-NEXT: 0000000000201000 000000000000002d     4 .text
-// CHECK-NEXT: 0000000000201000 0000000000000028     4         {{.*}}{{/|\\}}map-file.s.tmp1.o:(.text)
-// CHECK-NEXT: 0000000000201000 0000000000000000     1                 _start
-// CHECK-NEXT: 000000000020101f 0000000000000000     1                 f(int)
-// CHECK-NEXT: 0000000000201028 0000000000000000     1                 local
-// CHECK-NEXT: 0000000000201028 0000000000000002     4         {{.*}}{{/|\\}}map-file.s.tmp2.o:(.text)
-// CHECK-NEXT: 0000000000201028 0000000000000000     1                 foo
-// CHECK-NEXT: 0000000000201029 0000000000000000     1                 bar
-// CHECK-NEXT: 000000000020102a 0000000000000000     1         {{.*}}{{/|\\}}map-file.s.tmp2.o:(.text.zed)
-// CHECK-NEXT: 000000000020102a 0000000000000000     1                 zed
-// CHECK-NEXT: 000000000020102c 0000000000000000     4         {{.*}}{{/|\\}}map-file.s.tmp3.o:(.text)
-// CHECK-NEXT: 000000000020102c 0000000000000000     1                 bah
-// CHECK-NEXT: 000000000020102c 0000000000000001     4         {{.*}}{{/|\\}}map-file.s.tmp4.a(map-file.s.tmp4.o):(.text)
-// CHECK-NEXT: 000000000020102c 0000000000000000     1                 baz
-// CHECK-NEXT: 0000000000201030 0000000000000030    16 .plt
-// CHECK-NEXT: 0000000000201030 0000000000000030    16         <internal>:(.plt)
-// CHECK-NEXT: 0000000000201040 0000000000000000     1                 sharedFunc1
-// CHECK-NEXT: 0000000000201050 0000000000000000     1                 sharedFunc2
-// CHECK-NEXT: 0000000000202000 0000000000000028     8 .got.plt
-// CHECK-NEXT: 0000000000202000 0000000000000028     8         <internal>:(.got.plt)
-// CHECK-NEXT: 0000000000203000 0000000000000100     8 .dynamic
-// CHECK-NEXT: 0000000000203000 0000000000000100     8         <internal>:(.dynamic)
-// CHECK-NEXT: 0000000000204000 0000000000000010    16 .bss
-// CHECK-NEXT: 0000000000204000 0000000000000004    16         {{.*}}{{/|\\}}map-file.s.tmp1.o:(COMMON)
-// CHECK-NEXT: 0000000000204000 0000000000000004     1                 common
-// CHECK-NEXT: 0000000000204004 0000000000000004     1         <internal>:(.bss)
-// CHECK-NEXT: 0000000000204004 0000000000000004     1                 sharedFoo
-// CHECK-NEXT: 0000000000204008 0000000000000008     1         <internal>:(.bss)
-// CHECK-NEXT: 0000000000204008 0000000000000008     1                 sharedBar
-// CHECK-NEXT: 0000000000000000 0000000000000008     1 .comment
-// CHECK-NEXT: 0000000000000000 0000000000000008     1         <internal>:(.comment)
-// CHECK-NEXT: 0000000000000000 0000000000000198     8 .symtab
-// CHECK-NEXT: 0000000000000000 0000000000000198     8         <internal>:(.symtab)
-// CHECK-NEXT: 0000000000000000 0000000000000084     1 .shstrtab
-// CHECK-NEXT: 0000000000000000 0000000000000084     1         <internal>:(.shstrtab)
-// CHECK-NEXT: 0000000000000000 000000000000006d     1 .strtab
-// CHECK-NEXT: 0000000000000000 000000000000006d     1         <internal>:(.strtab)
+// CHECK:         VMA       LMA             Size Align Out     In      Symbol
+// CHECK-NEXT: 2001c8    2001c8               78     8 .dynsym
+// CHECK-NEXT: 2001c8    2001c8               78     8         <internal>:(.dynsym)
+// CHECK-NEXT: 200240    200240               2c     8 .gnu.hash
+// CHECK-NEXT: 200240    200240               2c     8         <internal>:(.gnu.hash)
+// CHECK-NEXT: 20026c    20026c               30     4 .hash
+// CHECK-NEXT: 20026c    20026c               30     4         <internal>:(.hash)
+// CHECK-NEXT: 20029c    20029c               31     1 .dynstr
+// CHECK-NEXT: 20029c    20029c               31     1         <internal>:(.dynstr)
+// CHECK-NEXT: 2002d0    2002d0               30     8 .rela.dyn
+// CHECK-NEXT: 2002d0    2002d0               30     8         <internal>:(.rela.dyn)
+// CHECK-NEXT: 200300    200300               30     8 .rela.plt
+// CHECK-NEXT: 200300    200300               30     8         <internal>:(.rela.plt)
+// CHECK-NEXT: 200330    200330               60     8 .eh_frame
+// CHECK-NEXT: 200330    200330               2c     1         {{.*}}{{/|\\}}map-file.s.tmp1.o:(.eh_frame+0x0)
+// CHECK-NEXT: 200360    200360               14     1         {{.*}}{{/|\\}}map-file.s.tmp1.o:(.eh_frame+0x2c)
+// CHECK-NEXT: 200378    200378               18     1         {{.*}}{{/|\\}}map-file.s.tmp2.o:(.eh_frame+0x18)
+// CHECK-NEXT: 201000    201000               2d     4 .text
+// CHECK-NEXT: 201000    201000               28     4         {{.*}}{{/|\\}}map-file.s.tmp1.o:(.text)
+// CHECK-NEXT: 201000    201000                0     1                 _start
+// CHECK-NEXT: 20101f    20101f                0     1                 f(int)
+// CHECK-NEXT: 201028    201028                0     1                 local
+// CHECK-NEXT: 201028    201028                2     4         {{.*}}{{/|\\}}map-file.s.tmp2.o:(.text)
+// CHECK-NEXT: 201028    201028                0     1                 foo
+// CHECK-NEXT: 201029    201029                0     1                 bar
+// CHECK-NEXT: 20102a    20102a                0     1         {{.*}}{{/|\\}}map-file.s.tmp2.o:(.text.zed)
+// CHECK-NEXT: 20102a    20102a                0     1                 zed
+// CHECK-NEXT: 20102c    20102c                0     4         {{.*}}{{/|\\}}map-file.s.tmp3.o:(.text)
+// CHECK-NEXT: 20102c    20102c                0     1                 bah
+// CHECK-NEXT: 20102c    20102c                1     4         {{.*}}{{/|\\}}map-file.s.tmp4.a(map-file.s.tmp4.o):(.text)
+// CHECK-NEXT: 20102c    20102c                0     1                 baz
+// CHECK-NEXT: 201030    201030               30    16 .plt
+// CHECK-NEXT: 201030    201030               30    16         <internal>:(.plt)
+// CHECK-NEXT: 201040         0                0     1                 sharedFunc1
+// CHECK-NEXT: 201050         0                0     1                 sharedFunc2
+// CHECK-NEXT: 202000    202000               28     8 .got.plt
+// CHECK-NEXT: 202000    202000               28     8         <internal>:(.got.plt)
+// CHECK-NEXT: 203000    203000              100     8 .dynamic
+// CHECK-NEXT: 203000    203000              100     8         <internal>:(.dynamic)
+// CHECK-NEXT: 204000    204000               10    16 .bss
+// CHECK-NEXT: 204000    204000                4    16         {{.*}}{{/|\\}}map-file.s.tmp1.o:(COMMON)
+// CHECK-NEXT: 204000    204000                4     1                 common
+// CHECK-NEXT: 204004    204004                4     1         <internal>:(.bss)
+// CHECK-NEXT: 204004    204004                4     1                 sharedFoo
+// CHECK-NEXT: 204008    204008                8     1         <internal>:(.bss)
+// CHECK-NEXT: 204008    204008                8     1                 sharedBar
+// CHECK-NEXT:      0         0                8     1 .comment
+// CHECK-NEXT:      0         0                8     1         <internal>:(.comment)
+// CHECK-NEXT:      0         0              198     8 .symtab
+// CHECK-NEXT:      0         0              198     8         <internal>:(.symtab)
+// CHECK-NEXT:      0         0               84     1 .shstrtab
+// CHECK-NEXT:      0         0               84     1         <internal>:(.shstrtab)
+// CHECK-NEXT:      0         0               6d     1 .strtab
+// CHECK-NEXT:      0         0               6d     1         <internal>:(.strtab)
 
 // RUN: not ld.lld %t1.o %t2.o %t3.o %t4.a -o %t -Map=/ 2>&1 \
 // RUN:  | FileCheck -check-prefix=FAIL %s




More information about the llvm-commits mailing list