[JITLink][MachO] Detect MachO::S_THREAD_LOCAL_ZEROFILL sections as zero-fill.
authorLang Hames <lhames@gmail.com>
Tue, 20 Jul 2021 08:16:39 +0000 (18:16 +1000)
committerLang Hames <lhames@gmail.com>
Tue, 20 Jul 2021 23:10:10 +0000 (09:10 +1000)
This will be used in upcoming MachO native TLV support patches to LLVM and
the ORC runtime.

llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.cpp
llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.h
llvm/test/ExecutionEngine/JITLink/X86/MachO_thread_bss.s [new file with mode: 0644]

index 9ba5232..03a8b98 100644 (file)
@@ -85,6 +85,17 @@ bool MachOLinkGraphBuilder::isDebugSection(const NormalizedSection &NSec) {
           strcmp(NSec.SegName, "__DWARF") == 0);
 }
 
+bool MachOLinkGraphBuilder::isZeroFillSection(const NormalizedSection &NSec) {
+  switch (NSec.Flags & MachO::SECTION_TYPE) {
+  case MachO::S_ZEROFILL:
+  case MachO::S_GB_ZEROFILL:
+  case MachO::S_THREAD_LOCAL_ZEROFILL:
+    return true;
+  default:
+    return false;
+  }
+}
+
 unsigned
 MachOLinkGraphBuilder::getPointerSize(const object::MachOObjectFile &Obj) {
   return Obj.is64Bit() ? 8 : 4;
@@ -154,17 +165,12 @@ Error MachOLinkGraphBuilder::createNormalizedSections() {
     });
 
     // Get the section data if any.
-    {
-      unsigned SectionType = NSec.Flags & MachO::SECTION_TYPE;
-      if (SectionType != MachO::S_ZEROFILL &&
-          SectionType != MachO::S_GB_ZEROFILL) {
+    if (!isZeroFillSection(NSec)) {
+      if (DataOffset + NSec.Size > Obj.getData().size())
+        return make_error<JITLinkError>(
+            "Section data extends past end of file");
 
-        if (DataOffset + NSec.Size > Obj.getData().size())
-          return make_error<JITLinkError>(
-              "Section data extends past end of file");
-
-        NSec.Data = Obj.getData().data() + DataOffset;
-      }
+      NSec.Data = Obj.getData().data() + DataOffset;
     }
 
     // Get prot flags.
index a6df445..90b14c4 100644 (file)
@@ -159,6 +159,7 @@ protected:
   static bool isAltEntry(const NormalizedSymbol &NSym);
 
   static bool isDebugSection(const NormalizedSection &NSec);
+  static bool isZeroFillSection(const NormalizedSection &NSec);
 
   MachO::relocation_info
   getRelocationInfo(const object::relocation_iterator RelItr) {
diff --git a/llvm/test/ExecutionEngine/JITLink/X86/MachO_thread_bss.s b/llvm/test/ExecutionEngine/JITLink/X86/MachO_thread_bss.s
new file mode 100644 (file)
index 0000000..c921e64
--- /dev/null
@@ -0,0 +1,19 @@
+# RUN: llvm-mc -triple=x86_64-apple-macos10.9 -filetype=obj -o %t %s
+# RUN: llvm-jitlink -noexec -check=%s %t
+#
+# Check that __thread_bss sections are handled as zero-fill.
+#
+# jitlink-check: *{4}X = 0
+
+        .section       __TEXT,__text,regular,pure_instructions
+       .build_version macos, 10, 15    sdk_version 10, 15
+       .globl  _main
+       .p2align        4, 0x90
+_main:
+        retq
+
+        .globl X
+.tbss X, 4, 2
+
+
+.subsections_via_symbols