From f317d66c315e09da0481843256be83512ba114b8 Mon Sep 17 00:00:00 2001 From: Nick Kledzik Date: Thu, 29 May 2014 23:50:48 +0000 Subject: [PATCH] [mach-0] Add support for parsing compact unwind info section llvm-svn: 209865 --- .../MachO/MachONormalizedFileFromAtoms.cpp | 3 + .../MachO/MachONormalizedFileToAtoms.cpp | 25 +++++++ lld/test/mach-o/parse-compact-unwind32.yaml | 72 ++++++++++++++++++++ lld/test/mach-o/parse-compact-unwind64.yaml | 76 ++++++++++++++++++++++ 4 files changed, 176 insertions(+) create mode 100644 lld/test/mach-o/parse-compact-unwind32.yaml create mode 100644 lld/test/mach-o/parse-compact-unwind64.yaml diff --git a/lld/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp b/lld/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp index 00aabc2..4797a14 100644 --- a/lld/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp +++ b/lld/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp @@ -203,6 +203,9 @@ SectionInfo *Util::makeSection(DefinedAtom::ContentType type) { 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; diff --git a/lld/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp b/lld/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp index 569f32f..60f2ffb 100644 --- a/lld/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp +++ b/lld/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp @@ -229,6 +229,27 @@ static error_code processCFISection(MachOFile &file, const Section §ion, return error_code::success(); } +static error_code +processCompactUnwindSection(MachOFile &file, const Section §ion, + 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 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 §ion, bool is64, bool swap, bool copyRefs, SymbolsInSection &symbolsInSect) { @@ -244,6 +265,10 @@ static error_code processSection(MachOFile &file, const Section §ion, 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: diff --git a/lld/test/mach-o/parse-compact-unwind32.yaml b/lld/test/mach-o/parse-compact-unwind32.yaml new file mode 100644 index 0000000..2b9a6a1 --- /dev/null +++ b/lld/test/mach-o/parse-compact-unwind32.yaml @@ -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 ] + diff --git a/lld/test/mach-o/parse-compact-unwind64.yaml b/lld/test/mach-o/parse-compact-unwind64.yaml new file mode 100644 index 0000000..b61961a --- /dev/null +++ b/lld/test/mach-o/parse-compact-unwind64.yaml @@ -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 ] -- 2.7.4