@@ -172,4 +172,66 @@ TEST(ManglerTest, GOFF) {
172172 " L#foo" );
173173}
174174
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+
175237} // end anonymous namespace
0 commit comments