xref: /freebsd-src/contrib/llvm-project/llvm/lib/Demangle/DLangDemangle.cpp (revision 349cc55c9796c4596a5b9904cd3281af295f878f)
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