[PATCH] [lld] Enable writing of compact unwind sections

Tim Northover t.p.northover at gmail.com
Mon Jun 23 04:24:47 PDT 2014


Hi,

It seems the MachO writer can read in __LD,__compact_unwind sections,
but can't write them out at the moment (at least, when creating an
executable file). This causes an assert when generating most final
MachO files.

>From what I can tell, they should be moved to __TEXT, __unwind_info in
final images, so this patch implements that (but not any of the other
associated special behaviour).

OK to commit?

Cheers.

Tim.
-------------- next part --------------
commit 7b71a3dbe735b8fba95d620235171cbebf8eeef9
Author: Tim Northover <tnorthover at apple.com>
Date:   Fri Jun 20 14:35:22 2014 +0100

    MachO: re-enable writing of compact-unwind sections.

diff --git a/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp b/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp
index 726092c..1d7afdc 100644
--- a/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp
+++ b/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp
@@ -204,6 +204,7 @@ const MachOFinalSectionFromAtomType sectsToAtomType[] = {
   ENTRY("__TEXT", "__stub_helper",    S_REGULAR,          typeStubHelper),
   ENTRY("__TEXT", "__gcc_except_tab", S_REGULAR,          typeLSDA),
   ENTRY("__TEXT", "__eh_frame",       S_COALESCED,        typeCFI),
+  ENTRY("__TEXT", "__unwind_info",    S_REGULAR,         typeCompactUnwindInfo),
   ENTRY("__DATA", "__data",           S_REGULAR,          typeData),
   ENTRY("__DATA", "__const",          S_REGULAR,          typeConstData),
   ENTRY("__DATA", "__cfstring",       S_REGULAR,          typeCFString),
diff --git a/test/mach-o/write-final-sections.yaml b/test/mach-o/write-final-sections.yaml
new file mode 100644
index 0000000..8182ff3
--- /dev/null
+++ b/test/mach-o/write-final-sections.yaml
@@ -0,0 +1,155 @@
+# RUN: lld -flavor darwin -arch x86_64 %s -o %t -e _foo
+# RUN: llvm-readobj -sections -section-data %t | FileCheck %s
+
+--- !native
+defined-atoms:
+# For __TEXT, __text (with typeCode)
+  - name:            _foo
+    scope:           global
+    content:         [ 55 ]
+# More for __TEXT, __text (with typeResolver)
+  - name:            _resolver
+    scope:           global
+    type:            resolver
+    content:         [ C3 ]
+# CHECK: Name: __text
+# CHECK: Segment: __TEXT
+# CHECK: SectionData (
+# CHECK-NEXT: 0000: 55C3
+# CHECK-NEXT: )
+
+#  For __TEXT, __const (with typeConstant),
+  - type:            constant
+    content:         [ 01, 00, 00, 00 ]
+#  From __TEXT, __literal4, (with typeLiteral4)
+  - scope:           hidden
+    type:            const-4-byte
+    content:         [ 02, 00, 00, 00 ]
+#  From __TEXT, __literal8, (with typeLiteral8)
+  - scope:           hidden
+    type:            const-8-byte
+    content:         [ 03, 00, 00, 00, 00, 00, 00, 00 ]
+#  From __TEXT, __literal16, (with typeLiteral16)
+  - scope:           hidden
+    type:            const-16-byte
+    content:         [ 04, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 ]
+# CHECK: Name: __const
+# CHECK: Segment: __TEXT
+# CHECK: SectionData (
+# CHECK-NEXT: 0000: 01000000 02000000 03000000 00000000
+# CHECK-NEXT: 0010: 04000000 00000000 00000000 00000000
+# CHECK-NEXT: )
+
+# For __TEXT, __cstring (with typeCString)
+  - scope:           hidden
+    type:            c-string
+    content:         [ 57, 69, 62, 62, 6C, 65, 00 ]
+    merge:           by-content
+# CHECK: Name: __cstring
+# CHECK: Segment: __TEXT
+# CHECK: SectionData (
+# CHECK-NEXT: 0000: 57696262 6C6500
+# CHECK-NEXT: )
+
+# For __TEXT, __ustring (with typeUTF16String)
+  - scope:           hidden
+    type:            utf16-string
+    content:         [ 05, 00 ]
+    merge:           by-content
+# CHECK: Name: __ustring
+# CHECK: Segment: __TEXT
+# CHECK: SectionData (
+# CHECK-NEXT: 0000: 0500
+# CHECK-NEXT: )
+
+#  For __TEXT, __gcc_except_tab, (with typeLSDA)
+  - name:            GCC_except_table0
+    type:            unwind-lsda
+    content:         [ 06, 00 ]
+# CHECK: Name: __gcc_except_tab
+# CHECK: Segment: __TEXT
+# CHECK: SectionData (
+# CHECK-NEXT: 0000: 0600
+# CHECK-NEXT: )
+
+#  For __TEXT, __unwind_info (with typeCompactUnwindInfo)
+  - type:            compact-unwind
+    content:         [ 0E, 00, 00, 00, 00, 00, 00, 00 ]
+# CHECK: Name: __unwind_info
+# CHECK: Segment: __TEXT
+# CHECK: SectionData (
+# CHECK-NEXT: 0000: 0E000000 00000000
+# CHECK-NEXT: )
+
+#  For __TEXT, __eh_frame, (with typeCFI)
+  - type:            unwind-cfi
+    content:         [ 07 ]
+# CHECK: Name: __eh_frame
+# CHECK: Segment: __TEXT
+# CHECK: SectionData (
+# CHECK-NEXT: 0000: 07
+# CHECK-NEXT: )
+
+#  For __DATA, __data, (with typeData)
+  - name:            var
+    type:            data
+    content:         [ 08 ]
+# CHECK: Name: __data
+# CHECK: Segment: __DATA
+# CHECK: SectionData (
+# CHECK-NEXT: 0000: 08
+# CHECK-NEXT: )
+
+#  For __DATA, ___bss (with typeZeroFill)
+# FIXME: Attributes & tags of __bss are mostly broken. Should be at end of
+#        __DATA, should have size, should have S_ZEROFILL flag.
+  - type:            zero-fill
+    size:            8
+# CHECK: Name: ___bss
+# CHECK: Segment: __DATA
+
+#  For __DATA, __const, (with typeConstData)
+  - type:            const-data
+    content:         [ 09, 00, 00, 00 ]
+# CHECK: Name: __const
+# CHECK: Segment: __DATA
+# CHECK: SectionData (
+# CHECK-NEXT: 0000: 09000000
+# CHECK-NEXT: )
+
+#  For __DATA, __cfstring, (with typeCFString)
+  - type:            cfstring
+    content:         [ 0A, 00 ]
+# CHECK: Name: __cfstring
+# CHECK: Segment: __DATA
+# CHECK: SectionData (
+# CHECK-NEXT: 0000: 0A00
+# CHECK-NEXT: )
+
+#  For __DATA, ___got (with typeGOT)
+  - type:            got
+    content:         [ 0B, 00, 00, 00, 00, 00, 00, 00 ]
+# CHECK: Name: ___got
+# CHECK: Segment: __DATA
+# CHECK: SectionData (
+# CHECK-NEXT: 0000: 0B000000 00000000
+# CHECK-NEXT: )
+
+
+#  For __DATA, __mod_init_func (with typeInitializerPtr)
+  - type:            initializer-pointer
+    content:         [ 0C, 00, 00, 00, 00, 00, 00, 00 ]
+# CHECK: Name: __mod_init_func
+# CHECK: Segment: __DATA
+# CHECK: SectionData (
+# CHECK-NEXT: 0000: 0C000000 00000000
+# CHECK-NEXT: )
+
+#  For __DATA, __mod_term_func (with typeTerminatorPointer)
+  - type:            terminator-pointer
+    content:         [ 0D, 00, 00, 00, 00, 00, 00, 00 ]
+# CHECK: Name: __mod_term_func
+# CHECK: Segment: __DATA
+# CHECK: SectionData (
+# CHECK-NEXT: 0000: 0D000000 00000000
+# CHECK-NEXT: )


More information about the llvm-commits mailing list