1*349cc55cSDimitry Andric //===--- DLangDemangle.cpp ------------------------------------------------===// 2*349cc55cSDimitry Andric // 3*349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*349cc55cSDimitry Andric // 7*349cc55cSDimitry Andric //===----------------------------------------------------------------------===// 8*349cc55cSDimitry Andric /// 9*349cc55cSDimitry Andric /// \file 10*349cc55cSDimitry Andric /// This file defines a demangler for the D programming language as specified 11*349cc55cSDimitry Andric /// in the ABI specification, available at: 12*349cc55cSDimitry Andric /// https://dlang.org/spec/abi.html#name_mangling 13*349cc55cSDimitry Andric /// 14*349cc55cSDimitry Andric //===----------------------------------------------------------------------===// 15*349cc55cSDimitry Andric 16*349cc55cSDimitry Andric #include "llvm/Demangle/Demangle.h" 17*349cc55cSDimitry Andric #include "llvm/Demangle/Utility.h" 18*349cc55cSDimitry Andric 19*349cc55cSDimitry Andric #include <cstring> 20*349cc55cSDimitry Andric 21*349cc55cSDimitry Andric using namespace llvm; 22*349cc55cSDimitry Andric using llvm::itanium_demangle::OutputBuffer; 23*349cc55cSDimitry Andric 24*349cc55cSDimitry Andric char *llvm::dlangDemangle(const char *MangledName) { 25*349cc55cSDimitry Andric if (MangledName == nullptr || strncmp(MangledName, "_D", 2) != 0) 26*349cc55cSDimitry Andric return nullptr; 27*349cc55cSDimitry Andric 28*349cc55cSDimitry Andric OutputBuffer Demangled; 29*349cc55cSDimitry Andric if (!initializeOutputBuffer(nullptr, nullptr, Demangled, 1024)) 30*349cc55cSDimitry Andric return nullptr; 31*349cc55cSDimitry Andric 32*349cc55cSDimitry Andric if (strcmp(MangledName, "_Dmain") == 0) 33*349cc55cSDimitry Andric Demangled << "D main"; 34*349cc55cSDimitry Andric 35*349cc55cSDimitry Andric // OutputBuffer's internal buffer is not null terminated and therefore we need 36*349cc55cSDimitry Andric // to add it to comply with C null terminated strings. 37*349cc55cSDimitry Andric if (Demangled.getCurrentPosition() > 0) { 38*349cc55cSDimitry Andric Demangled << '\0'; 39*349cc55cSDimitry Andric Demangled.setCurrentPosition(Demangled.getCurrentPosition() - 1); 40*349cc55cSDimitry Andric return Demangled.getBuffer(); 41*349cc55cSDimitry Andric } 42*349cc55cSDimitry Andric 43*349cc55cSDimitry Andric free(Demangled.getBuffer()); 44*349cc55cSDimitry Andric return nullptr; 45*349cc55cSDimitry Andric } 46