Introduce a new demangling function that supports symbols using Itanium mangling and Rust v0 mangling, and is expected in the near future to include support for D mangling as well. Unlike llvm::demangle, the function does not accept extra underscore decoration. The callers generally know exactly when symbols should include the extra decoration and so they should be responsible for stripping it. Functionally the only intended change is to allow demangling Rust symbols with an extra underscore decoration through llvm::demangle, which matches the existing behaviour for Itanium symbols. Reviewed By: dblaikie, jhenderson Part of https://reviews.llvm.org/D110664
32 lines
1.3 KiB
C++
32 lines
1.3 KiB
C++
//===-- DemangleTest.cpp --------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Demangle/Demangle.h"
|
|
#include "gmock/gmock.h"
|
|
|
|
using namespace llvm;
|
|
|
|
TEST(Demangle, demangleTest) {
|
|
EXPECT_EQ(demangle("_"), "_");
|
|
EXPECT_EQ(demangle("_Z3fooi"), "foo(int)");
|
|
EXPECT_EQ(demangle("__Z3fooi"), "foo(int)");
|
|
EXPECT_EQ(demangle("___Z3fooi_block_invoke"),
|
|
"invocation function for block in foo(int)");
|
|
EXPECT_EQ(demangle("____Z3fooi_block_invoke"),
|
|
"invocation function for block in foo(int)");
|
|
EXPECT_EQ(demangle("?foo@@YAXH@Z"), "void __cdecl foo(int)");
|
|
EXPECT_EQ(demangle("foo"), "foo");
|
|
EXPECT_EQ(demangle("_RNvC3foo3bar"), "foo::bar");
|
|
EXPECT_EQ(demangle("__RNvC3foo3bar"), "foo::bar");
|
|
|
|
// Regression test for demangling of optional template-args for vendor
|
|
// extended type qualifier (https://bugs.llvm.org/show_bug.cgi?id=48009)
|
|
EXPECT_EQ(demangle("_Z3fooILi79EEbU7_ExtIntIXT_EEi"),
|
|
"bool foo<79>(int _ExtInt<79>)");
|
|
}
|