mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-01 21:16:06 +00:00

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
117 lines
1.9 KiB
NASM
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
|