xref: /linux/tools/perf/tests/demangle-rust-v0-test.c (revision e78f70bad29c5ae1e1076698b690b15794e9b81e)
1 // SPDX-License-Identifier: Apache-2.0 OR MIT
2 #include "tests.h"
3 #include "debug.h"
4 #include "symbol.h"
5 #include <linux/kernel.h>
6 #include <stdlib.h>
7 #include <string.h>
8 
9 static int test__demangle_rust(struct test_suite *test __maybe_unused, int subtest __maybe_unused)
10 {
11 	int ret = TEST_OK;
12 	char *buf = NULL;
13 	size_t i;
14 
15 	struct {
16 		const char *mangled, *demangled;
17 	} test_cases[] = {
18 		{ "_RNvMsr_NtCs3ssYzQotkvD_3std4pathNtB5_7PathBuf3newCs15kBYyAo9fc_7mycrate",
19 		  "<std::path::PathBuf>::new" },
20 		{ "_RNvCs15kBYyAo9fc_7mycrate7example",
21 		  "mycrate::example" },
22 		{ "_RNvMs_Cs4Cv8Wi1oAIB_7mycrateNtB4_7Example3foo",
23 		  "<mycrate::Example>::foo" },
24 		{ "_RNvXCs15kBYyAo9fc_7mycrateNtB2_7ExampleNtB2_5Trait3foo",
25 		  "<mycrate::Example as mycrate::Trait>::foo" },
26 		{ "_RNvMCs7qp2U7fqm6G_7mycrateNtB2_7Example3foo",
27 		  "<mycrate::Example>::foo" },
28 		{ "_RNvMs_Cs7qp2U7fqm6G_7mycrateNtB4_7Example3bar",
29 		  "<mycrate::Example>::bar" },
30 		{ "_RNvYNtCs15kBYyAo9fc_7mycrate7ExampleNtB4_5Trait7exampleB4_",
31 		  "<mycrate::Example as mycrate::Trait>::example" },
32 		{ "_RNCNvCsgStHSCytQ6I_7mycrate4main0B3_",
33 		  "mycrate::main::{closure#0}" },
34 		{ "_RNCNvCsgStHSCytQ6I_7mycrate4mains_0B3_",
35 		  "mycrate::main::{closure#1}" },
36 		{ "_RINvCsgStHSCytQ6I_7mycrate7examplelKj1_EB2_",
37 		  "mycrate::example::<i32, 1>" },
38 		{ "_RINvCs7qp2U7fqm6G_7mycrate7exampleFG0_RL1_hRL0_tEuEB2_",
39 		  "mycrate::example::<for<'a, 'b> fn(&'a u8, &'b u16)>",
40 		},
41 		{ "_RINvCs7qp2U7fqm6G_7mycrate7exampleKy12345678_EB2_",
42 		  "mycrate::example::<305419896>" },
43 		{ "_RNvNvMCsd9PVOYlP1UU_7mycrateINtB4_7ExamplepKpE3foo14EXAMPLE_STATIC",
44 		  "<mycrate::Example<_, _>>::foo::EXAMPLE_STATIC",
45 		},
46 		{ "_RINvCs7qp2U7fqm6G_7mycrate7exampleAtj8_EB2_",
47 		  "mycrate::example::<[u16; 8]>" },
48 		{ "_RINvCs7qp2U7fqm6G_7mycrate7exampleNtB2_7ExampleBw_EB2_",
49 		  "mycrate::example::<mycrate::Example, mycrate::Example>" },
50 		{ "_RINvMsY_NtCseXNvpPnDBDp_3std4pathNtB6_4Path3neweECs7qp2U7fqm6G_7mycrate",
51 		  "<std::path::Path>::new::<str>" },
52 		{ "_RNvNvNvCs7qp2U7fqm6G_7mycrate7EXAMPLE7___getit5___KEY",
53 		  "mycrate::EXAMPLE::__getit::__KEY" },
54 	};
55 
56 	for (i = 0; i < ARRAY_SIZE(test_cases); i++) {
57 		buf = dso__demangle_sym(/*dso=*/NULL, /*kmodule=*/0, test_cases[i].mangled);
58 		if (!buf) {
59 			pr_debug("FAILED to demangle: \"%s\"\n \"%s\"\n", test_cases[i].mangled,
60 				 test_cases[i].demangled);
61 			continue;
62 		}
63 		if (strcmp(buf, test_cases[i].demangled)) {
64 			pr_debug("FAILED: %s: %s != %s\n", test_cases[i].mangled,
65 				 buf, test_cases[i].demangled);
66 			ret = TEST_FAIL;
67 		}
68 		free(buf);
69 	}
70 
71 	return ret;
72 }
73 
74 DEFINE_SUITE("Demangle Rust", demangle_rust);
75