[lld-macho] Add support for -add_empty_section
authorKeith Smiley <keithbsmiley@gmail.com>
Sat, 29 Jan 2022 02:46:51 +0000 (18:46 -0800)
committerKeith Smiley <keithbsmiley@gmail.com>
Sun, 30 Jan 2022 18:03:41 +0000 (10:03 -0800)
This is a ld64 option equivalent to `-sectcreate seg sect /dev/null`
that's useful for creating sections like the RESTRICT section.

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

lld/MachO/Driver.cpp
lld/MachO/Options.td
lld/test/MachO/sectcreate.s

index e4c9f4d..f0cddab 100644 (file)
@@ -1484,6 +1484,12 @@ bool macho::link(ArrayRef<const char *> argsArr, llvm::raw_ostream &stdoutOS,
         inputFiles.insert(make<OpaqueFile>(*buffer, segName, sectName));
     }
 
+    for (const Arg *arg : args.filtered(OPT_add_empty_section)) {
+      StringRef segName = arg->getValue(0);
+      StringRef sectName = arg->getValue(1);
+      inputFiles.insert(make<OpaqueFile>(MemoryBufferRef(), segName, sectName));
+    }
+
     gatherInputSections();
     if (config->callGraphProfileSort)
       extractCallGraphProfile();
index 3d1d976..ab79aa7 100644 (file)
@@ -252,6 +252,10 @@ def segcreate : MultiArg<["-"], "segcreate", 3>,
     Alias<sectcreate>,
     HelpText<"Alias for -sectcreate">,
     Group<grp_content>;
+def add_empty_section : MultiArg<["-"], "add_empty_section", 2>,
+    MetaVarName<"<segment> <section>">,
+    HelpText<"Create an empty <section> in <segment>">,
+    Group<grp_content>;
 def filelist : Separate<["-"], "filelist">,
     MetaVarName<"<file>">,
     HelpText<"Read names of files to link from <file>">,
index 03847e1..919c553 100644 (file)
@@ -7,6 +7,7 @@
 # RUN:     -sectcreate SEG SEC1 %t1 \
 # RUN:     -segcreate SEG SEC2 %t3 \
 # RUN:     -sectcreate SEG SEC1 %t2 \
+# RUN:     -add_empty_section __DATA __data \
 # RUN:     -o %t %t.o
 # RUN: llvm-objdump -s %t | FileCheck %s
 
 # RUN:     -sectcreate SEG SEC1 %t1 \
 # RUN:     -segcreate SEG SEC2 %t3 \
 # RUN:     -sectcreate SEG SEC1 %t2 \
+# RUN:     -add_empty_section SEG SEC1 \
 # RUN:     -o %t %t.o
 # RUN: llvm-objdump -s %t | FileCheck --check-prefix=STRIPPED %s
 # RUN: llvm-readobj --sections %t | FileCheck --check-prefix=STRIPPEDSEC %s
 
+# RUN: %lld -add_empty_section foo bar -o %t %t.o
+# RUN: llvm-readobj --sections %t | FileCheck --check-prefix=EMPTYSECTION %s
+
+# RUN: %lld -sectcreate SEG SEC1 %t1 -add_empty_section SEG SEC1 -o %t %t.o
+# RUN: llvm-readobj --sections %t | FileCheck --check-prefix=CREATEDANDEMPTY %s
+
 # CHECK: Contents of section __TEXT,__text:
 # CHECK: Contents of section __DATA,__data:
 # CHECK: my string!.
 
 # STRIPPEDSEC-NOT: NoDeadStrip
 
+# EMPTYSECTION: Name: bar
+# EMPTYSECTION: Segment: foo
+# EMPTYSECTION: Size: 0x0
+# EMPTYSECTION-NOT: Name:
+
+# CREATEDANDEMPTY: Name: SEC1
+# CREATEDANDEMPTY: Segment: SEG
+# CREATEDANDEMPTY: Size: 0x10
+# CREATEDANDEMPTY-NOT: Name:
+
 .text
 .global _main
 _main: