//===--- DLangDemangle.cpp ------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// /// /// \file /// This file defines a demangler for the D programming language as specified /// in the ABI specification, available at: /// https://dlang.org/spec/abi.html#name_mangling /// //===----------------------------------------------------------------------===// #include "llvm/Demangle/Demangle.h" #include "llvm/Demangle/Utility.h" #include using namespace llvm; using llvm::itanium_demangle::OutputBuffer; char *llvm::dlangDemangle(const char *MangledName) { if (MangledName == nullptr || strncmp(MangledName, "_D", 2) != 0) return nullptr; OutputBuffer Demangled; if (!initializeOutputBuffer(nullptr, nullptr, Demangled, 1024)) return nullptr; if (strcmp(MangledName, "_Dmain") == 0) Demangled << "D main"; // OutputBuffer's internal buffer is not null terminated and therefore we need // to add it to comply with C null terminated strings. if (Demangled.getCurrentPosition() > 0) { Demangled << '\0'; Demangled.setCurrentPosition(Demangled.getCurrentPosition() - 1); return Demangled.getBuffer(); } free(Demangled.getBuffer()); return nullptr; }