[PATCH] D134594: [lld-macho] Force higher alignment for __thread_vars

Daniel Bertalan via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sat Sep 24 12:49:48 PDT 2022


BertalanD created this revision.
BertalanD added a reviewer: lld-macho.
Herald added projects: lld-macho, All.
BertalanD requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

`__thread_vars` contains pointers to `__tlv_bootstrap`, which are fixed
up by dyld; however the section's alignment is not specified. This means
that the relocations might end up on odd addresses, which is not
representable by the soon to be added chained fixups.

This is arguably a bug in MC, but this behavior has been there since TLV
support was originally added.

This patch forces the `__thread_vars` sections to be aligned to the
target's pointer size size. This is done by ld64 as well.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D134594

Files:
  lld/MachO/Writer.cpp
  lld/test/MachO/tlv-dylib.s


Index: lld/test/MachO/tlv-dylib.s
===================================================================
--- lld/test/MachO/tlv-dylib.s
+++ lld/test/MachO/tlv-dylib.s
@@ -43,7 +43,7 @@
 # FLAGS-NEXT:      addr
 # FLAGS-NEXT:      size 0x0000000000000030
 # FLAGS-NEXT:    offset
-# FLAGS-NEXT:     align
+# FLAGS-NEXT:     align 2^3 (8)
 # FLAGS-NEXT:    reloff 0
 # FLAGS-NEXT:    nreloc 0
 # FLAGS-NEXT:      type S_THREAD_LOCAL_VARIABLES
Index: lld/MachO/Writer.cpp
===================================================================
--- lld/MachO/Writer.cpp
+++ lld/MachO/Writer.cpp
@@ -960,6 +960,12 @@
           segname == segment_names::text)
         osec->align = target->wordSize;
 
+      // MC keeps the default 1-byte alignment for __thread_vars, even though it
+      // contains pointers that are fixed up by dyld, which requires proper
+      // alignment.
+      if (isThreadLocalVariables(osec->flags))
+        osec->align = std::max<uint32_t>(osec->align, target->wordSize);
+
       getOrCreateOutputSegment(segname)->addOutputSection(osec);
     }
   }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D134594.462687.patch
Type: text/x-patch
Size: 1073 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220924/65fa631c/attachment.bin>


More information about the llvm-commits mailing list