@@ -172,4 +172,66 @@ TEST(ManglerTest, GOFF) {
172
172
" L#foo" );
173
173
}
174
174
175
+ TEST (ManglerTest, Arm64EC) {
176
+ constexpr std::string_view Arm64ECNames[] = {
177
+ // Basic C name.
178
+ " #Foo" ,
179
+
180
+ // Basic C++ name.
181
+ " ?foo@@$$hYAHXZ" ,
182
+
183
+ // Regression test: https://github.com/llvm/llvm-project/issues/115231
184
+ " ?GetValue@?$Wrapper@UA@@@@$$hQEBAHXZ" ,
185
+
186
+ // Symbols from:
187
+ // ```
188
+ // namespace A::B::C::D {
189
+ // struct Base {
190
+ // virtual int f() { return 0; }
191
+ // };
192
+ // }
193
+ // struct Derived : public A::B::C::D::Base {
194
+ // virtual int f() override { return 1; }
195
+ // };
196
+ // A::B::C::D::Base* MakeObj() { return new Derived(); }
197
+ // ```
198
+ // void * __cdecl operator new(unsigned __int64)
199
+ " ??2@$$hYAPEAX_K@Z" ,
200
+ // public: virtual int __cdecl A::B::C::D::Base::f(void)
201
+ " ?f@Base@D@C@B@A@@$$hUEAAHXZ" ,
202
+ // public: __cdecl A::B::C::D::Base::Base(void)
203
+ " ??0Base@D@C@B@A@@$$hQEAA@XZ" ,
204
+ // public: virtual int __cdecl Derived::f(void)
205
+ " ?f@Derived@@$$hUEAAHXZ" ,
206
+ // public: __cdecl Derived::Derived(void)
207
+ " ??0Derived@@$$hQEAA@XZ" ,
208
+ // struct A::B::C::D::Base * __cdecl MakeObj(void)
209
+ " ?MakeObj@@$$hYAPEAUBase@D@C@B@A@@XZ" ,
210
+ };
211
+
212
+ for (const auto &Arm64ECName : Arm64ECNames) {
213
+ // Check that this is a mangled name.
214
+ EXPECT_TRUE (isArm64ECMangledFunctionName (Arm64ECName))
215
+ << " Test case: " << Arm64ECName;
216
+ // Refuse to mangle it again.
217
+ EXPECT_FALSE (getArm64ECMangledFunctionName (Arm64ECName).has_value ())
218
+ << " Test case: " << Arm64ECName;
219
+
220
+ // Demangle.
221
+ auto Arm64Name = getArm64ECDemangledFunctionName (Arm64ECName);
222
+ EXPECT_TRUE (Arm64Name.has_value ()) << " Test case: " << Arm64ECName;
223
+ // Check that it is not mangled.
224
+ EXPECT_FALSE (isArm64ECMangledFunctionName (Arm64Name.value ()))
225
+ << " Test case: " << Arm64ECName;
226
+ // Refuse to demangle it again.
227
+ EXPECT_FALSE (getArm64ECDemangledFunctionName (Arm64Name.value ()).has_value ())
228
+ << " Test case: " << Arm64ECName;
229
+
230
+ // Round-trip.
231
+ auto RoundTripArm64ECName =
232
+ getArm64ECMangledFunctionName (Arm64Name.value ());
233
+ EXPECT_EQ (RoundTripArm64ECName, Arm64ECName);
234
+ }
235
+ }
236
+
175
237
} // end anonymous namespace
0 commit comments