1ce5b5b48SJames Henderson //===-- Demangle.cpp - Common demangling functions ------------------------===// 2ce5b5b48SJames Henderson // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6ce5b5b48SJames Henderson // 7ce5b5b48SJames Henderson //===----------------------------------------------------------------------===// 8ce5b5b48SJames Henderson /// 9ce5b5b48SJames Henderson /// \file This file contains definitions of common demangling functions. 10ce5b5b48SJames Henderson /// 11ce5b5b48SJames Henderson //===----------------------------------------------------------------------===// 12ce5b5b48SJames Henderson 13ce5b5b48SJames Henderson #include "llvm/Demangle/Demangle.h" 148456cddeSKonstantin Zhuravlyov #include <cstdlib> 15ce5b5b48SJames Henderson 16f5356944SJames Henderson static bool isItaniumEncoding(const std::string &MangledName) { 17f5356944SJames Henderson size_t Pos = MangledName.find_first_not_of('_'); 18f5356944SJames Henderson // A valid Itanium encoding requires 1-4 leading underscores, followed by 'Z'. 19f5356944SJames Henderson return Pos > 0 && Pos <= 4 && MangledName[Pos] == 'Z'; 20f5356944SJames Henderson } 21f5356944SJames Henderson 22*9b108560STomasz Miąsko static bool isRustEncoding(const std::string &MangledName) { 23*9b108560STomasz Miąsko return MangledName.size() >= 2 && MangledName[0] == '_' && 24*9b108560STomasz Miąsko MangledName[1] == 'R'; 25*9b108560STomasz Miąsko } 26*9b108560STomasz Miąsko 27ce5b5b48SJames Henderson std::string llvm::demangle(const std::string &MangledName) { 28ce5b5b48SJames Henderson char *Demangled; 29f5356944SJames Henderson if (isItaniumEncoding(MangledName)) 30ce5b5b48SJames Henderson Demangled = itaniumDemangle(MangledName.c_str(), nullptr, nullptr, nullptr); 31*9b108560STomasz Miąsko else if (isRustEncoding(MangledName)) 32*9b108560STomasz Miąsko Demangled = rustDemangle(MangledName.c_str(), nullptr, nullptr, nullptr); 33ce5b5b48SJames Henderson else 34bc1c3655SNico Weber Demangled = microsoftDemangle(MangledName.c_str(), nullptr, nullptr, 35bc1c3655SNico Weber nullptr, nullptr); 36ce5b5b48SJames Henderson 37ce5b5b48SJames Henderson if (!Demangled) 38ce5b5b48SJames Henderson return MangledName; 39ce5b5b48SJames Henderson 40ce5b5b48SJames Henderson std::string Ret = Demangled; 4178f543e5SLouis Dionne std::free(Demangled); 42ce5b5b48SJames Henderson return Ret; 43ce5b5b48SJames Henderson } 44