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