Index: ELF/MapFile.cpp =================================================================== --- ELF/MapFile.cpp +++ ELF/MapFile.cpp @@ -175,12 +175,14 @@ OS << right_justify("VMA", W) << ' ' << right_justify("LMA", 9) << ' ' << right_justify("Size", W) << " Align Out In Symbol\n"; + OutputSection* LastOS = nullptr; for (BaseCommand *Base : Script->SectionCommands) { if (auto *Cmd = dyn_cast(Base)) { if (Cmd->Provide && !Cmd->Sym) continue; - //FIXME: calculate and print LMA. - writeHeader(OS, Cmd->Addr, 0, Cmd->Size, 1); + uint64_t LMA = + LastOS ? LastOS->getLMA() + Cmd->Addr - LastOS->getVA(0) : 0; + writeHeader(OS, Cmd->Addr, LMA, Cmd->Size, 1); OS << Cmd->CommandString << '\n'; continue; } @@ -188,6 +190,7 @@ auto *OSec = dyn_cast(Base); if (!OSec) continue; + LastOS = OSec; writeHeader(OS, OSec->Addr, OSec->getLMA(), OSec->Size, OSec->Alignment); OS << OSec->Name << '\n'; Index: test/ELF/linkerscript/map-file.test =================================================================== --- test/ELF/linkerscript/map-file.test +++ test/ELF/linkerscript/map-file.test @@ -44,10 +44,10 @@ # 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: 225d 0 0 1 sym1 = . -# CHECK-NEXT: 225d 0 500 1 . += 0x500 -# CHECK-NEXT: 275d 0 0 1 sym2 = . -# CHECK-NEXT: 275d 0 0 1 PROVIDE ( sym3 = 42 ) +# CHECK-NEXT: 225d 225d 0 1 sym1 = . +# CHECK-NEXT: 225d 225d 500 1 . += 0x500 +# CHECK-NEXT: 275d 275d 0 1 sym2 = . +# CHECK-NEXT: 275d 275d 0 1 PROVIDE ( sym3 = 42 ) # CHECK-NEXT: 2760 2760 10 4 .text # CHECK-NEXT: 2760 2760 10 4 {{.*}}{{/|\\}}map-file.test.tmp.o:(.text) # CHECK-NEXT: 0 0 8 1 .comment Index: test/ELF/linkerscript/map-file2.test =================================================================== --- test/ELF/linkerscript/map-file2.test +++ test/ELF/linkerscript/map-file2.test @@ -8,6 +8,7 @@ .aaa : { *(.aaa.*) } .bbb : AT(0x2000) { *(.bbb.*) } .ccc : AT(0x3000) { *(.ccc.*) } + . += 0x100; .ddd : { BYTE(0x11) . += 0x100; @@ -24,16 +25,17 @@ # 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: 1018 3008 100 1 . += 0x100 +# CHECK-NEXT: 1118 3108 109 1 .ddd +# CHECK-NEXT: 1118 3108 1 1 BYTE ( 0x11 ) +# CHECK-NEXT: 1119 3109 100 1 . += 0x100 +# CHECK-NEXT: 1219 3209 8 1 {{.*}}{{/|\\}}map-file2.test.tmp.o:(.ddd) +# CHECK-NEXT: 1224 3214 1 4 .text +# CHECK-NEXT: 1224 3214 1 4 {{.*}}{{/|\\}}map-file2.test.tmp.o:(.text) +# CHECK-NEXT: 1224 3214 0 1 f(int) +# CHECK-NEXT: 1224 3214 0 1 _start +# CHECK-NEXT: 1228 3218 30 8 .eh_frame +# CHECK-NEXT: 1228 3218 30 1 {{.*}}{{/|\\}}map-file2.test.tmp.o:(.eh_frame+0x0) # CHECK-NEXT: 0 0 8 1 .comment # CHECK-NEXT: 0 0 8 1 :(.comment) # CHECK-NEXT: 0 0 48 8 .symtab