// RUN: llvm-mc -arch=aarch64 -show-encoding < %s | FileCheck %s // RUN: llvm-mc -arch=aarch64 -filetype=obj < %s -o %t // RUN: elf-dump %t | FileCheck --check-prefix=CHECK-ELF %s // RUN: llvm-objdump -r %t | FileCheck --check-prefix=CHECK-ELF-NAMES %s // CHECK-ELF: .rela.text // TLS local-dynamic forms movz x1, #:dtprel_g2:var movn x2, #:dtprel_g2:var movz x3, #:dtprel_g2:var movn x4, #:dtprel_g2:var // CHECK: movz x1, #:dtprel_g2:var // encoding: [0x01'A',A,0xc0'A',0x92'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g2:var, kind: fixup_a64_movw_dtprel_g2 // CHECK-NEXT: movn x2, #:dtprel_g2:var // encoding: [0x02'A',A,0xc0'A',0x92'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g2:var, kind: fixup_a64_movw_dtprel_g2 // CHECK-NEXT: movz x3, #:dtprel_g2:var // encoding: [0x03'A',A,0xc0'A',0x92'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g2:var, kind: fixup_a64_movw_dtprel_g2 // CHECK-NEXT: movn x4, #:dtprel_g2:var // encoding: [0x04'A',A,0xc0'A',0x92'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g2:var, kind: fixup_a64_movw_dtprel_g2 // CHECK-ELF: # Relocation 0 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000000) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM:0x[0-9a-f]+]]) // CHECK-ELF-NEXT: ('r_type', 0x0000020b) // CHECK-ELF: # Relocation 1 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000004) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x0000020b) // CHECK-ELF: # Relocation 2 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000008) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x0000020b) // CHECK-ELF: # Relocation 3 // CHECK-ELF-NEXT: (('r_offset', 0x000000000000000c) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x0000020b) // CHECK-ELF-NAMES: 0 R_AARCH64_TLSLD_MOVW_DTPREL_G2 // CHECK-ELF-NAMES: 4 R_AARCH64_TLSLD_MOVW_DTPREL_G2 // CHECK-ELF-NAMES: 8 R_AARCH64_TLSLD_MOVW_DTPREL_G2 // CHECK-ELF-NAMES: 12 R_AARCH64_TLSLD_MOVW_DTPREL_G2 movz x5, #:dtprel_g1:var movn x6, #:dtprel_g1:var movz w7, #:dtprel_g1:var movn w8, #:dtprel_g1:var // CHECK: movz x5, #:dtprel_g1:var // encoding: [0x05'A',A,0xa0'A',0x92'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g1:var, kind: fixup_a64_movw_dtprel_g1 // CHECK-NEXT: movn x6, #:dtprel_g1:var // encoding: [0x06'A',A,0xa0'A',0x92'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g1:var, kind: fixup_a64_movw_dtprel_g1 // CHECK-NEXT: movz w7, #:dtprel_g1:var // encoding: [0x07'A',A,0xa0'A',0x12'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g1:var, kind: fixup_a64_movw_dtprel_g1 // CHECK-NEXT: movn w8, #:dtprel_g1:var // encoding: [0x08'A',A,0xa0'A',0x12'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g1:var, kind: fixup_a64_movw_dtprel_g1 // CHECK-ELF: # Relocation 4 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000010) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x0000020c) // CHECK-ELF: # Relocation 5 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000014) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x0000020c) // CHECK-ELF: # Relocation 6 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000018) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x0000020c) // CHECK-ELF: # Relocation 7 // CHECK-ELF-NEXT: (('r_offset', 0x000000000000001c) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x0000020c) // CHECK-ELF-NAMES: 16 R_AARCH64_TLSLD_MOVW_DTPREL_G1 // CHECK-ELF-NAMES: 20 R_AARCH64_TLSLD_MOVW_DTPREL_G1 // CHECK-ELF-NAMES: 24 R_AARCH64_TLSLD_MOVW_DTPREL_G1 // CHECK-ELF-NAMES: 28 R_AARCH64_TLSLD_MOVW_DTPREL_G1 movk x9, #:dtprel_g1_nc:var movk w10, #:dtprel_g1_nc:var // CHECK: movk x9, #:dtprel_g1_nc:var // encoding: [0x09'A',A,0xa0'A',0xf2'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g1_nc:var, kind: fixup_a64_movw_dtprel_g1_nc // CHECK-NEXT: movk w10, #:dtprel_g1_nc:var // encoding: [0x0a'A',A,0xa0'A',0x72'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g1_nc:var, kind: fixup_a64_movw_dtprel_g1_nc // CHECK-ELF: # Relocation 8 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000020) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x0000020d) // CHECK-ELF: # Relocation 9 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000024) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x0000020d) // CHECK-ELF-NAMES: 32 R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC // CHECK-ELF-NAMES: 36 R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC movz x11, #:dtprel_g0:var movn x12, #:dtprel_g0:var movz w13, #:dtprel_g0:var movn w14, #:dtprel_g0:var // CHECK: movz x11, #:dtprel_g0:var // encoding: [0x0b'A',A,0x80'A',0x92'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g0:var, kind: fixup_a64_movw_dtprel_g0 // CHECK-NEXT: movn x12, #:dtprel_g0:var // encoding: [0x0c'A',A,0x80'A',0x92'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g0:var, kind: fixup_a64_movw_dtprel_g0 // CHECK-NEXT: movz w13, #:dtprel_g0:var // encoding: [0x0d'A',A,0x80'A',0x12'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g0:var, kind: fixup_a64_movw_dtprel_g0 // CHECK-NEXT: movn w14, #:dtprel_g0:var // encoding: [0x0e'A',A,0x80'A',0x12'A'] // CHECK-ELF: # Relocation 10 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000028) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x0000020e) // CHECK-ELF: # Relocation 11 // CHECK-ELF-NEXT: (('r_offset', 0x000000000000002c) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x0000020e) // CHECK-ELF: # Relocation 12 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000030) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x0000020e) // CHECK-ELF: # Relocation 13 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000034) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x0000020e) // CHECK-ELF-NAMES: 40 R_AARCH64_TLSLD_MOVW_DTPREL_G0 // CHECK-ELF-NAMES: 44 R_AARCH64_TLSLD_MOVW_DTPREL_G0 // CHECK-ELF-NAMES: 48 R_AARCH64_TLSLD_MOVW_DTPREL_G0 // CHECK-ELF-NAMES: 52 R_AARCH64_TLSLD_MOVW_DTPREL_G0 movk x15, #:dtprel_g0_nc:var movk w16, #:dtprel_g0_nc:var // CHECK: movk x15, #:dtprel_g0_nc:var // encoding: [0x0f'A',A,0x80'A',0xf2'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g0_nc:var, kind: fixup_a64_movw_dtprel_g0_nc // CHECK-NEXT: movk w16, #:dtprel_g0_nc:var // encoding: [0x10'A',A,0x80'A',0x72'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_g0_nc:var, kind: fixup_a64_movw_dtprel_g0_nc // CHECK-ELF: # Relocation 14 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000038) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x0000020f) // CHECK-ELF: # Relocation 15 // CHECK-ELF-NEXT: (('r_offset', 0x000000000000003c) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x0000020f) // CHECK-ELF-NAMES: 56 R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC // CHECK-ELF-NAMES: 60 R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC add x17, x18, #:dtprel_hi12:var, lsl #12 add w19, w20, #:dtprel_hi12:var, lsl #12 // CHECK: add x17, x18, #:dtprel_hi12:var, lsl #12 // encoding: [0x51'A',0x02'A',0x40'A',0x91'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_hi12:var, kind: fixup_a64_add_dtprel_hi12 // CHECK-NEXT: add w19, w20, #:dtprel_hi12:var, lsl #12 // encoding: [0x93'A',0x02'A',0x40'A',0x11'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_hi12:var, kind: fixup_a64_add_dtprel_hi12 // CHECK-ELF: # Relocation 16 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000040) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000210) // CHECK-ELF: # Relocation 17 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000044) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000210) // CHECK-ELF-NAMES: 64 R_AARCH64_TLSLD_ADD_DTPREL_HI12 // CHECK-ELF-NAMES: 68 R_AARCH64_TLSLD_ADD_DTPREL_HI12 add x21, x22, #:dtprel_lo12:var add w23, w24, #:dtprel_lo12:var // CHECK: add x21, x22, #:dtprel_lo12:var // encoding: [0xd5'A',0x02'A',A,0x91'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_lo12:var, kind: fixup_a64_add_dtprel_lo12 // CHECK-NEXT: add w23, w24, #:dtprel_lo12:var // encoding: [0x17'A',0x03'A',A,0x11'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_lo12:var, kind: fixup_a64_add_dtprel_lo12 // CHECK-ELF: # Relocation 18 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000048) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000211) // CHECK-ELF: # Relocation 19 // CHECK-ELF-NEXT: (('r_offset', 0x000000000000004c) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000211) // CHECK-ELF-NAMES: 72 R_AARCH64_TLSLD_ADD_DTPREL_LO12 // CHECK-ELF-NAMES: 76 R_AARCH64_TLSLD_ADD_DTPREL_LO12 add x25, x26, #:dtprel_lo12_nc:var add w27, w28, #:dtprel_lo12_nc:var // CHECK: add x25, x26, #:dtprel_lo12_nc:var // encoding: [0x59'A',0x03'A',A,0x91'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_lo12_nc:var, kind: fixup_a64_add_dtprel_lo12_nc // CHECK-NEXT: add w27, w28, #:dtprel_lo12_nc:var // encoding: [0x9b'A',0x03'A',A,0x11'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_lo12_nc:var, kind: fixup_a64_add_dtprel_lo12_nc // CHECK-ELF: # Relocation 20 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000050) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000212) // CHECK-ELF: # Relocation 21 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000054) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000212) // CHECK-ELF-NAMES: 80 R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC // CHECK-ELF-NAMES: 84 R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC ldrb w29, [x30, #:dtprel_lo12:var] ldrsb x29, [x28, #:dtprel_lo12_nc:var] // CHECK: ldrb w29, [x30, #:dtprel_lo12:var] // encoding: [0xdd'A',0x03'A',0x40'A',0x39'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_lo12:var, kind: fixup_a64_ldst8_dtprel_lo12 // CHECK-NEXT: ldrsb x29, [x28, #:dtprel_lo12_nc:var] // encoding: [0x9d'A',0x03'A',0x80'A',0x39'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_lo12_nc:var, kind: fixup_a64_ldst8_dtprel_lo12_nc // CHECK-ELF: # Relocation 22 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000058) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000213) // CHECK-ELF: # Relocation 23 // CHECK-ELF-NEXT: (('r_offset', 0x000000000000005c) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000214) // CHECK-ELF-NAMES: 88 R_AARCH64_TLSLD_LDST8_DTPREL_LO12 // CHECK-ELF-NAMES: 92 R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC strh w27, [x26, #:dtprel_lo12:var] ldrsh x25, [x24, #:dtprel_lo12_nc:var] // CHECK: strh w27, [x26, #:dtprel_lo12:var] // encoding: [0x5b'A',0x03'A',A,0x79'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_lo12:var, kind: fixup_a64_ldst16_dtprel_lo12 // CHECK-NEXT: ldrsh x25, [x24, #:dtprel_lo12_nc:var] // encoding: [0x19'A',0x03'A',0x80'A',0x79'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_lo12_nc:var, kind: fixup_a64_ldst16_dtprel_lo12_n // CHECK-ELF: # Relocation 24 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000060) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000215) // CHECK-ELF: # Relocation 25 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000064) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000216) // CHECK-ELF-NAMES: 96 R_AARCH64_TLSLD_LDST16_DTPREL_LO12 // CHECK-ELF-NAMES: 100 R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC ldr w23, [x22, #:dtprel_lo12:var] ldrsw x21, [x20, #:dtprel_lo12_nc:var] // CHECK: ldr w23, [x22, #:dtprel_lo12:var] // encoding: [0xd7'A',0x02'A',0x40'A',0xb9'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_lo12:var, kind: fixup_a64_ldst32_dtprel_lo12 // CHECK-NEXT: ldrsw x21, [x20, #:dtprel_lo12_nc:var] // encoding: [0x95'A',0x02'A',0x80'A',0xb9'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_lo12_nc:var, kind: fixup_a64_ldst32_dtprel_lo12_n // CHECK-ELF: # Relocation 26 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000068) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000217) // CHECK-ELF: # Relocation 27 // CHECK-ELF-NEXT: (('r_offset', 0x000000000000006c) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000218) // CHECK-ELF-NAMES: 104 R_AARCH64_TLSLD_LDST32_DTPREL_LO12 // CHECK-ELF-NAMES: 108 R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC ldr x19, [x18, #:dtprel_lo12:var] str x17, [x16, #:dtprel_lo12_nc:var] // CHECK: ldr x19, [x18, #:dtprel_lo12:var] // encoding: [0x53'A',0x02'A',0x40'A',0xf9'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_lo12:var, kind: fixup_a64_ldst64_dtprel_lo12 // CHECK-NEXT: str x17, [x16, #:dtprel_lo12_nc:var] // encoding: [0x11'A',0x02'A',A,0xf9'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :dtprel_lo12_nc:var, kind: fixup_a64_ldst64_dtprel_lo12_nc // CHECK-ELF: # Relocation 28 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000070) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000219) // CHECK-ELF: # Relocation 29 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000074) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x0000021a) // CHECK-ELF-NAMES: 112 R_AARCH64_TLSLD_LDST64_DTPREL_LO12 // CHECK-ELF-NAMES: 116 R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC // TLS initial-exec forms movz x15, #:gottprel_g1:var movz w14, #:gottprel_g1:var // CHECK: movz x15, #:gottprel_g1:var // encoding: [0x0f'A',A,0xa0'A',0x92'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :gottprel_g1:var, kind: fixup_a64_movw_gottprel_g1 // CHECK-NEXT: movz w14, #:gottprel_g1:var // encoding: [0x0e'A',A,0xa0'A',0x12'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :gottprel_g1:var, kind: fixup_a64_movw_gottprel_g1 // CHECK-ELF: # Relocation 30 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000078) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x0000021b) // CHECK-ELF: # Relocation 31 // CHECK-ELF-NEXT: (('r_offset', 0x000000000000007c) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x0000021b) // CHECK-ELF-NAMES: 120 R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 // CHECK-ELF-NAMES: 124 R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 movk x13, #:gottprel_g0_nc:var movk w12, #:gottprel_g0_nc:var // CHECK: movk x13, #:gottprel_g0_nc:var // encoding: [0x0d'A',A,0x80'A',0xf2'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :gottprel_g0_nc:var, kind: fixup_a64_movw_gottprel_g0_nc // CHECK-NEXT: movk w12, #:gottprel_g0_nc:var // encoding: [0x0c'A',A,0x80'A',0x72'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :gottprel_g0_nc:var, kind: fixup_a64_movw_gottprel_g0_nc // CHECK-ELF: # Relocation 32 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000080) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x0000021c) // CHECK-ELF: # Relocation 33 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000084) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x0000021c) // CHECK-ELF-NAMES: 128 R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC // CHECK-ELF-NAMES: 132 R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC adrp x11, :gottprel:var ldr x10, [x0, #:gottprel_lo12:var] ldr x9, :gottprel:var // CHECK: adrp x11, :gottprel:var // encoding: [0x0b'A',A,A,0x90'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :gottprel:var, kind: fixup_a64_adr_gottprel_page // CHECK-NEXT: ldr x10, [x0, #:gottprel_lo12:var] // encoding: [0x0a'A',A,0x40'A',0xf9'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :gottprel_lo12:var, kind: fixup_a64_ld64_gottprel_lo12_nc // CHECK-NEXT: ldr x9, :gottprel:var // encoding: [0x09'A',A,A,0x58'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :gottprel:var, kind: fixup_a64_ld_gottprel_prel19 // CHECK-ELF: # Relocation 34 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000088) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x0000021d) // CHECK-ELF: # Relocation 35 // CHECK-ELF-NEXT: (('r_offset', 0x000000000000008c) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x0000021e) // CHECK-ELF: # Relocation 36 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000090) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x0000021f) // CHECK-ELF-NAMES: 136 R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE // CHECK-ELF-NAMES: 140 R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC // CHECK-ELF-NAMES: 144 R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 // TLS local-exec forms movz x3, #:tprel_g2:var movn x4, #:tprel_g2:var // CHECK: movz x3, #:tprel_g2:var // encoding: [0x03'A',A,0xc0'A',0x92'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tprel_g2:var, kind: fixup_a64_movw_tprel_g2 // CHECK-NEXT: movn x4, #:tprel_g2:var // encoding: [0x04'A',A,0xc0'A',0x92'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tprel_g2:var, kind: fixup_a64_movw_tprel_g2 // CHECK-ELF: # Relocation 37 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000094) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000220) // CHECK-ELF: # Relocation 38 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000098) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000220) // CHECK-ELF-NAMES: 148 R_AARCH64_TLSLE_MOVW_TPREL_G2 // CHECK-ELF-NAMES: 152 R_AARCH64_TLSLE_MOVW_TPREL_G2 movz x5, #:tprel_g1:var movn x6, #:tprel_g1:var movz w7, #:tprel_g1:var movn w8, #:tprel_g1:var // CHECK: movz x5, #:tprel_g1:var // encoding: [0x05'A',A,0xa0'A',0x92'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tprel_g1:var, kind: fixup_a64_movw_tprel_g1 // CHECK-NEXT: movn x6, #:tprel_g1:var // encoding: [0x06'A',A,0xa0'A',0x92'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tprel_g1:var, kind: fixup_a64_movw_tprel_g1 // CHECK-NEXT: movz w7, #:tprel_g1:var // encoding: [0x07'A',A,0xa0'A',0x12'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tprel_g1:var, kind: fixup_a64_movw_tprel_g1 // CHECK-NEXT: movn w8, #:tprel_g1:var // encoding: [0x08'A',A,0xa0'A',0x12'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tprel_g1:var, kind: fixup_a64_movw_tprel_g1 // CHECK-ELF: # Relocation 39 // CHECK-ELF-NEXT: (('r_offset', 0x000000000000009c) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000221) // CHECK-ELF: # Relocation 40 // CHECK-ELF-NEXT: (('r_offset', 0x00000000000000a0) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000221) // CHECK-ELF: # Relocation 41 // CHECK-ELF-NEXT: (('r_offset', 0x00000000000000a4) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000221) // CHECK-ELF: # Relocation 42 // CHECK-ELF-NEXT: (('r_offset', 0x00000000000000a8) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000221) // CHECK-ELF-NAMES: 156 R_AARCH64_TLSLE_MOVW_TPREL_G1 // CHECK-ELF-NAMES: 160 R_AARCH64_TLSLE_MOVW_TPREL_G1 // CHECK-ELF-NAMES: 164 R_AARCH64_TLSLE_MOVW_TPREL_G1 // CHECK-ELF-NAMES: 168 R_AARCH64_TLSLE_MOVW_TPREL_G1 movk x9, #:tprel_g1_nc:var movk w10, #:tprel_g1_nc:var // CHECK: movk x9, #:tprel_g1_nc:var // encoding: [0x09'A',A,0xa0'A',0xf2'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tprel_g1_nc:var, kind: fixup_a64_movw_tprel_g1_nc // CHECK-NEXT: movk w10, #:tprel_g1_nc:var // encoding: [0x0a'A',A,0xa0'A',0x72'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tprel_g1_nc:var, kind: fixup_a64_movw_tprel_g1_nc // CHECK-ELF: # Relocation 43 // CHECK-ELF-NEXT: (('r_offset', 0x00000000000000ac) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000222) // CHECK-ELF: # Relocation 44 // CHECK-ELF-NEXT: (('r_offset', 0x00000000000000b0) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000222) // CHECK-ELF-NAMES: 172 R_AARCH64_TLSLE_MOVW_TPREL_G1_NC // CHECK-ELF-NAMES: 176 R_AARCH64_TLSLE_MOVW_TPREL_G1_NC movz x11, #:tprel_g0:var movn x12, #:tprel_g0:var movz w13, #:tprel_g0:var movn w14, #:tprel_g0:var // CHECK: movz x11, #:tprel_g0:var // encoding: [0x0b'A',A,0x80'A',0x92'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tprel_g0:var, kind: fixup_a64_movw_tprel_g0 // CHECK-NEXT: movn x12, #:tprel_g0:var // encoding: [0x0c'A',A,0x80'A',0x92'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tprel_g0:var, kind: fixup_a64_movw_tprel_g0 // CHECK-NEXT: movz w13, #:tprel_g0:var // encoding: [0x0d'A',A,0x80'A',0x12'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tprel_g0:var, kind: fixup_a64_movw_tprel_g0 // CHECK-NEXT: movn w14, #:tprel_g0:var // encoding: [0x0e'A',A,0x80'A',0x12'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tprel_g0:var, kind: fixup_a64_movw_tprel_g0 // CHECK-ELF: # Relocation 45 // CHECK-ELF-NEXT: (('r_offset', 0x00000000000000b4) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000223) // CHECK-ELF: # Relocation 46 // CHECK-ELF-NEXT: (('r_offset', 0x00000000000000b8) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000223) // CHECK-ELF: # Relocation 47 // CHECK-ELF-NEXT: (('r_offset', 0x00000000000000bc) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000223) // CHECK-ELF: # Relocation 48 // CHECK-ELF-NEXT: (('r_offset', 0x00000000000000c0) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000223) // CHECK-ELF-NAMES: 180 R_AARCH64_TLSLE_MOVW_TPREL_G0 // CHECK-ELF-NAMES: 184 R_AARCH64_TLSLE_MOVW_TPREL_G0 // CHECK-ELF-NAMES: 188 R_AARCH64_TLSLE_MOVW_TPREL_G0 // CHECK-ELF-NAMES: 192 R_AARCH64_TLSLE_MOVW_TPREL_G0 movk x15, #:tprel_g0_nc:var movk w16, #:tprel_g0_nc:var // CHECK: movk x15, #:tprel_g0_nc:var // encoding: [0x0f'A',A,0x80'A',0xf2'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tprel_g0_nc:var, kind: fixup_a64_movw_tprel_g0_nc // CHECK-NEXT: movk w16, #:tprel_g0_nc:var // encoding: [0x10'A',A,0x80'A',0x72'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tprel_g0_nc:var, kind: fixup_a64_movw_tprel_g0_nc // CHECK-ELF: # Relocation 49 // CHECK-ELF-NEXT: (('r_offset', 0x00000000000000c4) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000224) // CHECK-ELF: # Relocation 50 // CHECK-ELF-NEXT: (('r_offset', 0x00000000000000c8) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000224) // CHECK-ELF-NAMES: 196 R_AARCH64_TLSLE_MOVW_TPREL_G0_NC // CHECK-ELF-NAMES: 200 R_AARCH64_TLSLE_MOVW_TPREL_G0_NC add x17, x18, #:tprel_hi12:var, lsl #12 add w19, w20, #:tprel_hi12:var, lsl #12 // CHECK: add x17, x18, #:tprel_hi12:var, lsl #12 // encoding: [0x51'A',0x02'A',0x40'A',0x91'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tprel_hi12:var, kind: fixup_a64_add_tprel_hi12 // CHECK-NEXT: add w19, w20, #:tprel_hi12:var, lsl #12 // encoding: [0x93'A',0x02'A',0x40'A',0x11'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tprel_hi12:var, kind: fixup_a64_add_tprel_hi12 // CHECK-ELF: # Relocation 51 // CHECK-ELF-NEXT: (('r_offset', 0x00000000000000cc) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000225) // CHECK-ELF: # Relocation 52 // CHECK-ELF-NEXT: (('r_offset', 0x00000000000000d0) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000225) // CHECK-ELF-NAMES: 204 R_AARCH64_TLSLE_ADD_TPREL_HI12 // CHECK-ELF-NAMES: 208 R_AARCH64_TLSLE_ADD_TPREL_HI12 add x21, x22, #:tprel_lo12:var add w23, w24, #:tprel_lo12:var // CHECK: add x21, x22, #:tprel_lo12:var // encoding: [0xd5'A',0x02'A',A,0x91'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tprel_lo12:var, kind: fixup_a64_add_tprel_lo12 // CHECK-NEXT: add w23, w24, #:tprel_lo12:var // encoding: [0x17'A',0x03'A',A,0x11'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tprel_lo12:var, kind: fixup_a64_add_tprel_lo12 // CHECK-ELF: # Relocation 53 // CHECK-ELF-NEXT: (('r_offset', 0x00000000000000d4) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000226) // CHECK-ELF: # Relocation 54 // CHECK-ELF-NEXT: (('r_offset', 0x00000000000000d8) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000226) // CHECK-ELF-NAMES: 212 R_AARCH64_TLSLE_ADD_TPREL_LO12 // CHECK-ELF-NAMES: 216 R_AARCH64_TLSLE_ADD_TPREL_LO12 add x25, x26, #:tprel_lo12_nc:var add w27, w28, #:tprel_lo12_nc:var // CHECK: add x25, x26, #:tprel_lo12_nc:var // encoding: [0x59'A',0x03'A',A,0x91'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tprel_lo12_nc:var, kind: fixup_a64_add_tprel_lo12_nc // CHECK-NEXT: add w27, w28, #:tprel_lo12_nc:var // encoding: [0x9b'A',0x03'A',A,0x11'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tprel_lo12_nc:var, kind: fixup_a64_add_tprel_lo12_nc // CHECK-ELF: # Relocation 55 // CHECK-ELF-NEXT: (('r_offset', 0x00000000000000dc) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000227) // CHECK-ELF: # Relocation 56 // CHECK-ELF-NEXT: (('r_offset', 0x00000000000000e0) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000227) // CHECK-ELF-NAMES: 220 R_AARCH64_TLSLE_ADD_TPREL_LO12_NC // CHECK-ELF-NAMES: 224 R_AARCH64_TLSLE_ADD_TPREL_LO12_NC ldrb w29, [x30, #:tprel_lo12:var] ldrsb x29, [x28, #:tprel_lo12_nc:var] // CHECK: ldrb w29, [x30, #:tprel_lo12:var] // encoding: [0xdd'A',0x03'A',0x40'A',0x39'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tprel_lo12:var, kind: fixup_a64_ldst8_tprel_lo12 // CHECK-NEXT: ldrsb x29, [x28, #:tprel_lo12_nc:var] // encoding: [0x9d'A',0x03'A',0x80'A',0x39'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tprel_lo12_nc:var, kind: fixup_a64_ldst8_tprel_lo12_nc // CHECK-ELF: # Relocation 57 // CHECK-ELF-NEXT: (('r_offset', 0x00000000000000e4) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000228) // CHECK-ELF: # Relocation 58 // CHECK-ELF-NEXT: (('r_offset', 0x00000000000000e8) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000229) // CHECK-ELF-NAMES: 228 R_AARCH64_TLSLE_LDST8_TPREL_LO12 // CHECK-ELF-NAMES: 232 R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC strh w27, [x26, #:tprel_lo12:var] ldrsh x25, [x24, #:tprel_lo12_nc:var] // CHECK: strh w27, [x26, #:tprel_lo12:var] // encoding: [0x5b'A',0x03'A',A,0x79'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tprel_lo12:var, kind: fixup_a64_ldst16_tprel_lo12 // CHECK-NEXT: ldrsh x25, [x24, #:tprel_lo12_nc:var] // encoding: [0x19'A',0x03'A',0x80'A',0x79'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tprel_lo12_nc:var, kind: fixup_a64_ldst16_tprel_lo12_n // CHECK-ELF: # Relocation 59 // CHECK-ELF-NEXT: (('r_offset', 0x00000000000000ec) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x0000022a) // CHECK-ELF: # Relocation 60 // CHECK-ELF-NEXT: (('r_offset', 0x00000000000000f0) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x0000022b) // CHECK-ELF-NAMES: 236 R_AARCH64_TLSLE_LDST16_TPREL_LO12 // CHECK-ELF-NAMES: 240 R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC ldr w23, [x22, #:tprel_lo12:var] ldrsw x21, [x20, #:tprel_lo12_nc:var] // CHECK: ldr w23, [x22, #:tprel_lo12:var] // encoding: [0xd7'A',0x02'A',0x40'A',0xb9'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tprel_lo12:var, kind: fixup_a64_ldst32_tprel_lo12 // CHECK-NEXT: ldrsw x21, [x20, #:tprel_lo12_nc:var] // encoding: [0x95'A',0x02'A',0x80'A',0xb9'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tprel_lo12_nc:var, kind: fixup_a64_ldst32_tprel_lo12_n // CHECK-ELF: # Relocation 61 // CHECK-ELF-NEXT: (('r_offset', 0x00000000000000f4) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x0000022c) // CHECK-ELF: # Relocation 62 // CHECK-ELF-NEXT: (('r_offset', 0x00000000000000f8) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x0000022d) // CHECK-ELF-NAMES: 244 R_AARCH64_TLSLE_LDST32_TPREL_LO12 // CHECK-ELF-NAMES: 248 R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC ldr x19, [x18, #:tprel_lo12:var] str x17, [x16, #:tprel_lo12_nc:var] // CHECK: ldr x19, [x18, #:tprel_lo12:var] // encoding: [0x53'A',0x02'A',0x40'A',0xf9'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tprel_lo12:var, kind: fixup_a64_ldst64_tprel_lo12 // CHECK-NEXT: str x17, [x16, #:tprel_lo12_nc:var] // encoding: [0x11'A',0x02'A',A,0xf9'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tprel_lo12_nc:var, kind: fixup_a64_ldst64_tprel_lo12_nc // CHECK-ELF: # Relocation 63 // CHECK-ELF-NEXT: (('r_offset', 0x00000000000000fc) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x0000022e) // CHECK-ELF: # Relocation 64 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000100) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x0000022f) // CHECK-ELF-NAMES: 252 R_AARCH64_TLSLE_LDST64_TPREL_LO12 // CHECK-ELF-NAMES: 256 R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC // TLS descriptor forms adrp x8, :tlsdesc:var ldr x7, [x6, :tlsdesc_lo12:var] add x5, x4, #:tlsdesc_lo12:var .tlsdesccall var blr x3 // CHECK: adrp x8, :tlsdesc:var // encoding: [0x08'A',A,A,0x90'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tlsdesc:var, kind: fixup_a64_tlsdesc_adr_page // CHECK-NEXT: ldr x7, [x6, #:tlsdesc_lo12:var] // encoding: [0xc7'A',A,0x40'A',0xf9'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tlsdesc_lo12:var, kind: fixup_a64_tlsdesc_ld64_lo12_nc // CHECK-NEXT: add x5, x4, #:tlsdesc_lo12:var // encoding: [0x85'A',A,A,0x91'A'] // CHECK-NEXT: // fixup A - offset: 0, value: :tlsdesc_lo12:var, kind: fixup_a64_tlsdesc_add_lo12_nc // CHECK-NEXT: .tlsdesccall var // encoding: [] // CHECK-NEXT: // fixup A - offset: 0, value: :tlsdesc:var, kind: fixup_a64_tlsdesc_call // CHECK: blr x3 // encoding: [0x60,0x00,0x3f,0xd6] // CHECK-ELF: # Relocation 65 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000104) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000232) // CHECK-ELF: # Relocation 66 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000108) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000233) // CHECK-ELF: # Relocation 67 // CHECK-ELF-NEXT: (('r_offset', 0x000000000000010c) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000234) // CHECK-ELF: # Relocation 68 // CHECK-ELF-NEXT: (('r_offset', 0x0000000000000110) // CHECK-ELF-NEXT: ('r_sym', [[VARSYM]]) // CHECK-ELF-NEXT: ('r_type', 0x00000239) // CHECK-ELF-NAMES: 260 R_AARCH64_TLSDESC_ADR_PAGE // CHECK-ELF-NAMES: 264 R_AARCH64_TLSDESC_LD64_LO12_NC // CHECK-ELF-NAMES: 268 R_AARCH64_TLSDESC_ADD_LO12_NC // CHECK-ELF-NAMES: 272 R_AARCH64_TLSDESC_CALL // Make sure symbol 5 has type STT_TLS: // CHECK-ELF: # Symbol 5 // CHECK-ELF-NEXT: (('st_name', 0x00000006) # 'var' // CHECK-ELF-NEXT: ('st_bind', 0x1) // CHECK-ELF-NEXT: ('st_type', 0x6)