[llvm] 5917219 - [llvm] remove empty __LLVM segment in llvm-bitcode-strip

Richard Howell via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 7 08:52:51 PST 2022


Author: Richard Howell
Date: 2022-03-07T08:52:25-08:00
New Revision: 59172194389c92f14057cfe97d6c0b26a4b1a6f1

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

LOG: [llvm] remove empty __LLVM segment in llvm-bitcode-strip

When running llvm-bitcode-strip we want to remove the __LLVM
segment as well as the __bundle section when there are no other
sections in the segment.

Differential Revision: https://reviews.llvm.org/D120927

Added: 
    llvm/test/tools/llvm-objcopy/MachO/bitcode-strip-remove-nonempty-segment.test

Modified: 
    llvm/include/llvm/ObjCopy/MachO/MachOConfig.h
    llvm/lib/ObjCopy/MachO/MachOObjcopy.cpp
    llvm/test/tools/llvm-objcopy/MachO/bitcode-strip-remove.test
    llvm/tools/llvm-objcopy/ObjcopyOptions.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/ObjCopy/MachO/MachOConfig.h b/llvm/include/llvm/ObjCopy/MachO/MachOConfig.h
index f65cea36a920b..c5f8613632977 100644
--- a/llvm/include/llvm/ObjCopy/MachO/MachOConfig.h
+++ b/llvm/include/llvm/ObjCopy/MachO/MachOConfig.h
@@ -29,6 +29,9 @@ struct MachOConfig {
   // install-name-tool's id option
   Optional<StringRef> SharedLibId;
 
+  // Segments to remove if they are empty
+  DenseSet<StringRef> EmptySegmentsToRemove;
+
   // Boolean options
   bool StripSwiftSymbols = false;
   bool KeepUndefined = false;

diff  --git a/llvm/lib/ObjCopy/MachO/MachOObjcopy.cpp b/llvm/lib/ObjCopy/MachO/MachOObjcopy.cpp
index 8eebdd6f8c659..94e89224b3c8f 100644
--- a/llvm/lib/ObjCopy/MachO/MachOObjcopy.cpp
+++ b/llvm/lib/ObjCopy/MachO/MachOObjcopy.cpp
@@ -258,6 +258,21 @@ static Error processLoadCommands(const MachOConfig &MachOConfig, Object &Obj) {
   if (!MachOConfig.RPathToPrepend.empty())
     Obj.updateLoadCommandIndexes();
 
+  // Remove any empty segments if required.
+  if (!MachOConfig.EmptySegmentsToRemove.empty()) {
+    auto RemovePred = [&MachOConfig](const LoadCommand &LC) {
+      if (LC.MachOLoadCommand.load_command_data.cmd == MachO::LC_SEGMENT_64 ||
+          LC.MachOLoadCommand.load_command_data.cmd == MachO::LC_SEGMENT) {
+        return LC.Sections.empty() &&
+               MachOConfig.EmptySegmentsToRemove.contains(
+                   LC.getSegmentName().getValue());
+      }
+      return false;
+    };
+    if (Error E = Obj.removeLoadCommands(RemovePred))
+      return E;
+  }
+
   return Error::success();
 }
 

diff  --git a/llvm/test/tools/llvm-objcopy/MachO/bitcode-strip-remove-nonempty-segment.test b/llvm/test/tools/llvm-objcopy/MachO/bitcode-strip-remove-nonempty-segment.test
new file mode 100644
index 0000000000000..175dea8f05fb0
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/MachO/bitcode-strip-remove-nonempty-segment.test
@@ -0,0 +1,117 @@
+## Test bitcode segment is not removed when not empty.
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-bitcode-strip -r %t -o %t2
+# RUN: llvm-readobj --macho-segment --sections %t2 | FileCheck --implicit-check-not=Name: %s
+
+# CHECK:      Name: __text
+# CHECK-NEXT: Segment: __TEXT
+# CHECK:      Name: __bundle
+# CHECK-NEXT: Segment: __DATA
+# CHECK:      Name: __notbundle
+# CHECK-NEXT: Segment: __LLVM
+# CHECK:      Cmd: LC_SEGMENT_64
+# CHECK-NEXT: Name: __TEXT
+# CHECK:      Cmd: LC_SEGMENT_64
+# CHECK-NEXT: Name: __DATA
+# CHECK:      Cmd: LC_SEGMENT_64
+# CHECK-NEXT: Name: __LLVM
+
+--- !mach-o
+FileHeader:
+  magic:           0xFEEDFACF
+  cputype:         0x01000007
+  cpusubtype:      0x00000003
+  filetype:        0x00000001
+  ncmds:           3
+  sizeofcmds:      536
+  flags:           0x00002000
+  reserved:        0x00000000
+LoadCommands:
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         152
+    segname:         __TEXT
+    vmaddr:          0
+    vmsize:          4
+    fileoff:         568
+    filesize:        4
+    maxprot:         7
+    initprot:        7
+    nsects:          1
+    flags:           0
+    Sections:
+      - sectname:        __text
+        segname:         __TEXT
+        addr:            0x0000000000000000
+        content:         'AABBCCDD'
+        size:            4
+        offset:          568
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x80000400
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         152
+    segname:         __DATA
+    vmaddr:          4
+    vmsize:          4
+    fileoff:         572
+    filesize:        4
+    maxprot:         7
+    initprot:        7
+    nsects:          1
+    flags:           0
+    Sections:
+      - sectname:        __bundle
+        segname:         __DATA
+        addr:            0x0000000000000004
+        content:         'DDAADDAA'
+        size:            4
+        offset:          572
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x00000000
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         232
+    segname:         __LLVM
+    vmaddr:          8
+    vmsize:          8
+    fileoff:         576
+    filesize:        8
+    maxprot:         7
+    initprot:        7
+    nsects:          2
+    flags:           0
+    Sections:
+      - sectname:        __bundle
+        segname:         __LLVM
+        addr:            0x0000000000000008
+        content:         'EEFFEEFF'
+        size:            4
+        offset:          576
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x00000000
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __notbundle
+        segname:         __LLVM
+        addr:            0x0000000000000008
+        content:         'EEFFEEFF'
+        size:            4
+        offset:          580
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x00000000
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000

diff  --git a/llvm/test/tools/llvm-objcopy/MachO/bitcode-strip-remove.test b/llvm/test/tools/llvm-objcopy/MachO/bitcode-strip-remove.test
index a7acd17004549..7282febcab17e 100644
--- a/llvm/test/tools/llvm-objcopy/MachO/bitcode-strip-remove.test
+++ b/llvm/test/tools/llvm-objcopy/MachO/bitcode-strip-remove.test
@@ -1,14 +1,16 @@
-## Test bitcode section removal.
+## Test bitcode section and segment removal.
 # RUN: yaml2obj %s -o %t
 # RUN: llvm-bitcode-strip -r %t -o %t2
-# RUN: llvm-readobj --sections %t2 | FileCheck --implicit-check-not=Name: %s
+# RUN: llvm-readobj --macho-segment --sections %t2 | FileCheck --implicit-check-not=Name: %s
 
 # CHECK:      Name: __text
 # CHECK-NEXT: Segment: __TEXT
 # CHECK:      Name: __bundle
 # CHECK-NEXT: Segment: __DATA
-# CHECK:      Name: __notbundle
-# CHECK-NEXT: Segment: __LLVM
+# CHECK:      Cmd: LC_SEGMENT_64
+# CHECK-NEXT: Name: __TEXT
+# CHECK:      Cmd: LC_SEGMENT_64
+# CHECK-NEXT: Name: __DATA
 
 --- !mach-o
 FileHeader:
@@ -16,21 +18,21 @@ FileHeader:
   cputype:         0x01000007
   cpusubtype:      0x00000003
   filetype:        0x00000001
-  ncmds:           1
-  sizeofcmds:      392
+  ncmds:           3
+  sizeofcmds:      456
   flags:           0x00002000
   reserved:        0x00000000
 LoadCommands:
   - cmd:             LC_SEGMENT_64
-    cmdsize:         392
-    segname:         ''
+    cmdsize:         152
+    segname:         __TEXT
     vmaddr:          0
-    vmsize:          16
-    fileoff:         424
-    filesize:        16
+    vmsize:          4
+    fileoff:         488
+    filesize:        4
     maxprot:         7
     initprot:        7
-    nsects:          4
+    nsects:          1
     flags:           0
     Sections:
       - sectname:        __text
@@ -38,7 +40,7 @@ LoadCommands:
         addr:            0x0000000000000000
         content:         'AABBCCDD'
         size:            4
-        offset:          424
+        offset:          488
         align:           0
         reloff:          0x00000000
         nreloc:          0
@@ -46,12 +48,24 @@ LoadCommands:
         reserved1:       0x00000000
         reserved2:       0x00000000
         reserved3:       0x00000000
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         152
+    segname:         __DATA
+    vmaddr:          4
+    vmsize:          4
+    fileoff:         492
+    filesize:        4
+    maxprot:         7
+    initprot:        7
+    nsects:          1
+    flags:           0
+    Sections:
       - sectname:        __bundle
         segname:         __DATA
         addr:            0x0000000000000004
         content:         'DDAADDAA'
         size:            4
-        offset:          428
+        offset:          492
         align:           0
         reloff:          0x00000000
         nreloc:          0
@@ -59,25 +73,24 @@ LoadCommands:
         reserved1:       0x00000000
         reserved2:       0x00000000
         reserved3:       0x00000000
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         152
+    segname:         __LLVM
+    vmaddr:          8
+    vmsize:          4
+    fileoff:         496
+    filesize:        4
+    maxprot:         7
+    initprot:        7
+    nsects:          1
+    flags:           0
+    Sections:
       - sectname:        __bundle
         segname:         __LLVM
         addr:            0x0000000000000008
         content:         'EEFFEEFF'
         size:            4
-        offset:          432
-        align:           0
-        reloff:          0x00000000
-        nreloc:          0
-        flags:           0x00000000
-        reserved1:       0x00000000
-        reserved2:       0x00000000
-        reserved3:       0x00000000
-      - sectname:        __notbundle
-        segname:         __LLVM
-        addr:            0x0000000000000008
-        content:         'EEFFEEFF'
-        size:            4
-        offset:          436
+        offset:          496
         align:           0
         reloff:          0x00000000
         nreloc:          0

diff  --git a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
index 6457be21fa4d4..1281af3b62379 100644
--- a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
+++ b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
@@ -14,6 +14,7 @@
 #include "llvm/BinaryFormat/COFF.h"
 #include "llvm/ObjCopy/CommonConfig.h"
 #include "llvm/ObjCopy/ConfigManager.h"
+#include "llvm/ObjCopy/MachO/MachOConfig.h"
 #include "llvm/Option/Arg.h"
 #include "llvm/Option/ArgList.h"
 #include "llvm/Support/CRC.h"
@@ -1189,6 +1190,7 @@ objcopy::parseBitcodeStripOptions(ArrayRef<const char *> ArgsArr,
   DriverConfig DC;
   ConfigManager ConfigMgr;
   CommonConfig &Config = ConfigMgr.Common;
+  MachOConfig &MachOConfig = ConfigMgr.MachO;
   BitcodeStripOptTable T;
   unsigned MissingArgumentIndex, MissingArgumentCount;
   opt::InputArgList InputArgs =
@@ -1233,9 +1235,11 @@ objcopy::parseBitcodeStripOptions(ArrayRef<const char *> ArgsArr,
   if (!InputArgs.hasArg(BITCODE_STRIP_remove))
     return createStringError(errc::invalid_argument, "no action specified");
 
-  // We only support -r for now, which removes all bitcode sections.
+  // We only support -r for now, which removes all bitcode sections and
+  // the __LLVM segment if it's now empty.
   cantFail(Config.ToRemove.addMatcher(NameOrPattern::create(
       "__LLVM,__bundle", MatchStyle::Literal, ErrorCallback)));
+  MachOConfig.EmptySegmentsToRemove.insert("__LLVM");
 
   DC.CopyConfigs.push_back(std::move(ConfigMgr));
   return std::move(DC);


        


More information about the llvm-commits mailing list