diff options
Diffstat (limited to 'llvm/tools/llvm-objcopy/llvm-objcopy.cpp')
-rw-r--r-- | llvm/tools/llvm-objcopy/llvm-objcopy.cpp | 73 |
1 files changed, 4 insertions, 69 deletions
diff --git a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp index f0d6b4416cf..72501f3eb98 100644 --- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp +++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp @@ -17,7 +17,6 @@ #include "llvm/ADT/StringRef.h" #include "llvm/ADT/Twine.h" #include "llvm/BinaryFormat/ELF.h" -#include "llvm/MC/MCTargetOptions.h" #include "llvm/Object/Archive.h" #include "llvm/Object/ArchiveWriter.h" #include "llvm/Object/Binary.h" @@ -176,7 +175,6 @@ struct CopyConfig { bool StripSections = false; bool StripUnneeded = false; bool Weaken = false; - DebugCompressionType CompressionType = DebugCompressionType::None; }; using SectionPred = std::function<bool(const SectionBase &Sec)>; @@ -292,12 +290,12 @@ static SectionRename parseRenameSectionValue(StringRef FlagValue) { } static bool isDebugSection(const SectionBase &Sec) { - return StringRef(Sec.Name).startswith(".debug") || - StringRef(Sec.Name).startswith(".zdebug") || Sec.Name == ".gdb_index"; + return Sec.Name.startswith(".debug") || Sec.Name.startswith(".zdebug") || + Sec.Name == ".gdb_index"; } static bool isDWOSection(const SectionBase &Sec) { - return StringRef(Sec.Name).endswith(".dwo"); + return Sec.Name.endswith(".dwo"); } static bool onlyKeepDWOPred(const Object &Obj, const SectionBase &Sec) { @@ -407,49 +405,6 @@ static Error dumpSectionToFile(StringRef SecName, StringRef Filename, object_error::parse_failed); } -static bool isCompressed(const SectionBase &Section) { - ArrayRef<uint8_t> GnuPrefix = {'Z', 'L', 'I', 'B'}; - return StringRef(Section.Name).startswith(".zdebug") || - (Section.OriginalData.size() > strlen("ZLIB") && - std::equal(GnuPrefix.begin(), GnuPrefix.end(), - Section.OriginalData.data())) || - (Section.Flags & ELF::SHF_COMPRESSED); -} - -static bool isCompressable(const SectionBase &Section) { - return !isCompressed(Section) && isDebugSection(Section) && - Section.Name != ".gdb_index"; -} - -static void compressSections(const CopyConfig &Config, Object &Obj, - SectionPred &RemovePred) { - SmallVector<SectionBase *, 13> ToCompress; - SmallVector<RelocationSection *, 13> RelocationSections; - for (auto &Sec : Obj.sections()) { - if (RelocationSection *R = dyn_cast<RelocationSection>(&Sec)) { - if (isCompressable(*R->getSection())) - RelocationSections.push_back(R); - continue; - } - - if (isCompressable(Sec)) - ToCompress.push_back(&Sec); - } - - for (SectionBase *S : ToCompress) { - CompressedSection &CS = - Obj.addSection<CompressedSection>(*S, Config.CompressionType); - - for (RelocationSection *RS : RelocationSections) { - if (RS->getSection() == S) - RS->setSection(&CS); - } - } - - RemovePred = [RemovePred](const SectionBase &Sec) { - return isCompressable(Sec) || RemovePred(Sec); - }; -} // This function handles the high level operations of GNU objcopy including // handling command line options. It's important to outline certain properties // we expect to hold of the command line operations. Any operation that "keeps" @@ -609,7 +564,7 @@ static void handleArgs(const CopyConfig &Config, Object &Obj, return true; if (&Sec == Obj.SectionNames) return false; - if (StringRef(Sec.Name).startswith(".gnu.warning")) + if (Sec.Name.startswith(".gnu.warning")) return false; return (Sec.Flags & SHF_ALLOC) == 0; }; @@ -661,9 +616,6 @@ static void handleArgs(const CopyConfig &Config, Object &Obj, }; } - if (Config.CompressionType != DebugCompressionType::None) - compressSections(Config, Obj, RemovePred); - Obj.removeSections(RemovePred); if (!Config.SectionsToRename.empty()) { @@ -908,23 +860,6 @@ static CopyConfig parseObjcopyOptions(ArrayRef<const char *> ArgsArr) { Config.BinaryArch = getMachineInfo(BinaryArch); } - if (auto Arg = InputArgs.getLastArg(OBJCOPY_compress_debug_sections, - OBJCOPY_compress_debug_sections_eq)) { - Config.CompressionType = DebugCompressionType::Z; - - if (Arg->getOption().getID() == OBJCOPY_compress_debug_sections_eq) { - Config.CompressionType = - StringSwitch<DebugCompressionType>( - InputArgs.getLastArgValue(OBJCOPY_compress_debug_sections_eq)) - .Case("zlib-gnu", DebugCompressionType::GNU) - .Case("zlib", DebugCompressionType::Z) - .Default(DebugCompressionType::None); - if (Config.CompressionType == DebugCompressionType::None) - error("Invalid or unsupported --compress-debug-sections format: " + - InputArgs.getLastArgValue(OBJCOPY_compress_debug_sections_eq)); - } - } - Config.SplitDWO = InputArgs.getLastArgValue(OBJCOPY_split_dwo); Config.AddGnuDebugLink = InputArgs.getLastArgValue(OBJCOPY_add_gnu_debuglink); Config.SymbolsPrefix = InputArgs.getLastArgValue(OBJCOPY_prefix_symbols); |