[llvm] f79b81f - [llvm-objcopy] Enable --discard-all for MachO

Alexander Shaposhnikov via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 26 12:51:45 PST 2020


Author: Alexander Shaposhnikov
Date: 2020-02-26T12:51:15-08:00
New Revision: f79b81fbe2870ff631ad72a75f7e077b15b52a22

URL: https://github.com/llvm/llvm-project/commit/f79b81fbe2870ff631ad72a75f7e077b15b52a22
DIFF: https://github.com/llvm/llvm-project/commit/f79b81fbe2870ff631ad72a75f7e077b15b52a22.diff

LOG: [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

Added: 
    llvm/test/tools/llvm-objcopy/MachO/discard-all.test

Modified: 
    llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp

Removed: 
    


################################################################################
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 000000000000..3fb49b62c04e
--- /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 24b1a9edfd2f..8f159ca11632 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");
   }


        


More information about the llvm-commits mailing list