llvm-project/llvm/test/tools/llvm-ml/align_directives.asm
Eric Astor c8d0d8a8a1 [ms] [llvm-ml] Add support for ALIGN, EVEN, and ORG directives
Match ML.EXE's behavior for ALIGN, EVEN, and ORG directives both at file level and in STRUCTs.

We currently reject negative offsets passed to ORG inside STRUCTs (in ML.EXE and ML64.EXE, they wrap around as for an unsigned 32-bit integer).

Also, if a STRUCT is declared using an ORG directive, no value of that type can be defined.

Reviewed By: thakis

Differential Revision: https://reviews.llvm.org/D92507
2021-06-25 17:19:45 -04:00

117 lines
1.9 KiB
NASM

; RUN: llvm-ml -filetype=s %s /Fo - | FileCheck %s
.data
align_test:
ALIGN 16
; CHECK-LABEL: align_test:
; CHECK-NEXT: .p2align 4
org_test:
ORG 256
; CHECK-LABEL: org_test:
; CHECK-NEXT: .org 256, 0
align_struct STRUCT
BYTE ?
ALIGN 4
x BYTE ?
x_succ BYTE ?
BYTE ?
ALIGN 2
y BYTE ?
y_succ BYTE ?
ALIGN 1
z BYTE ?
EVEN
q BYTE ?
align_struct ENDS
struct_align_data ALIGN_STRUCT <101, 102, 103, 104, 105, 106, 107, 108>
; CHECK-LABEL: struct_align_data:
; CHECK-NEXT: .byte 101
; CHECK-NEXT: .zero 3
; CHECK-NEXT: .byte 102
; CHECK-NEXT: .byte 103
; CHECK-NEXT: .byte 104
; CHECK-NEXT: .zero 1
; CHECK-NEXT: .byte 105
; CHECK-NEXT: .byte 106
; CHECK-NEXT: .byte 107
; CHECK-NEXT: .zero 1
; CHECK-NEXT: .byte 108
org_struct STRUCT
x BYTE ?
x_succ BYTE ?
ORG 15
y BYTE ?
y_succ BYTE ?
ORG 2
z BYTE ?
z_succ BYTE ?
org_struct ENDS
.code
struct_align_test PROC
x_align_test:
MOV eax, align_struct.x
MOV eax, align_struct.x_succ
; CHECK-LABEL: x_align_test:
; CHECK-NEXT: mov eax, 4
; CHECK-NEXT: mov eax, 5
y_align_test:
MOV eax, align_struct.y
MOV eax, align_struct.y_succ
; CHECK-LABEL: y_align_test:
; CHECK-NEXT: mov eax, 8
; CHECK-NEXT: mov eax, 9
z_align_test:
MOV eax, align_struct.z
; CHECK-LABEL: z_align_test:
; CHECK-NEXT: mov eax, 10
q_even_test:
MOV eax, align_struct.q
; CHECK-LABEL: q_even_test:
; CHECK-NEXT: mov eax, 12
size_align_test:
MOV eax, SIZEOF(align_struct)
; CHECK-LABEL: size_align_test:
; CHECK-NEXT: mov eax, 13
ret
struct_align_test ENDP
struct_org_test PROC
; CHECK-LABEL: struct_org_test:
field_positions:
MOV eax, org_struct.x
MOV eax, org_struct.x_succ
MOV eax, org_struct.y
MOV eax, org_struct.y_succ
MOV eax, org_struct.z
MOV eax, org_struct.z_succ
; CHECK-LABEL: field_positions:
; CHECK-NEXT: mov eax, 0
; CHECK-NEXT: mov eax, 1
; CHECK-NEXT: mov eax, 15
; CHECK-NEXT: mov eax, 16
; CHECK-NEXT: mov eax, 2
; CHECK-NEXT: mov eax, 3
ret
struct_org_test ENDP
end