Index: llvm/lib/Demangle/DLangDemangle.cpp =================================================================== --- llvm/lib/Demangle/DLangDemangle.cpp +++ llvm/lib/Demangle/DLangDemangle.cpp @@ -115,6 +115,17 @@ /// \see https://dlang.org/spec/abi.html#QualifiedName . const char *parseQualified(OutputBuffer *Demangled, const char *Mangled); + /// Extract and demangle a type from a given mangled symbol append it to + /// the output string. + /// + /// \param Demangled output buffer to write the demangled name. + /// \param Mangled mangled symbol to be demangled. + /// + /// \return the remaining string on success or nullptr on failure. + /// + /// \see https://dlang.org/spec/abi.html#Type . + const char *parseType(OutputBuffer *Demangled, const char *Mangled); + /// The string we are demangling. const char *Str; }; @@ -174,8 +185,13 @@ if (*Mangled == 'Z') ++Mangled; else { - // TODO: Implement symbols with types. - return nullptr; + // Discard the declaration or return type. + OutputBuffer Type; + if (!initializeOutputBuffer(nullptr, nullptr, Type, 32)) + return nullptr; + + Mangled = parseType(&Type, Mangled); + std::free(Type.getBuffer()); } } @@ -262,6 +278,36 @@ return parseLName(Demangled, Mangled, Len); } +const char *Demangler::parseType(OutputBuffer *Demangled, const char *Mangled) { + if (Mangled == nullptr || *Mangled == '\0') + return nullptr; + + switch (*Mangled) { + // TODO: Parse type qualifiers. + // TODO: Parse function types. + // TODO: Parse compound types. + // TODO: Parse delegate types. + // TODO: Parse tuple types. + + // Basic types. + case 'v': + ++Mangled; + *Demangled << "void"; + return Mangled; + + case 'i': + ++Mangled; + *Demangled << "int"; + return Mangled; + + // TODO: Add support for the rest of the basic types. + // TODO: Parse back referenced types. + + default: // unhandled. + return nullptr; + } +} + const char *Demangler::parseLName(OutputBuffer *Demangled, const char *Mangled, unsigned long Len) { switch (Len) { Index: llvm/unittests/Demangle/DLangDemangleTest.cpp =================================================================== --- llvm/unittests/Demangle/DLangDemangleTest.cpp +++ llvm/unittests/Demangle/DLangDemangleTest.cpp @@ -47,4 +47,7 @@ std::make_pair("_D8demangle4test12__ModuleInfoZ", "ModuleInfo for demangle.test"), std::make_pair("_D8demangle4__S14testZ", "demangle.test"), - std::make_pair("_D8demangle4__Sd4testZ", "demangle.__Sd.test"))); + std::make_pair("_D8demangle4__Sd4testZ", "demangle.__Sd.test"), + std::make_pair("_D8demangle1ii", "demangle.i"), + std::make_pair("_D8demangle1vv", "demangle.v"), + std::make_pair("_D8demangle1iinvalidtypeseq", nullptr))); // invalid type sequence