Index: lib/ReaderWriter/MachO/ArchHandler_arm64.cpp =================================================================== --- lib/ReaderWriter/MachO/ArchHandler_arm64.cpp +++ lib/ReaderWriter/MachO/ArchHandler_arm64.cpp @@ -50,6 +50,9 @@ case gotOffset12: canBypassGOT = true; return true; + case delta32ToGOT: + canBypassGOT = false; + return true; case imageOffsetGot: canBypassGOT = false; return true; @@ -74,6 +77,9 @@ const_cast(ref)->setKindValue(targetNowGOT ? offset12scale8 : addOffset12); break; + case delta32ToGOT: + const_cast(ref)->setKindValue(delta32); + break; case imageOffsetGot: const_cast(ref)->setKindValue(imageOffset); break; Index: test/mach-o/gcc_except_tab-got-arm64.yaml =================================================================== --- /dev/null +++ test/mach-o/gcc_except_tab-got-arm64.yaml @@ -0,0 +1,60 @@ +# RUN: lld -flavor darwin -arch arm64 %s \ +# RUN: -dylib %p/Inputs/libSystem.yaml -o %t +# RUN: llvm-objdump -section-headers %t | FileCheck %s +# +# Test parsing and writing of arm64 data relocations. +# +# The first step tests if the supplied mach-o file is parsed into the correct +# set of references. The second step verifies relocations can be round-tripped +# by writing to a new .o file, then parsing that file which should result in +# the same references. +# +#_test: + + +--- !native +defined-atoms: + - name: _main + scope: global + content: [ FD, 7B, BF, A9, FD, 03, 00, 91, FF, 43, 00, D1, + BF, C3, 1F, B8, 00, 00, 00, 94, BF, 03, 00, 91, + FD, 7B, C1, A8, C0, 03, 5F, D6 ] + alignment: 4 + - name: __ZTSP1A + scope: hidden + type: constant + content: [ 50, 31, 41, 00 ] + merge: as-weak + - name: GCC_except_table0 + type: unwind-lsda + content: [ FF, 9B, E7, 80, 00, 03, 5B, 00, 00, 00, 00, 1C, + 00, 00, 00, 00, 00, 00, 00, 00, 1C, 00, 00, 00, + 18, 00, 00, 00, 84, 00, 00, 00, 03, 40, 00, 00, + 00, 10, 00, 00, 00, 94, 00, 00, 00, 03, 60, 00, + 00, 00, 20, 00, 00, 00, B4, 00, 00, 00, 05, 80, + 00, 00, 00, 68, 00, 00, 00, 00, 00, 00, 00, 00, + E8, 00, 00, 00, 08, 00, 00, 00, 28, 01, 00, 00, + 00, F0, 00, 00, 00, 74, 00, 00, 00, 00, 00, 00, + 00, 00, 00, 00, 01, 7D, 01, 00, A8, FF, FF, FF ] + alignment: 4 + references: + - kind: delta32ToGOT + offset: 104 + target: __ZTIP1A + - name: __ZTIP1A + scope: hidden + type: data + content: [ 10, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, + 00, 00, 00, 80, 00, 00, 00, 00, 00, 00, 00, 00, + 00, 00, 00, 00, 00, 00, 00, 00 ] + merge: as-weak + alignment: 16 +shared-library-atoms: + - name: dyld_stub_binder + load-name: /usr/lib/libSystem.B.dylib + type: unknown +... + +# Make sure we have a GOT relocation. +# This could only have come from __gcc_except_tab to __ZTIP1A +# CHECK: __got \ No newline at end of file Index: test/mach-o/unwind-info-simple-arm64.yaml =================================================================== --- test/mach-o/unwind-info-simple-arm64.yaml +++ test/mach-o/unwind-info-simple-arm64.yaml @@ -250,7 +250,7 @@ # CHECK: Number of indices in array: 0x2 # CHECK: Common encodings: (count = 0) # CHECK: Personality functions: (count = 1) -# CHECK: personality[1]: 0x00004018 +# CHECK: personality[1]: 0x00004020 # CHECK: Top level indices: (count = 2) # CHECK: [0]: function offset=0x00003e68, 2nd level page offset=0x00000040, LSDA offset=0x00000038 # CHECK: [1]: function offset=0x00003edc, 2nd level page offset=0x00000000, LSDA offset=0x00000040