[lld] 1747318 - [ELF] Pass Ctx & to MapFile
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sun Sep 29 15:39:57 PDT 2024
Author: Fangrui Song
Date: 2024-09-29T15:39:52-07:00
New Revision: 17473182f584c8eac09fe915256dcbd761b25286
URL: https://github.com/llvm/llvm-project/commit/17473182f584c8eac09fe915256dcbd761b25286
DIFF: https://github.com/llvm/llvm-project/commit/17473182f584c8eac09fe915256dcbd761b25286.diff
LOG: [ELF] Pass Ctx & to MapFile
Added:
Modified:
lld/ELF/MapFile.cpp
lld/ELF/MapFile.h
lld/ELF/Writer.cpp
Removed:
################################################################################
diff --git a/lld/ELF/MapFile.cpp b/lld/ELF/MapFile.cpp
index 17c694d410a6d3..3495cdb0bc6663 100644
--- a/lld/ELF/MapFile.cpp
+++ b/lld/ELF/MapFile.cpp
@@ -44,7 +44,7 @@ static constexpr char indent8[] = " "; // 8 spaces
static constexpr char indent16[] = " "; // 16 spaces
// Print out the first three columns of a line.
-static void writeHeader(raw_ostream &os, uint64_t vma, uint64_t lma,
+static void writeHeader(Ctx &ctx, raw_ostream &os, uint64_t vma, uint64_t lma,
uint64_t size, uint64_t align) {
if (ctx.arg.is64)
os << format("%16llx %16llx %8llx %5lld ", vma, lma, size, align);
@@ -90,14 +90,14 @@ static SymbolMapTy getSectionSyms(ArrayRef<Defined *> syms) {
// Demangling symbols (which is what toString() does) is slow, so
// we do that in batch using parallel-for.
static DenseMap<Symbol *, std::string>
-getSymbolStrings(ArrayRef<Defined *> syms) {
+getSymbolStrings(Ctx &ctx, ArrayRef<Defined *> syms) {
auto strs = std::make_unique<std::string[]>(syms.size());
parallelFor(0, syms.size(), [&](size_t i) {
raw_string_ostream os(strs[i]);
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);
+ writeHeader(ctx, os, vma, lma, syms[i]->getSize(), 1);
os << indent16 << toString(*syms[i]);
});
@@ -113,7 +113,7 @@ getSymbolStrings(ArrayRef<Defined *> syms) {
// .eh_frame tend to contain a lot of section pieces that are contiguous
// both in input file and output file. Such pieces are squashed before
// being displayed to make output compact.
-static void printEhFrame(raw_ostream &os, const EhFrameSection *sec) {
+static void printEhFrame(Ctx &ctx, raw_ostream &os, const EhFrameSection *sec) {
std::vector<EhSectionPiece> pieces;
auto add = [&](const EhSectionPiece &p) {
@@ -139,18 +139,18 @@ static void printEhFrame(raw_ostream &os, const EhFrameSection *sec) {
// Print out section pieces.
const OutputSection *osec = sec->getOutputSection();
for (EhSectionPiece &p : pieces) {
- writeHeader(os, osec->addr + p.outputOff, osec->getLMA() + p.outputOff,
+ writeHeader(ctx, 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";
}
}
-static void writeMapFile(raw_fd_ostream &os) {
+static void writeMapFile(Ctx &ctx, raw_fd_ostream &os) {
// Collect symbol info that we want to print out.
std::vector<Defined *> syms = getSymbols();
SymbolMapTy sectionSyms = getSectionSyms(syms);
- DenseMap<Symbol *, std::string> symStr = getSymbolStrings(syms);
+ DenseMap<Symbol *, std::string> symStr = getSymbolStrings(ctx, syms);
// Print out the header line.
int w = ctx.arg.is64 ? 16 : 8;
@@ -163,7 +163,7 @@ static void writeMapFile(raw_fd_ostream &os) {
if (assign->provide && !assign->sym)
continue;
uint64_t lma = osec ? osec->getLMA() + assign->addr - osec->getVA(0) : 0;
- writeHeader(os, assign->addr, lma, assign->size, 1);
+ writeHeader(ctx, os, assign->addr, lma, assign->size, 1);
os << assign->commandString << '\n';
continue;
}
@@ -171,7 +171,8 @@ static void writeMapFile(raw_fd_ostream &os) {
continue;
osec = &cast<OutputDesc>(cmd)->osec;
- writeHeader(os, osec->addr, osec->getLMA(), osec->size, osec->addralign);
+ writeHeader(ctx, os, osec->addr, osec->getLMA(), osec->size,
+ osec->addralign);
os << osec->name << '\n';
// Dump symbols for each input section.
@@ -179,11 +180,11 @@ static void writeMapFile(raw_fd_ostream &os) {
if (auto *isd = dyn_cast<InputSectionDescription>(subCmd)) {
for (InputSection *isec : isd->sections) {
if (auto *ehSec = dyn_cast<EhFrameSection>(isec)) {
- printEhFrame(os, ehSec);
+ printEhFrame(ctx, os, ehSec);
continue;
}
- writeHeader(os, isec->getVA(), osec->getLMA() + isec->outSecOff,
+ writeHeader(ctx, os, isec->getVA(), osec->getLMA() + isec->outSecOff,
isec->getSize(), isec->addralign);
os << indent8 << toString(isec) << '\n';
for (Symbol *sym : llvm::make_first_range(sectionSyms[isec]))
@@ -193,7 +194,7 @@ static void writeMapFile(raw_fd_ostream &os) {
}
if (auto *data = dyn_cast<ByteCommand>(subCmd)) {
- writeHeader(os, osec->addr + data->offset,
+ writeHeader(ctx, os, osec->addr + data->offset,
osec->getLMA() + data->offset, data->size, 1);
os << indent8 << data->commandString << '\n';
continue;
@@ -202,7 +203,7 @@ static void writeMapFile(raw_fd_ostream &os) {
if (auto *assign = dyn_cast<SymbolAssignment>(subCmd)) {
if (assign->provide && !assign->sym)
continue;
- writeHeader(os, assign->addr,
+ writeHeader(ctx, os, assign->addr,
osec->getLMA() + assign->addr - osec->getVA(0),
assign->size, 1);
os << indent8 << assign->commandString << '\n';
@@ -223,7 +224,7 @@ static void writeMapFile(raw_fd_ostream &os) {
//
// In this case, strlen is defined by libc.so.6 and used by other two
// files.
-static void writeCref(raw_fd_ostream &os) {
+static void writeCref(Ctx &ctx, raw_fd_ostream &os) {
// Collect symbols and files.
MapVector<Symbol *, SetVector<InputFile *>> map;
for (ELFFileBase *file : ctx.objectFiles) {
@@ -256,7 +257,7 @@ static void writeCref(raw_fd_ostream &os) {
}
}
-void elf::writeMapAndCref() {
+void elf::writeMapAndCref(Ctx &ctx) {
if (ctx.arg.mapFile.empty() && !ctx.arg.cref)
return;
@@ -272,7 +273,7 @@ void elf::writeMapAndCref() {
}
if (!ctx.arg.mapFile.empty())
- writeMapFile(os);
+ writeMapFile(ctx, os);
if (ctx.arg.cref)
- writeCref(os);
+ writeCref(ctx, os);
}
diff --git a/lld/ELF/MapFile.h b/lld/ELF/MapFile.h
index b271f627df570e..c4efd33a3095c2 100644
--- a/lld/ELF/MapFile.h
+++ b/lld/ELF/MapFile.h
@@ -10,7 +10,8 @@
#define LLD_ELF_MAPFILE_H
namespace lld::elf {
-void writeMapAndCref();
+struct Ctx;
+void writeMapAndCref(Ctx &);
}
#endif
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index 27b3cf64a43aec..7c928a80a10d6a 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -336,7 +336,7 @@ template <class ELFT> void Writer<ELFT>::run() {
// Handle --print-map(-M)/--Map and --cref. Dump them before checkSections()
// because the files may be useful in case checkSections() or openFile()
// fails, for example, due to an erroneous file size.
- writeMapAndCref();
+ writeMapAndCref(ctx);
// Handle --print-memory-usage option.
if (ctx.arg.printMemoryUsage)
More information about the llvm-commits
mailing list