| OLD | NEW |
| 1 ; Tests the Subzero "name mangling" when using the "llvm2ice --prefix" | 1 ; Tests the Subzero "name mangling" when using the "llvm2ice --prefix" |
| 2 ; option. | 2 ; option. Also does a quick smoke test of -ffunction-sections. |
| 3 | 3 |
| 4 ; RUN: %llvm2ice --verbose none %s | FileCheck %s | 4 ; RUN: %llvm2ice --verbose none -ffunction-sections %s | FileCheck %s |
| 5 ; TODO: The following line causes this test to fail. | 5 ; TODO: The following line causes this test to fail. |
| 6 ; RUIN: %llvm2ice --verbose none %s \ | 6 ; RUIN: %llvm2ice --verbose none %s \ |
| 7 ; RUIN: | llvm-mc -arch=x86 -x86-asm-syntax=intel -filetype=obj | 7 ; RUIN: | llvm-mc -arch=x86 -x86-asm-syntax=intel -filetype=obj |
| 8 ; RUN: %llvm2ice --verbose none --prefix Subzero %s | FileCheck --check-prefix=M
ANGLE %s | 8 ; RUN: %llvm2ice --verbose none --prefix Subzero -ffunction-sections %s \ |
| 9 ; RUN: | FileCheck --check-prefix=MANGLE %s |
| 9 ; RUN: %llvm2ice --verbose none %s | FileCheck --check-prefix=ERRORS %s | 10 ; RUN: %llvm2ice --verbose none %s | FileCheck --check-prefix=ERRORS %s |
| 10 ; RUN: %llvm2iceinsts %s | %szdiff %s | FileCheck --check-prefix=DUMP %s | 11 ; RUN: %llvm2iceinsts %s | %szdiff %s | FileCheck --check-prefix=DUMP %s |
| 11 ; RUN: %llvm2iceinsts --pnacl %s | %szdiff %s \ | 12 ; RUN: %llvm2iceinsts --pnacl %s | %szdiff %s \ |
| 12 ; RUN: | FileCheck --check-prefix=DUMP %s | 13 ; RUN: | FileCheck --check-prefix=DUMP %s |
| 13 | 14 |
| 14 define internal void @FuncC(i32 %i) { | 15 define internal void @FuncC(i32 %i) { |
| 15 entry: | 16 entry: |
| 16 ret void | 17 ret void |
| 17 } | 18 } |
| 18 ; FuncC is a C symbol that isn't recognized as a C++ mangled symbol. | 19 ; FuncC is a C symbol that isn't recognized as a C++ mangled symbol. |
| 20 ; CHECK-LABEL: .text.FuncC |
| 19 ; CHECK: FuncC: | 21 ; CHECK: FuncC: |
| 20 ; MANGLE: SubzeroFuncC | 22 ; MANGLE-LABEL: .text.SubzeroFuncC |
| 23 ; MANGLE: SubzeroFuncC: |
| 21 | 24 |
| 22 define internal void @_ZN13TestNamespace4FuncEi(i32 %i) { | 25 define internal void @_ZN13TestNamespace4FuncEi(i32 %i) { |
| 23 entry: | 26 entry: |
| 24 ret void | 27 ret void |
| 25 } | 28 } |
| 26 ; This is Func(int) nested inside namespace TestNamespace. | 29 ; This is Func(int) nested inside namespace TestNamespace. |
| 30 ; CHECK-LABEL: .text._ZN13TestNamespace4FuncEi |
| 27 ; CHECK: _ZN13TestNamespace4FuncEi: | 31 ; CHECK: _ZN13TestNamespace4FuncEi: |
| 32 ; MANGLE-LABEL: .text._ZN7Subzero13TestNamespace4FuncEi |
| 28 ; MANGLE: _ZN7Subzero13TestNamespace4FuncEi: | 33 ; MANGLE: _ZN7Subzero13TestNamespace4FuncEi: |
| 29 | 34 |
| 30 define internal void @_ZN13TestNamespace15NestedNamespace4FuncEi(i32 %i) { | 35 define internal void @_ZN13TestNamespace15NestedNamespace4FuncEi(i32 %i) { |
| 31 entry: | 36 entry: |
| 32 ret void | 37 ret void |
| 33 } | 38 } |
| 34 ; This is Func(int) nested inside two namespaces. | 39 ; This is Func(int) nested inside two namespaces. |
| 40 ; CHECK-LABEL: .text._ZN13TestNamespace15NestedNamespace4FuncEi |
| 35 ; CHECK: _ZN13TestNamespace15NestedNamespace4FuncEi: | 41 ; CHECK: _ZN13TestNamespace15NestedNamespace4FuncEi: |
| 42 ; MANGLE-LABEL: .text._ZN7Subzero13TestNamespace15NestedNamespace4FuncEi |
| 36 ; MANGLE: _ZN7Subzero13TestNamespace15NestedNamespace4FuncEi: | 43 ; MANGLE: _ZN7Subzero13TestNamespace15NestedNamespace4FuncEi: |
| 37 | 44 |
| 38 define internal void @_Z13FuncCPlusPlusi(i32 %i) { | 45 define internal void @_Z13FuncCPlusPlusi(i32 %i) { |
| 39 entry: | 46 entry: |
| 40 ret void | 47 ret void |
| 41 } | 48 } |
| 42 ; This is a non-nested, mangled C++ symbol. | 49 ; This is a non-nested, mangled C++ symbol. |
| 50 ; CHECK-LABEL: .text._Z13FuncCPlusPlusi |
| 43 ; CHECK: _Z13FuncCPlusPlusi: | 51 ; CHECK: _Z13FuncCPlusPlusi: |
| 52 ; MANGLE-LABEL: .text._ZN7Subzero13FuncCPlusPlusEi |
| 44 ; MANGLE: _ZN7Subzero13FuncCPlusPlusEi: | 53 ; MANGLE: _ZN7Subzero13FuncCPlusPlusEi: |
| 45 | 54 |
| 46 define internal void @_ZN12_GLOBAL__N_18FuncAnonEi(i32 %i) { | 55 define internal void @_ZN12_GLOBAL__N_18FuncAnonEi(i32 %i) { |
| 47 entry: | 56 entry: |
| 48 ret void | 57 ret void |
| 49 } | 58 } |
| 50 ; This is FuncAnon(int) nested inside an anonymous namespace. | 59 ; This is FuncAnon(int) nested inside an anonymous namespace. |
| 60 ; CHECK-LABEL: .text._ZN12_GLOBAL__N_18FuncAnonEi |
| 51 ; CHECK: _ZN12_GLOBAL__N_18FuncAnonEi: | 61 ; CHECK: _ZN12_GLOBAL__N_18FuncAnonEi: |
| 62 ; MANGLE-LABEL: .text._ZN7Subzero12_GLOBAL__N_18FuncAnonEi |
| 52 ; MANGLE: _ZN7Subzero12_GLOBAL__N_18FuncAnonEi: | 63 ; MANGLE: _ZN7Subzero12_GLOBAL__N_18FuncAnonEi: |
| 53 | 64 |
| 54 ; Now for the illegitimate examples. | 65 ; Now for the illegitimate examples. |
| 55 | 66 |
| 56 ; Test for _ZN with no suffix. Don't crash, prepend Subzero. | 67 ; Test for _ZN with no suffix. Don't crash, prepend Subzero. |
| 57 define internal void @_ZN(i32 %i) { | 68 define internal void @_ZN(i32 %i) { |
| 58 entry: | 69 entry: |
| 59 ret void | 70 ret void |
| 60 } | 71 } |
| 72 ; MANGLE-LABEL: .text.Subzero_ZN |
| 61 ; MANGLE: Subzero_ZN: | 73 ; MANGLE: Subzero_ZN: |
| 62 | 74 |
| 63 ; Test for _Z<len><str> where <len> is smaller than it should be. | 75 ; Test for _Z<len><str> where <len> is smaller than it should be. |
| 64 define internal void @_Z12FuncCPlusPlusi(i32 %i) { | 76 define internal void @_Z12FuncCPlusPlusi(i32 %i) { |
| 65 entry: | 77 entry: |
| 66 ret void | 78 ret void |
| 67 } | 79 } |
| 80 ; MANGLE-LABEL: .text._ZN7Subzero12FuncCPlusPluEsi |
| 68 ; MANGLE: _ZN7Subzero12FuncCPlusPluEsi: | 81 ; MANGLE: _ZN7Subzero12FuncCPlusPluEsi: |
| 69 | 82 |
| 70 ; Test for _Z<len><str> where <len> is slightly larger than it should be. | 83 ; Test for _Z<len><str> where <len> is slightly larger than it should be. |
| 71 define internal void @_Z14FuncCPlusPlusi(i32 %i) { | 84 define internal void @_Z14FuncCPlusPlusi(i32 %i) { |
| 72 entry: | 85 entry: |
| 73 ret void | 86 ret void |
| 74 } | 87 } |
| 88 ; MANGLE-LABEL: .text._ZN7Subzero14FuncCPlusPlusiE |
| 75 ; MANGLE: _ZN7Subzero14FuncCPlusPlusiE: | 89 ; MANGLE: _ZN7Subzero14FuncCPlusPlusiE: |
| 76 | 90 |
| 77 ; Test for _Z<len><str> where <len> is much larger than it should be. | 91 ; Test for _Z<len><str> where <len> is much larger than it should be. |
| 78 define internal void @_Z114FuncCPlusPlusi(i32 %i) { | 92 define internal void @_Z114FuncCPlusPlusi(i32 %i) { |
| 79 entry: | 93 entry: |
| 80 ret void | 94 ret void |
| 81 } | 95 } |
| 96 ; MANGLE-LABEL: .text.Subzero_Z114FuncCPlusPlusi |
| 82 ; MANGLE: Subzero_Z114FuncCPlusPlusi: | 97 ; MANGLE: Subzero_Z114FuncCPlusPlusi: |
| 83 | 98 |
| 84 ; Test for _Z<len><str> where we try to overflow the uint32_t holding <len>. | 99 ; Test for _Z<len><str> where we try to overflow the uint32_t holding <len>. |
| 85 define internal void @_Z4294967296FuncCPlusPlusi(i32 %i) { | 100 define internal void @_Z4294967296FuncCPlusPlusi(i32 %i) { |
| 86 entry: | 101 entry: |
| 87 ret void | 102 ret void |
| 88 } | 103 } |
| 104 ; MANGLE-LABEL: .text.Subzero_Z4294967296FuncCPlusPlusi |
| 89 ; MANGLE: Subzero_Z4294967296FuncCPlusPlusi: | 105 ; MANGLE: Subzero_Z4294967296FuncCPlusPlusi: |
| 90 | 106 |
| 91 ; Test for _Z<len><str> where <len> is 0. | 107 ; Test for _Z<len><str> where <len> is 0. |
| 92 define internal void @_Z0FuncCPlusPlusi(i32 %i) { | 108 define internal void @_Z0FuncCPlusPlusi(i32 %i) { |
| 93 entry: | 109 entry: |
| 94 ret void | 110 ret void |
| 95 } | 111 } |
| 112 ; MANGLE-LABEL: .text._ZN7Subzero0EFuncCPlusPlusi |
| 96 ; MANGLE: _ZN7Subzero0EFuncCPlusPlusi: | 113 ; MANGLE: _ZN7Subzero0EFuncCPlusPlusi: |
| 97 | 114 |
| 98 ; Test for _Z<len><str> where <len> is -1. LLVM explicitly allows the | 115 ; Test for _Z<len><str> where <len> is -1. LLVM explicitly allows the |
| 99 ; '-' character in identifiers. | 116 ; '-' character in identifiers. |
| 100 | 117 |
| 101 define internal void @_Z-1FuncCPlusPlusi(i32 %i) { | 118 define internal void @_Z-1FuncCPlusPlusi(i32 %i) { |
| 102 entry: | 119 entry: |
| 103 ret void | 120 ret void |
| 104 } | 121 } |
| 122 ; MANGLE-LABEL: .text.Subzero_Z-1FuncCPlusPlusi |
| 105 ; MANGLE: Subzero_Z-1FuncCPlusPlusi: | 123 ; MANGLE: Subzero_Z-1FuncCPlusPlusi: |
| 106 | 124 |
| 107 | 125 |
| 108 ; Test for substitution incrementing. This single test captures: | 126 ; Test for substitution incrementing. This single test captures: |
| 109 ; S<num>_ ==> S<num+1>_ for single-digit <num> | 127 ; S<num>_ ==> S<num+1>_ for single-digit <num> |
| 110 ; S_ ==> S0_ | 128 ; S_ ==> S0_ |
| 111 ; String length increase, e.g. SZZZ_ ==> S1000_ | 129 ; String length increase, e.g. SZZZ_ ==> S1000_ |
| 112 ; At least one digit wrapping without length increase, e.g. SZ9ZZ_ ==> SZA00_ | 130 ; At least one digit wrapping without length increase, e.g. SZ9ZZ_ ==> SZA00_ |
| 113 ; Unrelated identifiers containing S[0-9A-Z]* , e.g. MyClassS1x | 131 ; Unrelated identifiers containing S[0-9A-Z]* , e.g. MyClassS1x |
| 114 ; A proper substring of S<num>_ at the end of the string | 132 ; A proper substring of S<num>_ at the end of the string |
| 115 ; (to test parser edge cases) | 133 ; (to test parser edge cases) |
| 116 | 134 |
| 117 define internal void @_Z3fooP10MyClassS1xP10MyClassS2xRS_RS1_S_S1_SZZZ_SZ9ZZ_S12
345() { | 135 define internal void @_Z3fooP10MyClassS1xP10MyClassS2xRS_RS1_S_S1_SZZZ_SZ9ZZ_S12
345() { |
| 118 ; MANGLE: _ZN7Subzero3fooEP10MyClassS1xP10MyClassS2xRS0_RS2_S0_S2_S1000_SZA00_
S12345: | 136 ; MANGLE-LABEL: .text._ZN7Subzero3fooEP10MyClassS1xP10MyClassS2xRS0_RS2_S0_S2_S1
000_SZA00_S12345 |
| 137 ; MANGLE: _ZN7Subzero3fooEP10MyClassS1xP10MyClassS2xRS0_RS2_S0_S2_S1000_SZA00_S1
2345: |
| 119 entry: | 138 entry: |
| 120 ret void | 139 ret void |
| 121 } | 140 } |
| 122 | 141 |
| 123 ; Test that unmangled (non-C++) strings don't have substitutions updated. | 142 ; Test that unmangled (non-C++) strings don't have substitutions updated. |
| 124 define internal void @foo_S_S0_SZ_S() { | 143 define internal void @foo_S_S0_SZ_S() { |
| 125 ; MANGLE: Subzerofoo_S_S0_SZ_S: | 144 ; MANGLE-LABEL: .text.Subzerofoo_S_S0_SZ_S |
| 145 ; MANGLE: Subzerofoo_S_S0_SZ_S: |
| 126 entry: | 146 entry: |
| 127 ret void | 147 ret void |
| 128 } | 148 } |
| 129 | 149 |
| 130 ; ERRORS-NOT: ICE translation error | 150 ; ERRORS-NOT: ICE translation error |
| 131 ; DUMP-NOT: SZ | 151 ; DUMP-NOT: SZ |
| OLD | NEW |