1cb93a386Sopenharmony_ci// Copyright 2020 The Tint Authors. 2cb93a386Sopenharmony_ci// 3cb93a386Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License"); 4cb93a386Sopenharmony_ci// you may not use this file except in compliance with the License. 5cb93a386Sopenharmony_ci// You may obtain a copy of the License at 6cb93a386Sopenharmony_ci// 7cb93a386Sopenharmony_ci// http://www.apache.org/licenses/LICENSE-2.0 8cb93a386Sopenharmony_ci// 9cb93a386Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software 10cb93a386Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS, 11cb93a386Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12cb93a386Sopenharmony_ci// See the License for the specific language governing permissions and 13cb93a386Sopenharmony_ci// limitations under the License. 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_ci#include "src/demangler.h" 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_ci#include "src/program.h" 18cb93a386Sopenharmony_ci 19cb93a386Sopenharmony_cinamespace tint { 20cb93a386Sopenharmony_cinamespace { 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_ciconstexpr char kSymbol[] = "$"; 23cb93a386Sopenharmony_ciconstexpr size_t kSymbolLen = sizeof(kSymbol) - 1; 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ci} // namespace 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_ciDemangler::Demangler() = default; 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_ciDemangler::~Demangler() = default; 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_cistd::string Demangler::Demangle(const SymbolTable& symbols, 32cb93a386Sopenharmony_ci const std::string& str) const { 33cb93a386Sopenharmony_ci std::stringstream out; 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_ci size_t pos = 0; 36cb93a386Sopenharmony_ci for (;;) { 37cb93a386Sopenharmony_ci auto idx = str.find(kSymbol, pos); 38cb93a386Sopenharmony_ci if (idx == std::string::npos) { 39cb93a386Sopenharmony_ci out << str.substr(pos); 40cb93a386Sopenharmony_ci break; 41cb93a386Sopenharmony_ci } 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_ci out << str.substr(pos, idx - pos); 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_ci auto start_idx = idx + kSymbolLen; 46cb93a386Sopenharmony_ci auto end_idx = start_idx; 47cb93a386Sopenharmony_ci while (str[end_idx] >= '0' && str[end_idx] <= '9') { 48cb93a386Sopenharmony_ci end_idx++; 49cb93a386Sopenharmony_ci } 50cb93a386Sopenharmony_ci auto len = end_idx - start_idx; 51cb93a386Sopenharmony_ci 52cb93a386Sopenharmony_ci auto id = str.substr(start_idx, len); 53cb93a386Sopenharmony_ci Symbol sym(std::stoi(id), symbols.ProgramID()); 54cb93a386Sopenharmony_ci out << symbols.NameFor(sym); 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ci pos = end_idx; 57cb93a386Sopenharmony_ci } 58cb93a386Sopenharmony_ci 59cb93a386Sopenharmony_ci return out.str(); 60cb93a386Sopenharmony_ci} 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ci} // namespace tint 63