[llvm] [ELFObject] Added dbgs() statement in removeSections() (PR #124692)
Kshitij Paranjape via llvm-commits
llvm-commits at lists.llvm.org
Sat Feb 8 01:32:43 PST 2025
https://github.com/kshitijvp updated https://github.com/llvm/llvm-project/pull/124692
>From 718edfee71e995ab4fbee442af7b92a0c15cee65 Mon Sep 17 00:00:00 2001
From: Kshitij Paranjape <kshitijvparanjape at gmail.com>
Date: Mon, 27 Jan 2025 21:19:33 +0530
Subject: [PATCH 1/2] [ELFObject] Added dbgs() statement in removeSections()
This patch adds dbgs() statement inside removeSections()
and removeSymbol() function to print the removed sections
and symbols.
Fixes: #123041
---
llvm/lib/ObjCopy/ELF/ELFObject.cpp | 26 ++++++++++++++++++++------
llvm/tools/llvm-objcopy/CommonOpts.td | 2 ++
2 files changed, 22 insertions(+), 6 deletions(-)
diff --git a/llvm/lib/ObjCopy/ELF/ELFObject.cpp b/llvm/lib/ObjCopy/ELF/ELFObject.cpp
index 45c7ea49b5d938b..94c73b62de12e18 100644
--- a/llvm/lib/ObjCopy/ELF/ELFObject.cpp
+++ b/llvm/lib/ObjCopy/ELF/ELFObject.cpp
@@ -766,8 +766,14 @@ Error SymbolTableSection::removeSymbols(
function_ref<bool(const Symbol &)> ToRemove) {
Symbols.erase(
std::remove_if(std::begin(Symbols) + 1, std::end(Symbols),
- [ToRemove](const SymPtr &Sym) { return ToRemove(*Sym); }),
- std::end(Symbols));
+ [ToRemove](const SymPtr &Sym) {
+ if (ToRemove(*Sym)) {
+ dbgs()<<"Symbols Removed:"<<Sym->Name<< "\n";
+ return true;
+ }
+ return false;
+ }));
+
auto PrevSize = Size;
Size = Symbols.size() * EntrySize;
if (Size < PrevSize)
@@ -2249,10 +2255,18 @@ Error Object::removeSections(
// Transfer removed sections into the Object RemovedSections container for use
// later.
- std::move(Iter, Sections.end(), std::back_inserter(RemovedSections));
- // Now finally get rid of them all together.
- Sections.erase(Iter, std::end(Sections));
- return Error::success();
+ for(auto &KeepSec : make_range(std::begin(Sections) , Iter))
+ {
+
+ if (Error E = KeepSec->removeSectionReferences(
+ AllowBrokenLinks, [&RemoveSections](const SectionBase *Sec) {
+ return RemoveSections.find(Sec) != RemoveSections.end();
+ }))
+ std::move(Iter, Sections.end(), std::back_inserter(RemovedSections));
+ dbgs()<<"Sections Removed:"<<KeepSec->Name<<'\n';
+ Sections.erase(Iter, std::end(Sections));
+ return Error::success();
+ }
}
Error Object::replaceSections(
diff --git a/llvm/tools/llvm-objcopy/CommonOpts.td b/llvm/tools/llvm-objcopy/CommonOpts.td
index c247c93f6e0f270..5b15191f546051a 100644
--- a/llvm/tools/llvm-objcopy/CommonOpts.td
+++ b/llvm/tools/llvm-objcopy/CommonOpts.td
@@ -117,6 +117,8 @@ def regex
def version : Flag<["--"], "version">,
HelpText<"Print the version and exit.">;
+def verbose : Flag<["--"], "verbose">,
+ HelpText<"Prints the removed symbols and sections">;
def V : Flag<["-"], "V">,
Alias<version>,
HelpText<"Alias for --version">;
>From 02fb5c0b003a99cdbd36c47c2ffd1ca95ab5db85 Mon Sep 17 00:00:00 2001
From: Kshitij Paranjape <kshitijvparanjape at gmail.com>
Date: Sat, 8 Feb 2025 14:59:42 +0530
Subject: [PATCH 2/2] Made Changes
---
llvm/include/llvm/ObjCopy/CommonConfig.h | 1 +
llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp | 1 +
llvm/lib/ObjCopy/ELF/ELFObject.cpp | 27 +++++++++++-----------
llvm/lib/ObjCopy/ELF/ELFObject.h | 1 +
llvm/tools/llvm-objcopy/ObjcopyOptions.cpp | 2 ++
5 files changed, 18 insertions(+), 14 deletions(-)
diff --git a/llvm/include/llvm/ObjCopy/CommonConfig.h b/llvm/include/llvm/ObjCopy/CommonConfig.h
index aea9cd6f9a9c72b..83ad4590d9c72cb 100644
--- a/llvm/include/llvm/ObjCopy/CommonConfig.h
+++ b/llvm/include/llvm/ObjCopy/CommonConfig.h
@@ -274,6 +274,7 @@ struct CommonConfig {
bool StripNonAlloc = false;
bool StripSections = false;
bool StripUnneeded = false;
+ bool Verbose = false;
bool Weaken = false;
bool DecompressDebugSections = false;
diff --git a/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp b/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp
index 5aa0079f3fbc7a7..ad3a2135d23a753 100644
--- a/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp
+++ b/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp
@@ -782,6 +782,7 @@ static Error verifyNoteSection(StringRef Name, endianness Endianness,
// system. The only priority is that keeps/copies overrule removes.
static Error handleArgs(const CommonConfig &Config, const ELFConfig &ELFConfig,
ElfType OutputElfType, Object &Obj) {
+ Obj.isVerboseEnabled = Config.Verbose;
if (Config.OutputArch) {
Obj.Machine = Config.OutputArch->EMachine;
Obj.OSABI = Config.OutputArch->OSABI;
diff --git a/llvm/lib/ObjCopy/ELF/ELFObject.cpp b/llvm/lib/ObjCopy/ELF/ELFObject.cpp
index 94c73b62de12e18..c9a090cdea51713 100644
--- a/llvm/lib/ObjCopy/ELF/ELFObject.cpp
+++ b/llvm/lib/ObjCopy/ELF/ELFObject.cpp
@@ -768,7 +768,7 @@ Error SymbolTableSection::removeSymbols(
std::remove_if(std::begin(Symbols) + 1, std::end(Symbols),
[ToRemove](const SymPtr &Sym) {
if (ToRemove(*Sym)) {
- dbgs()<<"Symbols Removed:"<<Sym->Name<< "\n";
+ llvm::outs() << "Symbols Removed:" << Sym->Name<< "\n";
return true;
}
return false;
@@ -2236,6 +2236,9 @@ Error Object::removeSections(
for (auto &RemoveSec : make_range(Iter, std::end(Sections))) {
for (auto &Segment : Segments)
Segment->removeSection(RemoveSec.get());
+ if (isVerboseEnabled) {
+ llvm::outs() << "Removed Section: " << (RemoveSec.get()->Name);
+ }
RemoveSec->onRemove();
RemoveSections.insert(RemoveSec.get());
}
@@ -2255,18 +2258,10 @@ Error Object::removeSections(
// Transfer removed sections into the Object RemovedSections container for use
// later.
- for(auto &KeepSec : make_range(std::begin(Sections) , Iter))
- {
-
- if (Error E = KeepSec->removeSectionReferences(
- AllowBrokenLinks, [&RemoveSections](const SectionBase *Sec) {
- return RemoveSections.find(Sec) != RemoveSections.end();
- }))
- std::move(Iter, Sections.end(), std::back_inserter(RemovedSections));
- dbgs()<<"Sections Removed:"<<KeepSec->Name<<'\n';
- Sections.erase(Iter, std::end(Sections));
- return Error::success();
- }
+ std::move(Iter, Sections.end(), std::back_inserter(RemovedSections));
+ // Now finally get rid of them all together.
+ Sections.erase(Iter, std::end(Sections));
+ return Error::success();
}
Error Object::replaceSections(
@@ -2296,8 +2291,12 @@ Error Object::replaceSections(
Error Object::removeSymbols(function_ref<bool(const Symbol &)> ToRemove) {
if (SymbolTable)
for (const SecPtr &Sec : Sections)
- if (Error E = Sec->removeSymbols(ToRemove))
+ if (Error E = Sec->removeSymbols(ToRemove)){
+ if (isVerboseEnabled){
+ llvm::outs() << "Removed Symbols:" << Sec->Name;
+ }
return E;
+ }
return Error::success();
}
diff --git a/llvm/lib/ObjCopy/ELF/ELFObject.h b/llvm/lib/ObjCopy/ELF/ELFObject.h
index d8f79a4b1a3cc6e..4ec1f7188ef88a5 100644
--- a/llvm/lib/ObjCopy/ELF/ELFObject.h
+++ b/llvm/lib/ObjCopy/ELF/ELFObject.h
@@ -1195,6 +1195,7 @@ class Object {
uint32_t Flags;
bool HadShdrs = true;
+ bool isVerboseEnabled = true;
bool MustBeRelocatable = false;
StringTableSection *SectionNames = nullptr;
SymbolTableSection *SymbolTable = nullptr;
diff --git a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
index 0d209590655ef36..7a0d7197560818d 100644
--- a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
+++ b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
@@ -1103,6 +1103,7 @@ objcopy::parseObjcopyOptions(ArrayRef<const char *> ArgsArr,
OBJCOPY_verify_note_sections, OBJCOPY_no_verify_note_sections, true);
Config.OnlyKeepDebug = InputArgs.hasArg(OBJCOPY_only_keep_debug);
+ Config.Verbose = InputArgs.hasArg(OBJCOPY_verbose);
ELFConfig.KeepFileSymbols = InputArgs.hasArg(OBJCOPY_keep_file_symbols);
MachOConfig.KeepUndefined = InputArgs.hasArg(OBJCOPY_keep_undefined);
Config.DecompressDebugSections =
@@ -1586,6 +1587,7 @@ objcopy::parseStripOptions(ArrayRef<const char *> RawArgsArr,
Config.StripAllGNU = InputArgs.hasArg(STRIP_strip_all_gnu);
MachOConfig.StripSwiftSymbols = InputArgs.hasArg(STRIP_strip_swift_symbols);
Config.OnlyKeepDebug = InputArgs.hasArg(STRIP_only_keep_debug);
+ Config.Verbose = InputArgs.hasArg(STRIP_verbose);
ELFConfig.KeepFileSymbols = InputArgs.hasArg(STRIP_keep_file_symbols);
MachOConfig.KeepUndefined = InputArgs.hasArg(STRIP_keep_undefined);
More information about the llvm-commits
mailing list