[lld] d0606c2 - [ELF] Make .comment have a non-full file
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 11 20:55:28 PDT 2024
Author: Fangrui Song
Date: 2024-10-11T20:55:21-07:00
New Revision: d0606c265e8eb800cc59f182b38b3e0427ba0200
URL: https://github.com/llvm/llvm-project/commit/d0606c265e8eb800cc59f182b38b3e0427ba0200
DIFF: https://github.com/llvm/llvm-project/commit/d0606c265e8eb800cc59f182b38b3e0427ba0200.diff
LOG: [ELF] Make .comment have a non-full file
This ensures that SectionBase::file is non-null except
InputSection::discarded.
Added:
Modified:
lld/ELF/Driver.cpp
lld/ELF/InputSection.cpp
lld/ELF/InputSection.h
lld/ELF/SyntheticSections.cpp
lld/ELF/SyntheticSections.h
Removed:
################################################################################
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index a9ead79ead4af5..e68cc7f0bb3f6a 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -3147,7 +3147,7 @@ template <class ELFT> void LinkerDriver::link(opt::InputArgList &args) {
// This adds a .comment section containing a version string.
if (!ctx.arg.relocatable)
- ctx.inputSections.push_back(createCommentSection());
+ ctx.inputSections.push_back(createCommentSection(ctx));
// Split SHF_MERGE and .eh_frame sections into pieces in preparation for garbage collection.
splitSections<ELFT>(ctx);
diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp
index bca395eb5ea950..2e9e8a7007bbf8 100644
--- a/lld/ELF/InputSection.cpp
+++ b/lld/ELF/InputSection.cpp
@@ -299,10 +299,6 @@ std::string InputSectionBase::getLocation(uint64_t offset) const {
std::string secAndOffset =
(name + "+0x" + Twine::utohexstr(offset) + ")").str();
- // We don't have file for synthetic sections.
- if (file == nullptr)
- return (ctx.arg.outputFile + ":(" + secAndOffset).str();
-
std::string filename = toString(file);
if (Defined *d = getEnclosingFunction(offset))
return filename + ":(function " + toString(*d) + ": " + secAndOffset;
@@ -1430,11 +1426,12 @@ MergeInputSection::MergeInputSection(ObjFile<ELFT> &f,
StringRef name)
: InputSectionBase(f, header, name, InputSectionBase::Merge) {}
-MergeInputSection::MergeInputSection(uint64_t flags, uint32_t type,
+MergeInputSection::MergeInputSection(Ctx &ctx, uint64_t flags, uint32_t type,
uint64_t entsize, ArrayRef<uint8_t> data,
StringRef name)
- : InputSectionBase(nullptr, flags, type, entsize, /*Link*/ 0, /*Info*/ 0,
- /*Alignment*/ entsize, data, name, SectionBase::Merge) {}
+ : InputSectionBase(ctx.internalFile, flags, type, entsize, /*link=*/0,
+ /*info=*/0,
+ /*alignment=*/entsize, data, name, SectionBase::Merge) {}
// This function is called after we obtain a complete list of input sections
// that need to be linked. This is responsible to split section contents
diff --git a/lld/ELF/InputSection.h b/lld/ELF/InputSection.h
index c25ff143fd3434..1a5bc629d8b093 100644
--- a/lld/ELF/InputSection.h
+++ b/lld/ELF/InputSection.h
@@ -316,7 +316,7 @@ class MergeInputSection : public InputSectionBase {
template <class ELFT>
MergeInputSection(ObjFile<ELFT> &f, const typename ELFT::Shdr &header,
StringRef name);
- MergeInputSection(uint64_t flags, uint32_t type, uint64_t entsize,
+ MergeInputSection(Ctx &, uint64_t flags, uint32_t type, uint64_t entsize,
ArrayRef<uint8_t> data, StringRef name);
static bool classof(const SectionBase *s) { return s->kind() == Merge; }
diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp
index 5e38122c4dbdf3..8a2325f9686ff8 100644
--- a/lld/ELF/SyntheticSections.cpp
+++ b/lld/ELF/SyntheticSections.cpp
@@ -87,9 +87,9 @@ static ArrayRef<uint8_t> getVersion() {
// With this feature, you can identify LLD-generated binaries easily
// by "readelf --string-dump .comment <file>".
// The returned object is a mergeable string section.
-MergeInputSection *elf::createCommentSection() {
- auto *sec = make<MergeInputSection>(SHF_MERGE | SHF_STRINGS, SHT_PROGBITS, 1,
- getVersion(), ".comment");
+MergeInputSection *elf::createCommentSection(Ctx &ctx) {
+ auto *sec = make<MergeInputSection>(
+ ctx, SHF_MERGE | SHF_STRINGS, SHT_PROGBITS, 1, getVersion(), ".comment");
sec->splitIntoPieces();
return sec;
}
diff --git a/lld/ELF/SyntheticSections.h b/lld/ELF/SyntheticSections.h
index bbf7c8dff8ddd9..34a1a716be6694 100644
--- a/lld/ELF/SyntheticSections.h
+++ b/lld/ELF/SyntheticSections.h
@@ -1429,7 +1429,7 @@ class MemtagGlobalDescriptors final : public SyntheticSection {
template <class ELFT> void createSyntheticSections(Ctx &);
InputSection *createInterpSection(Ctx &);
-MergeInputSection *createCommentSection();
+MergeInputSection *createCommentSection(Ctx &);
template <class ELFT> void splitSections(Ctx &);
void combineEhSections(Ctx &);
More information about the llvm-commits
mailing list