19323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris/* 29323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris * Copyright (C) 2017 The Android Open Source Project 39323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris * 49323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris * Licensed under the Apache License, Version 2.0 (the "License"); 59323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris * you may not use this file except in compliance with the License. 69323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris * You may obtain a copy of the License at 79323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris * 89323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris * http://www.apache.org/licenses/LICENSE-2.0 99323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris * 109323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris * Unless required by applicable law or agreed to in writing, software 119323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris * distributed under the License is distributed on an "AS IS" BASIS, 129323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris * See the License for the specific language governing permissions and 149323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris * limitations under the License. 159323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris */ 169323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris 179323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris#ifndef __LIB_DEMANGLE_DEMANGLER_H 189323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris#define __LIB_DEMANGLE_DEMANGLER_H 199323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris 209323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris#include <assert.h> 219323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris 229323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris#include <stack> 239323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris#include <string> 249323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris#include <vector> 259323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris 269323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferrisclass Demangler { 279323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris public: 289323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris Demangler() = default; 299323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris 309323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris // NOTE: The max_length is not guaranteed to be the absolute max length 319323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris // of a string that will be rejected. Under certain circumstances the 329323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris // length check will not occur until after the second letter of a pair 339323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris // is checked. 349323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris std::string Parse(const char* name, size_t max_length = kMaxDefaultLength); 359323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris 369323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris void AppendCurrent(const std::string& str); 379323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris void AppendCurrent(const char* str); 389323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris void AppendArgument(const std::string& str); 399323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris std::string GetArgumentsString(); 409323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris void FinalizeTemplate(); 419323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris const char* ParseS(const char* name); 429323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris const char* AppendOperatorString(const char* name); 439323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris void Save(const std::string& str, bool is_name); 449323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris 459323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris private: 469323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris void Clear() { 479323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris parse_funcs_.clear(); 489323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris function_name_.clear(); 499323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris function_suffix_.clear(); 509323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris first_save_.clear(); 519323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris cur_state_.Clear(); 529323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris saves_.clear(); 539323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris while (!state_stack_.empty()) { 549323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris state_stack_.pop(); 559323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris } 569323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris last_save_name_ = false; 579323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris } 589323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris 599323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris using parse_func_type = const char* (Demangler::*)(const char*); 609323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris parse_func_type parse_func_; 619323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris std::vector<parse_func_type> parse_funcs_; 629323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris std::vector<std::string> saves_; 639323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris bool last_save_name_; 649323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris 659323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris std::string function_name_; 669323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris std::string function_suffix_; 679323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris 689323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris struct StateData { 699323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris void Clear() { 709323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris str.clear(); 719323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris args.clear(); 729323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris prefix.clear(); 739323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris suffixes.clear(); 749323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris last_save.clear(); 759323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris } 769323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris 779323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris std::string str; 789323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris std::vector<std::string> args; 799323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris std::string prefix; 809323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris std::vector<std::string> suffixes; 819323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris std::string last_save; 829323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris }; 839323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris std::stack<StateData> state_stack_; 849323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris std::string first_save_; 859323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris StateData cur_state_; 869323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris 879323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris static const char* GetStringFromLength(const char* name, std::string* str); 889323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris 899323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris // Parsing functions. 909323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris const char* ParseComplexString(const char* name); 919323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris const char* ParseComplexArgument(const char* name); 929323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris const char* ParseArguments(const char* name); 939323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris const char* ParseTemplateArguments(const char* name); 949323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris const char* ParseTemplateArgumentsComplex(const char* name); 959323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris const char* ParseFunctionArgument(const char* name); 969323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris const char* ParseFunctionName(const char* name); 979323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris const char* FindFunctionName(const char* name); 989323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris const char* Fail(const char*) { return nullptr; } 999323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris 1009323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris // The default maximum string length string to process. 1019323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris static constexpr size_t kMaxDefaultLength = 2048; 1029323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris 1039323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris static constexpr const char* kTypes[] = { 1049323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "signed char", // a 1059323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "bool", // b 1069323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "char", // c 1079323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "double", // d 1089323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "long double", // e 1099323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "float", // f 1109323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "__float128", // g 1119323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "unsigned char", // h 1129323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "int", // i 1139323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "unsigned int", // j 1149323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // k 1159323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "long", // l 1169323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "unsigned long", // m 1179323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "__int128", // n 1189323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "unsigned __int128", // o 1199323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // p 1209323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // q 1219323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // r 1229323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "short", // s 1239323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "unsigned short", // t 1249323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // u 1259323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "void", // v 1269323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "wchar_t", // w 1279323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "long long", // x 1289323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "unsigned long long", // y 1299323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "...", // z 1309323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris }; 1319323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris 1329323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris static constexpr const char* kDTypes[] = { 1339323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "auto", // a 1349323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // b 1359323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // c 1369323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "decimal64", // d 1379323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "decimal128", // e 1389323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "decimal32", // f 1399323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // g 1409323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "half", // h 1419323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "char32_t", // i 1429323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // j 1439323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // k 1449323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // l 1459323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // m 1469323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "decltype(nullptr)", // n 1479323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // o 1489323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // p 1499323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // q 1509323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // r 1519323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "char16_t", // s 1529323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // t 1539323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // u 1549323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // v 1559323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // w 1569323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // x 1579323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // y 1589323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // z 1599323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris }; 1609323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris 1619323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris static constexpr const char* kSTypes[] = { 1629323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "std::allocator", // a 1639323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "std::basic_string", // b 1649323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // c 1659323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "std::iostream", // d 1669323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // e 1679323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // f 1689323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // g 1699323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // h 1709323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "std::istream", // i 1719323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // j 1729323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // k 1739323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // l 1749323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // m 1759323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // n 1769323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "std::ostream", // o 1779323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // p 1789323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // q 1799323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // r 1809323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris "std::string", // s 1819323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // t 1829323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // u 1839323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // v 1849323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // w 1859323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // x 1869323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // y 1879323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris nullptr, // z 1889323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris }; 1899323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris}; 1909323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris 1919323b7219cb8415e93c0a1c4ed47a7c2bff6def7Christopher Ferris#endif // __LIB_DEMANGLE_DEMANGLER_H 192