summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristopher Ferris <cferris@google.com>2017-11-01 16:22:09 -0700
committerChristopher Ferris <cferris@google.com>2017-11-01 16:24:55 -0700
commit5a72ea0f2f5ac2a59348203c9db98c2ad5126d93 (patch)
treed5420af29f660600c5ab2d6407c3459459e013a3
parent3d879b10d8ce270879f7b73a2ea94298a58b07af (diff)
downloadsystem_core-5a72ea0f2f5ac2a59348203c9db98c2ad5126d93.tar.gz
system_core-5a72ea0f2f5ac2a59348203c9db98c2ad5126d93.tar.bz2
system_core-5a72ea0f2f5ac2a59348203c9db98c2ad5126d93.zip
Add support for non-virtual thunk.
Bug: 67678053 Test: New unit tests pass. Change-Id: If04f502e234da00a356e5ddd31acd22a6ad1a804
-rw-r--r--demangle/DemangleTest.cpp21
-rw-r--r--demangle/Demangler.cpp26
2 files changed, 46 insertions, 1 deletions
diff --git a/demangle/DemangleTest.cpp b/demangle/DemangleTest.cpp
index 5825e6ce2..46a6f76d2 100644
--- a/demangle/DemangleTest.cpp
+++ b/demangle/DemangleTest.cpp
@@ -488,6 +488,27 @@ TEST(DemangleTest, BooleanLiterals) {
demangler.Parse("_ZN3oneE3twoI5threeI4fourELb0ELb1EE"));
}
+TEST(DemangleTest, non_virtual_thunk) {
+ Demangler demangler;
+
+ ASSERT_EQ("non-virtual thunk to one", demangler.Parse("_ZThn0_N3oneE"));
+ ASSERT_EQ("non-virtual thunk to two", demangler.Parse("_ZThn0_3two"));
+ ASSERT_EQ("non-virtual thunk to three", demangler.Parse("_ZTh0_5three"));
+ ASSERT_EQ("non-virtual thunk to four", demangler.Parse("_ZTh_4four"));
+ ASSERT_EQ("non-virtual thunk to five", demangler.Parse("_ZTh0123456789_4five"));
+ ASSERT_EQ("non-virtual thunk to six", demangler.Parse("_ZThn0123456789_3six"));
+
+ ASSERT_EQ("_ZThn0N3oneE", demangler.Parse("_ZThn0N3oneE"));
+ ASSERT_EQ("_ZThn03two", demangler.Parse("_ZThn03two"));
+ ASSERT_EQ("_ZTh05three", demangler.Parse("_ZTh05three"));
+ ASSERT_EQ("_ZTh4four", demangler.Parse("_ZTh4four"));
+ ASSERT_EQ("_ZTh01234567894five", demangler.Parse("_ZTh01234567894five"));
+ ASSERT_EQ("_ZThn01234567893six", demangler.Parse("_ZThn01234567893six"));
+ ASSERT_EQ("_ZT_N3oneE", demangler.Parse("_ZT_N3oneE"));
+ ASSERT_EQ("_ZT0_N3oneE", demangler.Parse("_ZT0_N3oneE"));
+ ASSERT_EQ("_ZTH_N3oneE", demangler.Parse("_ZTH_N3oneE"));
+}
+
TEST(DemangleTest, demangle) {
std::string str;
diff --git a/demangle/Demangler.cpp b/demangle/Demangler.cpp
index 18a90b4a9..af2816caf 100644
--- a/demangle/Demangler.cpp
+++ b/demangle/Demangler.cpp
@@ -388,7 +388,7 @@ const char* Demangler::ParseFunctionName(const char* name) {
saves_.pop_back();
}
- function_name_ = cur_state_.str;
+ function_name_ += cur_state_.str;
while (!cur_state_.suffixes.empty()) {
function_suffix_ += cur_state_.suffixes.back();
cur_state_.suffixes.pop_back();
@@ -786,6 +786,30 @@ const char* Demangler::ParseFunctionTemplateArguments(const char* name) {
}
const char* Demangler::FindFunctionName(const char* name) {
+ if (*name == 'T') {
+ // non-virtual thunk, verify that it matches one of these patterns:
+ // Thn[0-9]+_
+ // Th[0-9]+_
+ // Thn_
+ // Th_
+ name++;
+ if (*name != 'h') {
+ return nullptr;
+ }
+ name++;
+ if (*name == 'n') {
+ name++;
+ }
+ while (std::isdigit(*name)) {
+ name++;
+ }
+ if (*name != '_') {
+ return nullptr;
+ }
+ function_name_ = "non-virtual thunk to ";
+ return name + 1;
+ }
+
if (*name == 'N') {
parse_funcs_.push_back(&Demangler::ParseArgumentsAtTopLevel);
parse_func_ = &Demangler::ParseFunctionName;