264 lines · plain
1# REQUIRES: aarch642 3# RUN: rm -rf %t; split-file %s %t4# RUN: llvm-mc -filetype=obj -triple=arm64-apple-darwin %t/lib.s -o %t/lib.o5# RUN: %lld -arch arm64 -dylib -o %t/lib.dylib %t/lib.o6# RUN: llvm-mc -filetype=obj -triple=arm64-apple-darwin %t/external.s -o %t/near-got.o7# RUN: llvm-mc -filetype=obj -triple=arm64-apple-darwin %t/external.s -defsym=PADDING=1 -o %t/far-got.o8# RUN: llvm-mc -filetype=obj -triple=arm64-apple-darwin %t/local.s -o %t/local.o9# RUN: %lld -arch arm64 %t/near-got.o %t/lib.dylib -o %t/NearGot10# RUN: %lld -arch arm64 %t/far-got.o %t/lib.dylib -o %t/FarGot11# RUN: %lld -arch arm64 %t/local.o -o %t/Local12# RUN: llvm-objdump --no-print-imm-hex -d --macho %t/NearGot | FileCheck %s -check-prefix=NEAR-GOT13# RUN: llvm-objdump --no-print-imm-hex -d --macho %t/FarGot | FileCheck %s -check-prefix=FAR-GOT14# RUN: llvm-objdump --no-print-imm-hex -d --macho %t/Local | FileCheck %s -check-prefix=LOCAL15 16#--- external.s17.text18.align 219.globl _main20_main:21 22## Basic test23L1: adrp x0, _external@GOTPAGE24L2: ldr x1, [x0, _external@GOTPAGEOFF]25L3: ldr x2, [x1]26# NEAR-GOT-LABEL: _main:27# NEAR-GOT-NEXT: nop28# NEAR-GOT-NEXT: ldr x1, #{{.*}} ; literal pool symbol address: _external29# NEAR-GOT-NEXT: ldr x2, [x1]30# FAR-GOT-LABEL: _main:31# FAR-GOT-NEXT: adrp x032# FAR-GOT-NEXT: ldr x133# FAR-GOT-NEXT: ldr x2, [x1]34 35## The second load has an offset36L4: adrp x0, _external@GOTPAGE37L5: ldr x1, [x0, _external@GOTPAGEOFF]38L6: ldr q2, [x1, #16]39# NEAR-GOT-NEXT: nop40# NEAR-GOT-NEXT: ldr x1, #{{.*}} ; literal pool symbol address: _external41# NEAR-GOT-NEXT: ldr q2, [x1, #16]42# FAR-GOT-NEXT: adrp x043# FAR-GOT-NEXT: ldr x144# FAR-GOT-NEXT: ldr q2, [x1, #16]45 46### Tests for invalid inputs47.ifndef PADDING48## Registers don't match49L7: adrp x0, _external@GOTPAGE50L8: ldr x1, [x1, _external@GOTPAGEOFF]51L9: ldr x2, [x1]52# NEAR-GOT-NEXT: adrp x053# NEAR-GOT-NEXT: ldr x154# NEAR-GOT-NEXT: ldr x2, [x1]55 56## Registers don't match57L10: adrp x0, _external@GOTPAGE58L11: ldr x1, [x0, _external@GOTPAGEOFF]59L12: ldr x2, [x0]60# NEAR-GOT-NEXT: adrp x061# NEAR-GOT-NEXT: ldr x162# NEAR-GOT-NEXT: ldr x2, [x0]63 64## Not an LDR (immediate)65L13: adrp x0, _external@GOTPAGE66L14: ldr x1, 067L15: ldr x2, [x1]68# NEAR-GOT-NEXT: adrp x069# NEAR-GOT-NEXT: ldr x170# NEAR-GOT-NEXT: ldr x2, [x1]71 72.loh AdrpLdrGotLdr L7, L8, L973.loh AdrpLdrGotLdr L10, L11, L1274.loh AdrpLdrGotLdr L13, L14, L1575.endif76 77.loh AdrpLdrGotLdr L1, L2, L378.loh AdrpLdrGotLdr L4, L5, L679 80.ifdef PADDING81.space 104857682.endif83.data84 85 86#--- lib.s87.data88.align 489.globl _external90_external:91 .zero 3292 93#--- local.s94.text95.align 296.globl _main97_main:98 99### Transformation to a literal LDR100## Basic case101L1: adrp x0, _close@GOTPAGE102L2: ldr x1, [x0, _close@GOTPAGEOFF]103L3: ldr x2, [x1]104# LOCAL-LABEL: _main:105# LOCAL-NEXT: nop106# LOCAL-NEXT: nop107# LOCAL-NEXT: ldr x2108 109## Load with offset110L4: adrp x0, _close@GOTPAGE111L5: ldr x1, [x0, _close@GOTPAGEOFF]112L6: ldr x2, [x1, #8]113# LOCAL-NEXT: nop114# LOCAL-NEXT: nop115# LOCAL-NEXT: ldr x2116 117## 32 bit load118L7: adrp x0, _close@GOTPAGE119L8: ldr x1, [x0, _close@GOTPAGEOFF]120L9: ldr w1, [x1]121# LOCAL-NEXT: nop122# LOCAL-NEXT: nop123# LOCAL-NEXT: ldr w1, _close124 125## Floating point126L10: adrp x0, _close@GOTPAGE127L11: ldr x1, [x0, _close@GOTPAGEOFF]128L12: ldr s1, [x1]129# LOCAL-NEXT: nop130# LOCAL-NEXT: nop131# LOCAL-NEXT: ldr s1, _close132 133L13: adrp x0, _close@GOTPAGE134L14: ldr x1, [x0, _close@GOTPAGEOFF]135L15: ldr d1, [x1, #8]136# LOCAL-NEXT: nop137# LOCAL-NEXT: nop138# LOCAL-NEXT: ldr d1, _close8139 140L16: adrp x0, _close@GOTPAGE141L17: ldr x1, [x0, _close@GOTPAGEOFF]142L18: ldr q0, [x1]143# LOCAL-NEXT: nop144# LOCAL-NEXT: nop145# LOCAL-NEXT: ldr q0, _close146 147 148### Transformation to ADR+LDR149## 1 byte floating point load150L19: adrp x0, _close@GOTPAGE151L20: ldr x1, [x0, _close@GOTPAGEOFF]152L21: ldr b2, [x1]153# LOCAL-NEXT: adr x1154# LOCAL-NEXT: nop155# LOCAL-NEXT: ldr b2, [x1]156 157## 1 byte GPR load, zero extend158L22: adrp x0, _close@GOTPAGE159L23: ldr x1, [x0, _close@GOTPAGEOFF]160L24: ldrb w2, [x1]161# LOCAL-NEXT: adr x1162# LOCAL-NEXT: nop163# LOCAL-NEXT: ldrb w2, [x1]164 165## 1 byte GPR load, sign extend166L25: adrp x0, _close@GOTPAGE167L26: ldr x1, [x0, _close@GOTPAGEOFF]168L27: ldrsb x2, [x1]169# LOCAL-NEXT: adr x1170# LOCAL-NEXT: nop171# LOCAL-NEXT: ldrsb x2, [x1]172 173## Unaligned174L28: adrp x0, _unaligned@GOTPAGE175L29: ldr x1, [x0, _unaligned@GOTPAGEOFF]176L30: ldr x2, [x1]177# LOCAL-NEXT: adr x1178# LOCAL-NEXT: nop179# LOCAL-NEXT: ldr x2, [x1]180 181 182### Transformation to ADRP + immediate LDR183## Basic test: target is far184L31: adrp x0, _far@GOTPAGE185L32: ldr x1, [x0, _far@GOTPAGEOFF]186L33: ldr x2, [x1]187# LOCAL-NEXT: adrp x0188# LOCAL-NEXT: nop189# LOCAL-NEXT: ldr x2190 191## With offset192L34: adrp x0, _far@GOTPAGE193L35: ldr x1, [x0, _far@GOTPAGEOFF]194L36: ldr x2, [x1, #8]195# LOCAL-NEXT: adrp x0196# LOCAL-NEXT: nop197# LOCAL-NEXT: ldr x2198 199### No changes other than GOT relaxation200## Far and unaligned201L37: adrp x0, _far_unaligned@GOTPAGE202L38: ldr x1, [x0, _far_unaligned@GOTPAGEOFF]203L39: ldr x2, [x1]204# LOCAL-NEXT: adrp x0205# LOCAL-NEXT: add x1, x0206# LOCAL-NEXT: ldr x2, [x1]207 208## Far with large offset (_far_offset@GOTPAGEOFF + #255 > 4095)209L40: adrp x0, _far_offset@GOTPAGE210L41: ldr x1, [x0, _far_offset@GOTPAGEOFF]211L42: ldrb w2, [x1, #255]212# LOCAL-NEXT: adrp x0213# LOCAL-NEXT: add x1, x0214# LOCAL-NEXT: ldrb w2, [x1, #255]215 216### Tests for invalid inputs, only GOT relaxation should happen217## Registers don't match218L43: adrp x0, _far@GOTPAGE219L44: ldr x1, [x0, _far@GOTPAGEOFF]220L45: ldr x2, [x2]221# LOCAL-NEXT: adrp x0222# LOCAL-NEXT: add x1, x0223# LOCAL-NEXT: ldr x2, [x2]224 225.data226.align 4227 .quad 0228_close:229 .quad 0230_close8:231 .quad 0232 .byte 0233_unaligned:234 .quad 0235 236.space 1048576237.align 12238 .quad 0239_far:240 .quad 0241 .byte 0242_far_unaligned:243 .quad 0244.space 4000245_far_offset:246 .byte 0247 248 249.loh AdrpLdrGotLdr L1, L2, L3250.loh AdrpLdrGotLdr L4, L5, L6251.loh AdrpLdrGotLdr L7, L8, L9252.loh AdrpLdrGotLdr L10, L11, L12253.loh AdrpLdrGotLdr L13, L14, L15254.loh AdrpLdrGotLdr L16, L17, L18255.loh AdrpLdrGotLdr L19, L20, L21256.loh AdrpLdrGotLdr L22, L23, L24257.loh AdrpLdrGotLdr L25, L26, L27258.loh AdrpLdrGotLdr L28, L29, L30259.loh AdrpLdrGotLdr L31, L32, L33260.loh AdrpLdrGotLdr L34, L35, L36261.loh AdrpLdrGotLdr L37, L38, L39262.loh AdrpLdrGotLdr L40, L41, L42263.loh AdrpLdrGotLdr L43, L44, L45264