[lld] r209865 - [mach-0] Add support for parsing compact unwind info section

Nick Kledzik kledzik at apple.com
Thu May 29 16:50:48 PDT 2014


Author: kledzik
Date: Thu May 29 18:50:48 2014
New Revision: 209865

URL: http://llvm.org/viewvc/llvm-project?rev=209865&view=rev
Log:
[mach-0] Add support for parsing compact unwind info section

Added:
    lld/trunk/test/mach-o/parse-compact-unwind32.yaml
    lld/trunk/test/mach-o/parse-compact-unwind64.yaml
Modified:
    lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp
    lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp

Modified: lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp?rev=209865&r1=209864&r2=209865&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp Thu May 29 18:50:48 2014
@@ -203,6 +203,9 @@ SectionInfo *Util::makeSection(DefinedAt
   case DefinedAtom::typeCFI:
      return new (_allocator) SectionInfo("__TEXT", "__eh_frame",
                             S_COALESCED);
+  case DefinedAtom::typeCompactUnwindInfo:
+     return new (_allocator) SectionInfo("__LD", "__compact_unwind",
+                            S_REGULAR);
   default:
     llvm_unreachable("TO DO: add support for more sections");
     break;

Modified: lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp?rev=209865&r1=209864&r2=209865&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp Thu May 29 18:50:48 2014
@@ -229,6 +229,27 @@ static error_code processCFISection(Mach
   return error_code::success();
 }
 
+static error_code 
+processCompactUnwindSection(MachOFile &file, const Section &section,
+                            bool is64, bool copyRefs) {
+  const uint32_t cuObjSize = (is64 ? 32 : 20);
+  if ((section.content.size() % cuObjSize) != 0) {
+    return make_dynamic_error_code(Twine("Section __LD/__compact_unwind has a "
+                                   "size (" + Twine(section.content.size())
+                                   + ") that is not a multiple of "
+                                   + Twine(cuObjSize)));
+  }
+  unsigned offset = 0;
+  for (size_t i = 0, e = section.content.size(); i != e; i += cuObjSize) {
+    ArrayRef<uint8_t> byteContent = section.content.slice(offset, cuObjSize);
+    file.addDefinedAtom(StringRef(), DefinedAtom::scopeTranslationUnit,
+                        DefinedAtom::typeCompactUnwindInfo,
+                        DefinedAtom::mergeNo, byteContent, copyRefs);
+    offset += cuObjSize;
+  }
+  return error_code::success();
+}
+
 static error_code processSection(MachOFile &file, const Section &section,
                                  bool is64, bool swap, bool copyRefs,
                                  SymbolsInSection &symbolsInSect) {
@@ -244,6 +265,10 @@ static error_code processSection(MachOFi
              section.sectionName.equals("__cfstring")) {
       symbolsInSect = symbolsIllegal;
       return processCFStringSection(file, section, is64, copyRefs);
+    } else if (section.segmentName.equals("__LD") &&
+             section.sectionName.equals("__compact_unwind")) {
+      symbolsInSect = symbolsIllegal;
+      return processCompactUnwindSection(file, section, is64, copyRefs);
     }
     break;
   case llvm::MachO::S_COALESCED:

Added: lld/trunk/test/mach-o/parse-compact-unwind32.yaml
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/mach-o/parse-compact-unwind32.yaml?rev=209865&view=auto
==============================================================================
--- lld/trunk/test/mach-o/parse-compact-unwind32.yaml (added)
+++ lld/trunk/test/mach-o/parse-compact-unwind32.yaml Thu May 29 18:50:48 2014
@@ -0,0 +1,72 @@
+# RUN: lld -flavor darwin -arch i386 -r -print_atoms %s -o %t  | FileCheck %s
+#
+# Test parsing of __LD/__compact_unwind (compact unwind) section.
+#
+
+--- !mach-o
+arch:            x86
+file-type:       MH_OBJECT
+flags:           [ MH_SUBSECTIONS_VIA_SYMBOLS ]
+has-UUID:        false
+OS:              unknown
+sections:
+  - segment:         __TEXT
+    section:         __text
+    type:            S_REGULAR
+    attributes:      [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
+    alignment:       4
+    address:         0x0000000000000000
+    content:         [ 0x55, 0x89, 0xE5, 0xB8, 0x0A, 0x00, 0x00, 0x00,
+                       0x5D, 0xC3, 0x55, 0x89, 0xE5, 0xB8, 0x0A, 0x00,
+                       0x00, 0x00, 0x5D, 0xC3 ]
+  - segment:         __LD
+    section:         __compact_unwind
+    type:            S_REGULAR
+    attributes:      [  ]
+    alignment:       2
+    address:         0x000000000000001C
+    content:         [ 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00,
+                       0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+                       0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+                       0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+                       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ]
+    relocations:
+      - offset:          0x00000014
+        type:            GENERIC_RELOC_VANILLA
+        length:          2
+        pc-rel:          false
+        extern:          false
+        symbol:          1
+      - offset:          0x00000000
+        type:            GENERIC_RELOC_VANILLA
+        length:          2
+        pc-rel:          false
+        extern:          false
+        symbol:          1
+global-symbols:
+  - name:            __Z3barv
+    type:            N_SECT
+    scope:           [ N_EXT ]
+    sect:            1
+    value:           0x000000000000000A
+  - name:            __Z3foov
+    type:            N_SECT
+    scope:           [ N_EXT ]
+    sect:            1
+    value:           0x0000000000000000
+...
+
+# CHECK: defined-atoms:
+# CHECK:   - type:            compact-unwind
+# CHECK:     content:         [ 00, 00, 00, 00, 0A, 00, 00, 00, 00, 00, 00, 01,
+# CHECK:                        00, 00, 00, 00, 00, 00, 00, 00 ]
+# CHECK:   - type:            compact-unwind
+# CHECK:     content:         [ 10, 00, 00, 00, 0A, 00, 00, 00, 00, 00, 00, 01,
+# CHECK:                        00, 00, 00, 00, 00, 00, 00, 00 ]
+# CHECK:   - name:            __Z3barv
+# CHECK:     scope:           global
+# CHECK:     content:         [ 55, 89, E5, B8, 0A, 00, 00, 00, 5D, C3 ]
+# CHECK:   - name:            __Z3foov
+# CHECK:     scope:           global
+# CHECK:     content:         [ 55, 89, E5, B8, 0A, 00, 00, 00, 5D, C3 ]
+

Added: lld/trunk/test/mach-o/parse-compact-unwind64.yaml
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/mach-o/parse-compact-unwind64.yaml?rev=209865&view=auto
==============================================================================
--- lld/trunk/test/mach-o/parse-compact-unwind64.yaml (added)
+++ lld/trunk/test/mach-o/parse-compact-unwind64.yaml Thu May 29 18:50:48 2014
@@ -0,0 +1,76 @@
+# RUN: lld -flavor darwin -arch x86_64 -r -print_atoms %s -o %t  | FileCheck %s
+#
+# Test parsing of __LD/__compact_unwind (compact unwind) section.
+#
+
+--- !mach-o
+arch:            x86_64
+file-type:       MH_OBJECT
+flags:           [ MH_SUBSECTIONS_VIA_SYMBOLS ]
+has-UUID:        false
+OS:              unknown
+sections:
+  - segment:         __TEXT
+    section:         __text
+    type:            S_REGULAR
+    attributes:      [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
+    alignment:       4
+    address:         0x0000000000000000
+    content:         [ 0x55, 0x48, 0x89, 0xE5, 0xB8, 0x0A, 0x00, 0x00,
+                       0x00, 0x5D, 0xC3, 0x55, 0x48, 0x89, 0xE5, 0xB8,
+                       0x0A, 0x00, 0x00, 0x00, 0x5D, 0xC3 ]
+  - segment:         __LD
+    section:         __compact_unwind
+    type:            S_REGULAR
+    attributes:      [  ]
+    alignment:       3
+    address:         0x0000000000000020
+    content:         [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                       0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+                       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                       0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                       0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+                       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ]
+    relocations:
+      - offset:          0x00000020
+        type:            X86_64_RELOC_UNSIGNED
+        length:          3
+        pc-rel:          false
+        extern:          false
+        symbol:          1
+      - offset:          0x00000000
+        type:            X86_64_RELOC_UNSIGNED
+        length:          3
+        pc-rel:          false
+        extern:          false
+        symbol:          1
+global-symbols:
+  - name:            __Z3barv
+    type:            N_SECT
+    scope:           [ N_EXT ]
+    sect:            1
+    value:           0x0000000000000000
+  - name:            __Z3foov
+    type:            N_SECT
+    scope:           [ N_EXT ]
+    sect:            1
+    value:           0x000000000000000B
+...
+
+# CHECK: defined-atoms:
+# CHECK:   - type:            compact-unwind
+# CHECK:     content:         [ 00, 00, 00, 00, 00, 00, 00, 00, 0B, 00, 00, 00,
+# CHECK:                        00, 00, 00, 01, 00, 00, 00, 00, 00, 00, 00, 00,
+# CHECK:                        00, 00, 00, 00, 00, 00, 00, 00 ]
+# CHECK:   - type:            compact-unwind
+# CHECK:     content:         [ 10, 00, 00, 00, 00, 00, 00, 00, 0B, 00, 00, 00,
+# CHECK:                        00, 00, 00, 01, 00, 00, 00, 00, 00, 00, 00, 00,
+# CHECK:                        00, 00, 00, 00, 00, 00, 00, 00 ]
+# CHECK:   - name:            __Z3barv
+# CHECK:     scope:           global
+# CHECK:     content:         [ 55, 48, 89, E5, B8, 0A, 00, 00, 00, 5D, C3 ]
+# CHECK:   - name:            __Z3foov
+# CHECK:     scope:           global
+# CHECK:     content:         [ 55, 48, 89, E5, B8, 0A, 00, 00, 00, 5D, C3 ]





More information about the llvm-commits mailing list