forked from OSchip/llvm-project
46 lines
1.6 KiB
ArmAsm
46 lines
1.6 KiB
ArmAsm
// REQUIRES: aarch64
|
|
// RUN: llvm-mc -filetype=obj -triple=aarch64-none-linux %s -o %t
|
|
// RUN: not ld.lld %t -o /dev/null 2>&1 | FileCheck %s
|
|
|
|
// Test derived from a typical ODR violation where a global is declared
|
|
// extern int but defined as a half or byte sized type.
|
|
.section .text
|
|
.globl _start
|
|
.type _start, %function
|
|
// Access foo2 as if it were an aligned 32-bit int, expect an error as
|
|
// foo is not aligned
|
|
|
|
_start:
|
|
ldrb w2, [x0, #:lo12:foo1] // Ok as no shift involved
|
|
ldrh w2, [x0, #:lo12:foo1] // Error foo1 is not 2-byte aligned
|
|
ldrh w2, [x0, #:lo12:foo2] // Ok as foo2 is 2-byte aligned
|
|
ldr w2, [x0, #:lo12:foo2] // Error foo2 is not 4-byte aligned
|
|
ldr w2, [x0, #:lo12:foo4] // Ok as foo4 is 4-byte aligned
|
|
ldr x3, [x0, #:lo12:foo4] // Error foo4 is not 8-byte aligned
|
|
ldr x3, [x0, #:lo12:foo8] // Ok as foo8 is 8-byte aligned
|
|
ldr q0, [x0, #:lo12:foo8] // Error foo8 is not 16-byte aligned
|
|
ldr q0, [x0, #:lo12:foo16] // Ok as foo16 is 16-byte aligned
|
|
|
|
.section .data.bool, "a", @nobits
|
|
.balign 16
|
|
.globl foo16
|
|
.globl foo1
|
|
.globl foo2
|
|
.globl foo4
|
|
.globl foo8
|
|
foo16:
|
|
.space 1
|
|
foo1:
|
|
.space 1
|
|
foo2:
|
|
.space 2
|
|
foo4:
|
|
.space 4
|
|
foo8:
|
|
.space 8
|
|
|
|
// CHECK: improper alignment for relocation R_AARCH64_LDST16_ABS_LO12_NC: 0x220181 is not aligned to 2 bytes
|
|
// CHECK-NEXT: improper alignment for relocation R_AARCH64_LDST32_ABS_LO12_NC: 0x220182 is not aligned to 4 bytes
|
|
// CHECK-NEXT: improper alignment for relocation R_AARCH64_LDST64_ABS_LO12_NC: 0x220184 is not aligned to 8 bytes
|
|
// CHECK-NEXT: improper alignment for relocation R_AARCH64_LDST128_ABS_LO12_NC: 0x220188 is not aligned to 16 bytes
|