; RUN: llvm-ml -m64 -filetype=s %s /Fo - | FileCheck %s .data x1 DWORD ? x2 DWORD ? xa1 DWORD ? .code SubstitutionMacro macro a1:req, a2:=<7> mov eax, a1 mov eax, a1& mov eax, &a1 mov eax, &a1& mov eax, xa1 mov eax, x&a1 mov eax, x&a1& mov eax, a2 mov eax, a2& mov eax, &a2 mov eax, &a2& endm substitution_test_with_default PROC ; CHECK-LABEL: substitution_test_with_default: SubstitutionMacro 1 ; CHECK: mov eax, 1 ; CHECK-NEXT: mov eax, 1 ; CHECK-NEXT: mov eax, 1 ; CHECK-NEXT: mov eax, 1 ; CHECK: mov eax, dword ptr [rip + xa1] ; CHECK-NEXT: mov eax, dword ptr [rip + x1] ; CHECK-NEXT: mov eax, dword ptr [rip + x1] ; CHECK: mov eax, 7 ; CHECK-NEXT: mov eax, 7 ; CHECK-NEXT: mov eax, 7 ; CHECK-NEXT: mov eax, 7 ret substitution_test_with_default ENDP substitution_test_with_value PROC ; CHECK-LABEL: substitution_test_with_value: SubstitutionMacro 2, 8 ; CHECK: mov eax, 2 ; CHECK-NEXT: mov eax, 2 ; CHECK-NEXT: mov eax, 2 ; CHECK-NEXT: mov eax, 2 ; CHECK: mov eax, dword ptr [rip + xa1] ; CHECK-NEXT: mov eax, dword ptr [rip + x2] ; CHECK-NEXT: mov eax, dword ptr [rip + x2] ; CHECK: mov eax, 8 ; CHECK-NEXT: mov eax, 8 ; CHECK-NEXT: mov eax, 8 ; CHECK-NEXT: mov eax, 8 ret substitution_test_with_value ENDP substitution_test_lowercase PROC ; CHECK-LABEL: substitution_test_lowercase: substitutionmacro 2, 8 ; CHECK: mov eax, 2 ; CHECK-NEXT: mov eax, 2 ; CHECK-NEXT: mov eax, 2 ; CHECK-NEXT: mov eax, 2 ; CHECK: mov eax, dword ptr [rip + xa1] ; CHECK-NEXT: mov eax, dword ptr [rip + x2] ; CHECK-NEXT: mov eax, dword ptr [rip + x2] ; CHECK: mov eax, 8 ; CHECK-NEXT: mov eax, 8 ; CHECK-NEXT: mov eax, 8 ; CHECK-NEXT: mov eax, 8 ret substitution_test_lowercase ENDP substitution_test_uppercase PROC ; CHECK-LABEL: substitution_test_uppercase: SUBSTITUTIONMACRO 2, 8 ; CHECK: mov eax, 2 ; CHECK-NEXT: mov eax, 2 ; CHECK-NEXT: mov eax, 2 ; CHECK-NEXT: mov eax, 2 ; CHECK: mov eax, dword ptr [rip + xa1] ; CHECK-NEXT: mov eax, dword ptr [rip + x2] ; CHECK-NEXT: mov eax, dword ptr [rip + x2] ; CHECK: mov eax, 8 ; CHECK-NEXT: mov eax, 8 ; CHECK-NEXT: mov eax, 8 ; CHECK-NEXT: mov eax, 8 ret substitution_test_uppercase ENDP AmbiguousSubstitutionMacro MACRO x, y x&y BYTE 0 ENDM ambiguous_substitution_test PROC ; CHECK-LABEL: ambiguous_substitution_test: ; should expand to ab BYTE 0 AmbiguousSubstitutionMacro a, b ; CHECK: ab: ; CHECK-NOT: ay: ; CHECK-NOT: xb: ; CHECK-NOT: xy: ambiguous_substitution_test ENDP AmbiguousSubstitutionInStringMacro MACRO x, y BYTE "x&y" ENDM ambiguous_substitution_in_string_test PROC ; CHECK-LABEL: ambiguous_substitution_in_string_test: ; should expand to BYTE "5y" AmbiguousSubstitutionInStringMacro 5, 7 ; CHECK: .byte 53 ; CHECK-NEXT: .byte 121 ; CHECK-NOT: .byte ambiguous_substitution_in_string_test ENDP OptionalParameterMacro MACRO a1:req, a2 mov eax, a1 IFNB <a2> mov eax, a2 ENDIF ret ENDM optional_parameter_test PROC ; CHECK-LABEL: optional_parameter_test: OptionalParameterMacro 4 ; CHECK: mov eax, 4 ; CHECK: ret OptionalParameterMacro 5, 9 ; CHECK: mov eax, 5 ; CHECK: mov eax, 9 ; CHECK: ret optional_parameter_test ENDP LocalSymbolMacro MACRO LOCAL a a: ret jmp a ENDM local_symbol_test PROC ; CHECK-LABEL: local_symbol_test: LocalSymbolMacro ; CHECK: "??0000": ; CHECK-NEXT: ret ; CHECK-NEXT: jmp "??0000" LocalSymbolMacro ; CHECK: "??0001": ; CHECK-NEXT: ret ; CHECK-NEXT: jmp "??0001" local_symbol_test ENDP PURGE AmbiguousSubstitutionMacro, LocalSymbolMacro, OptionalParameterMacro ; Redefinition LocalSymbolMacro MACRO LOCAL b b: xor eax, eax jmp b ENDM purge_test PROC ; CHECK-LABEL: purge_test: LocalSymbolMacro ; CHECK: "??0002": ; CHECK-NEXT: xor eax, eax ; CHECK-NEXT: jmp "??0002" purge_test ENDP END