| From f79b81fbe2870ff631ad72a75f7e077b15b52a22 Mon Sep 17 00:00:00 2001 |
| From: Alexander Shaposhnikov <alexshap@fb.com> |
| Date: Wed, 26 Feb 2020 11:32:44 -0800 |
| Subject: [PATCH] [llvm-objcopy] Enable --discard-all for MachO |
| |
| In this diff we enable the option --discard-all for MachO. |
| |
| Test plan: make check-all |
| |
| Differential revision: https://reviews.llvm.org/D75104 |
| --- |
| .../tools/llvm-objcopy/MachO/discard-all.test | 132 ++++++++++++++++++ |
| .../tools/llvm-objcopy/MachO/MachOObjcopy.cpp | 10 +- |
| 2 files changed, 139 insertions(+), 3 deletions(-) |
| create mode 100644 llvm/test/tools/llvm-objcopy/MachO/discard-all.test |
| |
| diff --git a/llvm/test/tools/llvm-objcopy/MachO/discard-all.test b/llvm/test/tools/llvm-objcopy/MachO/discard-all.test |
| new file mode 100644 |
| index 00000000000..3fb49b62c04 |
| --- /dev/null |
| +++ b/llvm/test/tools/llvm-objcopy/MachO/discard-all.test |
| @@ -0,0 +1,132 @@ |
| +# RUN: yaml2obj %s -o %t |
| +# RUN: cp %t %t1 |
| +# RUN: llvm-objcopy --discard-all %t %t2 |
| +## Verify that llvm-objcopy has not modified the input. |
| +# RUN: cmp %t %t1 |
| +# RUN: llvm-readobj --symbols %t2 | FileCheck %s |
| + |
| +# RUN: llvm-objcopy -x %t %t3 |
| +## Verify that llvm-objcopy has not modified the input. |
| +# RUN: cmp %t %t1 |
| +# RUN: cmp %t2 %t3 |
| + |
| +## Verify that llvm-strip modifies the symbol table the same way. |
| +# RUN: cp %t %t4 |
| +# RUN: llvm-strip --discard-all %t4 |
| +# RUN: cmp %t2 %t4 |
| +# RUN: llvm-strip -x %t |
| +# RUN: cmp %t2 %t |
| + |
| +# CHECK: Symbols [ |
| +# CHECK-NEXT: Symbol { |
| +# CHECK-NEXT: Name: _b (1) |
| +# CHECK-NEXT: Extern |
| +# CHECK-NEXT: Type: Undef (0x0) |
| +# CHECK-NEXT: Section: (0x0) |
| +# CHECK-NEXT: RefType: UndefinedNonLazy (0x0) |
| +# CHECK-NEXT: Flags [ (0x220) |
| +# CHECK-NEXT: AltEntry (0x200) |
| +# CHECK-NEXT: NoDeadStrip (0x20) |
| +# CHECK-NEXT: ] |
| +# CHECK-NEXT: Value: 0x4 |
| +# CHECK-NEXT: } |
| +# CHECK-NEXT: ] |
| + |
| +--- !mach-o |
| +FileHeader: |
| + magic: 0xFEEDFACF |
| + cputype: 0x01000007 |
| + cpusubtype: 0x00000003 |
| + filetype: 0x00000001 |
| + ncmds: 4 |
| + sizeofcmds: 360 |
| + flags: 0x00002000 |
| + reserved: 0x00000000 |
| +LoadCommands: |
| + - cmd: LC_SEGMENT_64 |
| + cmdsize: 232 |
| + segname: '' |
| + vmaddr: 0 |
| + vmsize: 4 |
| + fileoff: 392 |
| + filesize: 0 |
| + maxprot: 7 |
| + initprot: 7 |
| + nsects: 2 |
| + flags: 0 |
| + Sections: |
| + - sectname: __text |
| + segname: __TEXT |
| + addr: 0x0000000000000000 |
| + size: 0 |
| + offset: 0x00000188 |
| + align: 0 |
| + reloff: 0x00000000 |
| + nreloc: 0 |
| + flags: 0x80000000 |
| + reserved1: 0x00000000 |
| + reserved2: 0x00000000 |
| + reserved3: 0x00000000 |
| + content: '' |
| + - sectname: __bss |
| + segname: __DATA |
| + addr: 0x0000000000000000 |
| + size: 4 |
| + offset: 0x00000000 |
| + align: 2 |
| + reloff: 0x00000000 |
| + nreloc: 0 |
| + flags: 0x00000001 |
| + reserved1: 0x00000000 |
| + reserved2: 0x00000000 |
| + reserved3: 0x00000000 |
| + - cmd: LC_BUILD_VERSION |
| + cmdsize: 24 |
| + platform: 1 |
| + minos: 658944 |
| + sdk: 658944 |
| + ntools: 0 |
| + - cmd: LC_SYMTAB |
| + cmdsize: 24 |
| + symoff: 392 |
| + nsyms: 2 |
| + stroff: 424 |
| + strsize: 8 |
| + - cmd: LC_DYSYMTAB |
| + cmdsize: 80 |
| + ilocalsym: 0 |
| + nlocalsym: 1 |
| + iextdefsym: 1 |
| + nextdefsym: 0 |
| + iundefsym: 1 |
| + nundefsym: 1 |
| + tocoff: 0 |
| + ntoc: 0 |
| + modtaboff: 0 |
| + nmodtab: 0 |
| + extrefsymoff: 0 |
| + nextrefsyms: 0 |
| + indirectsymoff: 0 |
| + nindirectsyms: 0 |
| + extreloff: 0 |
| + nextrel: 0 |
| + locreloff: 0 |
| + nlocrel: 0 |
| +LinkEditData: |
| + NameList: |
| + - n_strx: 4 |
| + n_type: 0x0E |
| + n_sect: 2 |
| + n_desc: 32 |
| + n_value: 0 |
| + - n_strx: 1 |
| + n_type: 0x01 |
| + n_sect: 0 |
| + n_desc: 544 |
| + n_value: 4 |
| + StringTable: |
| + - '' |
| + - _b |
| + - _a |
| + - '' |
| +... |
| diff --git a/llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp b/llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp |
| index 24b1a9edfd2..8f159ca1163 100644 |
| --- a/llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp |
| +++ b/llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp |
| @@ -66,7 +66,11 @@ static void updateAndRemoveSymbols(const CopyConfig &Config, Object &Obj) { |
| auto RemovePred = [Config](const std::unique_ptr<SymbolEntry> &N) { |
| if (N->Referenced) |
| return false; |
| - return Config.StripAll; |
| + if (Config.StripAll) |
| + return true; |
| + if (Config.DiscardMode == DiscardType::All && !(N->n_type & MachO::N_EXT)) |
| + return true; |
| + return false; |
| }; |
| |
| Obj.SymTable.removeSymbols(RemovePred); |
| @@ -172,8 +176,8 @@ static Error handleArgs(const CopyConfig &Config, Object &Obj) { |
| Config.StripNonAlloc || Config.StripSections || Config.Weaken || |
| Config.DecompressDebugSections || Config.StripNonAlloc || |
| Config.StripSections || Config.StripUnneeded || |
| - Config.DiscardMode != DiscardType::None || !Config.SymbolsToAdd.empty() || |
| - Config.EntryExpr) { |
| + Config.DiscardMode == DiscardType::Locals || |
| + !Config.SymbolsToAdd.empty() || Config.EntryExpr) { |
| return createStringError(llvm::errc::invalid_argument, |
| "option not supported by llvm-objcopy for MachO"); |
| } |
| -- |
| 2.26.1.301.g55bc3eb7cb9-goog |
| |