# REQUIRES: aarch64 # RUN: rm -rf %t; split-file %s %t # RUN: llvm-mc -filetype=obj -triple=arm64-apple-darwin19.0.0 %t/main.s -o %t/main.o # RUN: llvm-mc -filetype=obj -triple=arm64-apple-darwin19.0.0 %t/f2.s -o %t/f2.o # RUN: %lld -arch arm64 -lSystem --icf=all -o %t/main %t/main.o %t/f2.o # RUN: llvm-objdump -d --syms --print-imm-hex %t/main | FileCheck %s # CHECK-LABEL: SYMBOL TABLE: # CHECK: [[#%x,F1_REF:]] g F __TEXT,__text _f1 # CHECK: [[#%x,F1_REF:]] g F __TEXT,__text _f2 # CHECK-LABEL: Disassembly of section __TEXT,__text: # CHECK: <_main>: # CHECK: bl 0x[[#%x,F1_REF:]] # CHECK: bl 0x[[#%x,F1_REF:]] #--- main.s .subsections_via_symbols .literal16 .p2align 3 L_align16: .quad 0xffffffffffffffff .short 0xaaaa .short 0xaaaa .space 4, 0xaa .literal8 .p2align 3 L_align8: .quad 0xeeeeeeeeeeeeeeee .literal4 .p2align 2 L_align4: .short 0xbbbb .short 0xbbbb .text .p2align 2 .globl _main, _f1, _f2 ## Test that loading from __literalN sections at non-literal boundaries ## doesn't confuse ICF. This function should be folded with the identical ## _f2 in f2 (which uses literals of the same value in a different isec). _f1: adrp x9, L_align16@PAGE + 4 add x9, x9, L_align16@PAGEOFF + 4 ldr x10, [x9] adrp x9, L_align8@PAGE + 4 add x9, x9, L_align8@PAGEOFF + 4 ldr w11, [x9] adrp x9, L_align4@PAGE + 2 add x9, x9, L_align4@PAGEOFF + 2 ldrh w12, [x9] ret _main: bl _f1 bl _f2 #--- f2.s .subsections_via_symbols .literal16 .p2align 3 L_align16: .quad 0xffffffffffffffff .short 0xaaaa .short 0xaaaa .space 4, 170 .literal8 .p2align 3 L_align8: .quad 0xeeeeeeeeeeeeeeee .literal4 .p2align 2 L_align4: .short 0xbbbb .short 0xbbbb .text .p2align 2 .globl _f2 _f2: adrp x9, L_align16@PAGE + 4 add x9, x9, L_align16@PAGEOFF + 4 ldr x10, [x9] adrp x9, L_align8@PAGE + 4 add x9, x9, L_align8@PAGEOFF + 4 ldr w11, [x9] adrp x9, L_align4@PAGE + 2 add x9, x9, L_align4@PAGEOFF + 2 ldrh w12, [x9] ret