[lld] r329272 - [ELF] - Reveal more information in -Map file about assignments.
George Rimar via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 5 04:25:58 PDT 2018
Author: grimar
Date: Thu Apr 5 04:25:58 2018
New Revision: 329272
URL: http://llvm.org/viewvc/llvm-project?rev=329272&view=rev
Log:
[ELF] - Reveal more information in -Map file about assignments.
Currently, LLD print symbol assignment commands to the map file,
but it does not do that for assignments that are outside of the section
descriptions. Such assignments can affect the layout though.
The patch implements the following:
* Teaches LLD to print symbol assignments outside of section declaration.
* Teaches LLD to print PROVIDE/HIDDEN/PROVIDE hidden commands.
In case when symbol is not provided, nothing will be printed.
Differential revision: https://reviews.llvm.org/D44894
Modified:
lld/trunk/ELF/LinkerScript.cpp
lld/trunk/ELF/LinkerScript.h
lld/trunk/ELF/MapFile.cpp
lld/trunk/ELF/ScriptParser.cpp
lld/trunk/test/ELF/linkerscript/map-file.test
lld/trunk/test/ELF/linkerscript/map-file2.test
Modified: lld/trunk/ELF/LinkerScript.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=329272&r1=329271&r2=329272&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.cpp (original)
+++ lld/trunk/ELF/LinkerScript.cpp Thu Apr 5 04:25:58 2018
@@ -1049,7 +1049,9 @@ void LinkerScript::assignAddresses() {
for (BaseCommand *Base : SectionCommands) {
if (auto *Cmd = dyn_cast<SymbolAssignment>(Base)) {
+ Cmd->Addr = Dot;
assignSymbol(Cmd, false);
+ Cmd->Size = Dot - Cmd->Addr;
continue;
}
Modified: lld/trunk/ELF/LinkerScript.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.h?rev=329272&r1=329271&r2=329272&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.h (original)
+++ lld/trunk/ELF/LinkerScript.h Thu Apr 5 04:25:58 2018
@@ -86,10 +86,8 @@ struct BaseCommand {
// This represents ". = <expr>" or "<symbol> = <expr>".
struct SymbolAssignment : BaseCommand {
- SymbolAssignment(StringRef Name, Expr E, std::string Loc,
- std::string CommandString)
- : BaseCommand(AssignmentKind), Name(Name), Expression(E), Location(Loc),
- CommandString(CommandString) {}
+ SymbolAssignment(StringRef Name, Expr E, std::string Loc)
+ : BaseCommand(AssignmentKind), Name(Name), Expression(E), Location(Loc) {}
static bool classof(const BaseCommand *C) {
return C->Kind == AssignmentKind;
Modified: lld/trunk/ELF/MapFile.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/MapFile.cpp?rev=329272&r1=329271&r2=329272&view=diff
==============================================================================
--- lld/trunk/ELF/MapFile.cpp (original)
+++ lld/trunk/ELF/MapFile.cpp Thu Apr 5 04:25:58 2018
@@ -175,8 +175,20 @@ void elf::writeMapFile() {
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) {
+ for (BaseCommand *Base : Script->SectionCommands) {
+ if (auto *Cmd = dyn_cast<SymbolAssignment>(Base)) {
+ if (Cmd->Provide && !Cmd->Sym)
+ continue;
+ //FIXME: calculate and print LMA.
+ writeHeader(OS, Cmd->Addr, 0, Cmd->Size, 1);
+ OS << Cmd->CommandString << '\n';
+ continue;
+ }
+
+ auto *OSec = dyn_cast<OutputSection>(Base);
+ if (!OSec)
+ continue;
+
writeHeader(OS, OSec->Addr, OSec->getLMA(), OSec->Size, OSec->Alignment);
OS << OSec->Name << '\n';
@@ -206,6 +218,8 @@ void elf::writeMapFile() {
}
if (auto *Cmd = dyn_cast<SymbolAssignment>(Base)) {
+ if (Cmd->Provide && !Cmd->Sym)
+ continue;
writeHeader(OS, Cmd->Addr, OSec->getLMA() + Cmd->Addr - OSec->getVA(0),
Cmd->Size, 1);
OS << Indent8 << Cmd->CommandString << '\n';
Modified: lld/trunk/ELF/ScriptParser.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/ScriptParser.cpp?rev=329272&r1=329271&r2=329272&view=diff
==============================================================================
--- lld/trunk/ELF/ScriptParser.cpp (original)
+++ lld/trunk/ELF/ScriptParser.cpp Thu Apr 5 04:25:58 2018
@@ -267,8 +267,7 @@ void ScriptParser::readDefsym(StringRef
Expr E = readExpr();
if (!atEOF())
setError("EOF expected, but got " + next());
- SymbolAssignment *Cmd = make<SymbolAssignment>(Name, E, getCurrentLocation(),
- "" /*CommandString*/);
+ SymbolAssignment *Cmd = make<SymbolAssignment>(Name, E, getCurrentLocation());
Script->SectionCommands.push_back(Cmd);
}
@@ -773,27 +772,31 @@ SymbolAssignment *ScriptParser::readProv
Cmd->Provide = Provide;
Cmd->Hidden = Hidden;
expect(")");
- expect(";");
return Cmd;
}
SymbolAssignment *ScriptParser::readProvideOrAssignment(StringRef Tok) {
+ size_t OldPos = Pos;
SymbolAssignment *Cmd = nullptr;
- if (peek() == "=" || peek() == "+=") {
+ if (peek() == "=" || peek() == "+=")
Cmd = readAssignment(Tok);
- expect(";");
- } else if (Tok == "PROVIDE") {
+ else if (Tok == "PROVIDE")
Cmd = readProvideHidden(true, false);
- } else if (Tok == "HIDDEN") {
+ else if (Tok == "HIDDEN")
Cmd = readProvideHidden(false, true);
- } else if (Tok == "PROVIDE_HIDDEN") {
+ else if (Tok == "PROVIDE_HIDDEN")
Cmd = readProvideHidden(true, true);
+
+ if (Cmd) {
+ Cmd->CommandString =
+ Tok.str() + " " +
+ llvm::join(Tokens.begin() + OldPos, Tokens.begin() + Pos, " ");
+ expect(";");
}
return Cmd;
}
SymbolAssignment *ScriptParser::readAssignment(StringRef Name) {
- size_t OldPos = Pos;
StringRef Op = next();
assert(Op == "=" || Op == "+=");
Expr E = readExpr();
@@ -801,11 +804,7 @@ SymbolAssignment *ScriptParser::readAssi
std::string Loc = getCurrentLocation();
E = [=] { return add(Script->getSymbolValue(Name, Loc), E()); };
}
-
- std::string CommandString =
- Name.str() + " " +
- llvm::join(Tokens.begin() + OldPos, Tokens.begin() + Pos, " ");
- return make<SymbolAssignment>(Name, E, getCurrentLocation(), CommandString);
+ return make<SymbolAssignment>(Name, E, getCurrentLocation());
}
// This is an operator-precedence parser to parse a linker
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=329272&r1=329271&r2=329272&view=diff
==============================================================================
--- lld/trunk/test/ELF/linkerscript/map-file.test (original)
+++ lld/trunk/test/ELF/linkerscript/map-file.test Thu Apr 5 04:25:58 2018
@@ -1,6 +1,6 @@
# REQUIRES: x86
-# RUN: echo '.section .foo.1, "a"; .quad 1' > %t.s
+# RUN: echo '.quad sym3; .quad sym4; .section .foo.1, "a"; .quad 1' > %t.s
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %t.s -o %t.o
# RUN: ld.lld -o %t %t.o -Map=%t.map --script %s
@@ -13,33 +13,48 @@ SECTIONS {
SHORT(0x1122)
LONG(0x11223344)
QUAD(0x1122334455667788)
+ PROVIDE_HIDDEN(sym4 = .);
. += 0x1000;
*(.foo.1)
+ PROVIDE(unused1 = 0xff);
+ HIDDEN(sym6 = .);
. += 0x123 *
(1 + 1);
foo = .;
bar = 0x42 - 0x26;
}
+ sym1 = .;
+ . += 0x500;
+ sym2 = .;
+ PROVIDE(unused2 = 0xff);
+ PROVIDE(sym3 = 42);
}
-# 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)
+# CHECK: VMA LMA Size Align Out In Symbol
+# CHECK-NEXT: 0 0 1000 1 . = 0x1000
+# 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 0 1 PROVIDE_HIDDEN ( sym4 = . )
+# CHECK-NEXT: 100f 100f 1000 1 . += 0x1000
+# CHECK-NEXT: 200f 200f 8 1 {{.*}}{{/|\\}}map-file.test.tmp.o:(.foo.1)
+# CHECK-NEXT: 2017 2017 0 1 HIDDEN ( sym6 = . )
+# 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: 2760 2760 10 4 .text
+# CHECK-NEXT: 2760 2760 10 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 c0 8 .symtab
+# CHECK-NEXT: 0 0 c0 8 <internal>:(.symtab)
+# CHECK-NEXT: 0 0 2f 1 .shstrtab
+# CHECK-NEXT: 0 0 2f 1 <internal>:(.shstrtab)
+# CHECK-NEXT: 0 0 22 1 .strtab
+# CHECK-NEXT: 0 0 22 1 <internal>:(.strtab)
Modified: lld/trunk/test/ELF/linkerscript/map-file2.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/map-file2.test?rev=329272&r1=329271&r2=329272&view=diff
==============================================================================
--- lld/trunk/test/ELF/linkerscript/map-file2.test (original)
+++ lld/trunk/test/ELF/linkerscript/map-file2.test Thu Apr 5 04:25:58 2018
@@ -17,6 +17,7 @@ SECTIONS {
}
# CHECK: VMA LMA Size Align Out In Symbol
+# CHECK-NEXT: 0 0 1000 1 . = 0x1000
# 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
More information about the llvm-commits
mailing list