1; RUN: llvm-ml -m64 -filetype=s %s /Fo - | FileCheck %s 2 3.data 4 5x1 DWORD ? 6x2 DWORD ? 7xa1 DWORD ? 8 9.code 10 11SubstitutionMacro macro a1:req, a2:=<7> 12 mov eax, a1 13 mov eax, a1& 14 mov eax, &a1 15 mov eax, &a1& 16 17 mov eax, xa1 18 mov eax, x&a1 19 mov eax, x&a1& 20 21 mov eax, a2 22 mov eax, a2& 23 mov eax, &a2 24 mov eax, &a2& 25endm 26 27substitution_test_with_default PROC 28; CHECK-LABEL: substitution_test_with_default: 29 30 SubstitutionMacro 1 31; CHECK: mov eax, 1 32; CHECK-NEXT: mov eax, 1 33; CHECK-NEXT: mov eax, 1 34; CHECK-NEXT: mov eax, 1 35; CHECK: mov eax, dword ptr [rip + xa1] 36; CHECK-NEXT: mov eax, dword ptr [rip + x1] 37; CHECK-NEXT: mov eax, dword ptr [rip + x1] 38; CHECK: mov eax, 7 39; CHECK-NEXT: mov eax, 7 40; CHECK-NEXT: mov eax, 7 41; CHECK-NEXT: mov eax, 7 42 43 ret 44substitution_test_with_default ENDP 45 46substitution_test_with_value PROC 47; CHECK-LABEL: substitution_test_with_value: 48 49 SubstitutionMacro 2, 8 50; CHECK: mov eax, 2 51; CHECK-NEXT: mov eax, 2 52; CHECK-NEXT: mov eax, 2 53; CHECK-NEXT: mov eax, 2 54; CHECK: mov eax, dword ptr [rip + xa1] 55; CHECK-NEXT: mov eax, dword ptr [rip + x2] 56; CHECK-NEXT: mov eax, dword ptr [rip + x2] 57; CHECK: mov eax, 8 58; CHECK-NEXT: mov eax, 8 59; CHECK-NEXT: mov eax, 8 60; CHECK-NEXT: mov eax, 8 61 62 ret 63substitution_test_with_value ENDP 64 65substitution_test_lowercase PROC 66; CHECK-LABEL: substitution_test_lowercase: 67 68 substitutionmacro 2, 8 69; CHECK: mov eax, 2 70; CHECK-NEXT: mov eax, 2 71; CHECK-NEXT: mov eax, 2 72; CHECK-NEXT: mov eax, 2 73; CHECK: mov eax, dword ptr [rip + xa1] 74; CHECK-NEXT: mov eax, dword ptr [rip + x2] 75; CHECK-NEXT: mov eax, dword ptr [rip + x2] 76; CHECK: mov eax, 8 77; CHECK-NEXT: mov eax, 8 78; CHECK-NEXT: mov eax, 8 79; CHECK-NEXT: mov eax, 8 80 81 ret 82substitution_test_lowercase ENDP 83 84substitution_test_uppercase PROC 85; CHECK-LABEL: substitution_test_uppercase: 86 87 SUBSTITUTIONMACRO 2, 8 88; CHECK: mov eax, 2 89; CHECK-NEXT: mov eax, 2 90; CHECK-NEXT: mov eax, 2 91; CHECK-NEXT: mov eax, 2 92; CHECK: mov eax, dword ptr [rip + xa1] 93; CHECK-NEXT: mov eax, dword ptr [rip + x2] 94; CHECK-NEXT: mov eax, dword ptr [rip + x2] 95; CHECK: mov eax, 8 96; CHECK-NEXT: mov eax, 8 97; CHECK-NEXT: mov eax, 8 98; CHECK-NEXT: mov eax, 8 99 100 ret 101substitution_test_uppercase ENDP 102 103AmbiguousSubstitutionMacro MACRO x, y 104 x&y BYTE 0 105ENDM 106 107ambiguous_substitution_test PROC 108; CHECK-LABEL: ambiguous_substitution_test: 109 110; should expand to ab BYTE 0 111 AmbiguousSubstitutionMacro a, b 112 113; CHECK: ab: 114; CHECK-NOT: ay: 115; CHECK-NOT: xb: 116; CHECK-NOT: xy: 117ambiguous_substitution_test ENDP 118 119AmbiguousSubstitutionInStringMacro MACRO x, y 120 BYTE "x&y" 121ENDM 122 123ambiguous_substitution_in_string_test PROC 124; CHECK-LABEL: ambiguous_substitution_in_string_test: 125 126; should expand to BYTE "5y" 127 AmbiguousSubstitutionInStringMacro 5, 7 128 129; CHECK: .byte 53 130; CHECK-NEXT: .byte 121 131; CHECK-NOT: .byte 132ambiguous_substitution_in_string_test ENDP 133 134OptionalParameterMacro MACRO a1:req, a2 135 mov eax, a1 136IFNB <a2> 137 mov eax, a2 138ENDIF 139 ret 140ENDM 141 142optional_parameter_test PROC 143; CHECK-LABEL: optional_parameter_test: 144 145 OptionalParameterMacro 4 146; CHECK: mov eax, 4 147; CHECK: ret 148 149 OptionalParameterMacro 5, 9 150; CHECK: mov eax, 5 151; CHECK: mov eax, 9 152; CHECK: ret 153optional_parameter_test ENDP 154 155LocalSymbolMacro MACRO 156 LOCAL a 157a: ret 158 jmp a 159ENDM 160 161local_symbol_test PROC 162; CHECK-LABEL: local_symbol_test: 163 164 LocalSymbolMacro 165; CHECK: "??0000": 166; CHECK-NEXT: ret 167; CHECK-NEXT: jmp "??0000" 168 169 LocalSymbolMacro 170; CHECK: "??0001": 171; CHECK-NEXT: ret 172; CHECK-NEXT: jmp "??0001" 173local_symbol_test ENDP 174 175PURGE AmbiguousSubstitutionMacro, LocalSymbolMacro, 176 OptionalParameterMacro 177 178; Redefinition 179LocalSymbolMacro MACRO 180 LOCAL b 181b: xor eax, eax 182 jmp b 183ENDM 184 185purge_test PROC 186; CHECK-LABEL: purge_test: 187 188 LocalSymbolMacro 189; CHECK: "??0002": 190; CHECK-NEXT: xor eax, eax 191; CHECK-NEXT: jmp "??0002" 192purge_test ENDP 193 194END 195