Skip to content

Commit f5371eb

Browse files
[Damangle] convert dlangDemangle to use std::string_view
I was doing this API conversion to use std::string_view top-down in D149104, but this exposed issues in individual demanglers that needed to get fixed first. There's no issue with the conversion for the D language demangler, so convert it. I have a more aggressive refactoring of the entire D language demangler to use std::string_view more extensively, but the interface with llvm::nonMicrosoftDemangle is the more interesting one. Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D151003
1 parent 2ca21e8 commit f5371eb

File tree

6 files changed

+17
-15
lines changed

6 files changed

+17
-15
lines changed

lldb/source/Core/Mangled.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ static char *GetRustV0DemangledStr(std::string_view M) {
164164
return demangled_cstr;
165165
}
166166

167-
static char *GetDLangDemangledStr(const char *M) {
167+
static char *GetDLangDemangledStr(std::string_view M) {
168168
char *demangled_cstr = llvm::dlangDemangle(M);
169169

170170
if (Log *log = GetLog(LLDBLog::Demangle)) {
@@ -263,7 +263,7 @@ ConstString Mangled::GetDemangledName() const {
263263
demangled_name = GetRustV0DemangledStr(m_mangled);
264264
break;
265265
case eManglingSchemeD:
266-
demangled_name = GetDLangDemangledStr(mangled_name);
266+
demangled_name = GetDLangDemangledStr(m_mangled);
267267
break;
268268
case eManglingSchemeNone:
269269
llvm_unreachable("eManglingSchemeNone was handled already");

llvm/include/llvm/Demangle/Demangle.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ char *microsoftDemangle(const char *mangled_name, size_t *n_read, int *status,
5858
char *rustDemangle(std::string_view MangledName);
5959

6060
// Demangles a D mangled symbol.
61-
char *dlangDemangle(const char *MangledName);
61+
char *dlangDemangle(std::string_view MangledName);
6262

6363
/// Attempt to demangle a string using different demangling schemes.
6464
/// The function uses heuristics to determine which demangling scheme to use.

llvm/lib/Demangle/DLangDemangle.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
//===----------------------------------------------------------------------===//
1515

1616
#include "llvm/Demangle/Demangle.h"
17+
#include "llvm/Demangle/StringViewExtras.h"
1718
#include "llvm/Demangle/Utility.h"
1819

1920
#include <cctype>
@@ -22,6 +23,7 @@
2223

2324
using namespace llvm;
2425
using llvm::itanium_demangle::OutputBuffer;
26+
using llvm::itanium_demangle::starts_with;
2527

2628
namespace {
2729

@@ -541,20 +543,20 @@ const char *Demangler::parseMangle(OutputBuffer *Demangled) {
541543
return parseMangle(Demangled, this->Str);
542544
}
543545

544-
char *llvm::dlangDemangle(const char *MangledName) {
545-
if (MangledName == nullptr || strncmp(MangledName, "_D", 2) != 0)
546+
char *llvm::dlangDemangle(std::string_view MangledName) {
547+
if (MangledName.empty() || !starts_with(MangledName, "_D"))
546548
return nullptr;
547549

548550
OutputBuffer Demangled;
549-
if (strcmp(MangledName, "_Dmain") == 0) {
551+
if (MangledName == "_Dmain") {
550552
Demangled << "D main";
551553
} else {
552554

553-
Demangler D = Demangler(MangledName);
554-
MangledName = D.parseMangle(&Demangled);
555+
Demangler D(MangledName.data());
556+
const char *M = D.parseMangle(&Demangled);
555557

556558
// Check that the entire symbol was successfully demangled.
557-
if (MangledName == nullptr || *MangledName != '\0') {
559+
if (M == nullptr || *M != '\0') {
558560
std::free(Demangled.getBuffer());
559561
return nullptr;
560562
}

llvm/lib/Demangle/Demangle.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ bool llvm::nonMicrosoftDemangle(std::string_view MangledName,
5353
else if (isRustEncoding(MangledName.data()))
5454
Demangled = rustDemangle(MangledName);
5555
else if (isDLangEncoding(MangledName.data()))
56-
Demangled = dlangDemangle(MangledName.data());
56+
Demangled = dlangDemangle(MangledName);
5757

5858
if (!Demangled)
5959
return false;

llvm/tools/llvm-dlang-demangle-fuzzer/llvm-dlang-demangle-fuzzer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
1515
std::string NullTerminatedString((const char *)Data, Size);
16-
char *Demangled = llvm::dlangDemangle(NullTerminatedString.c_str());
16+
char *Demangled = llvm::dlangDemangle(NullTerminatedString);
1717
std::free(Demangled);
1818
return 0;
1919
}

llvm/unittests/Demangle/DLangDemangleTest.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@
1111
#include "gtest/gtest.h"
1212

1313
#include <cstdlib>
14+
#include <string_view>
1415
#include <utility>
1516

1617
struct DLangDemangleTestFixture
17-
: public testing::TestWithParam<std::pair<const char *, const char *>> {
18+
: public testing::TestWithParam<std::pair<std::string_view, const char *>> {
1819
char *Demangled;
1920

2021
void SetUp() override { Demangled = llvm::dlangDemangle(GetParam().first); }
@@ -29,9 +30,8 @@ TEST_P(DLangDemangleTestFixture, DLangDemangleTest) {
2930
INSTANTIATE_TEST_SUITE_P(
3031
DLangDemangleTest, DLangDemangleTestFixture,
3132
testing::Values(
32-
std::make_pair("_Dmain", "D main"), std::make_pair(nullptr, nullptr),
33-
std::make_pair("_Z", nullptr), std::make_pair("_DDD", nullptr),
34-
std::make_pair("_D88", nullptr),
33+
std::make_pair("_Dmain", "D main"), std::make_pair("_Z", nullptr),
34+
std::make_pair("_DDD", nullptr), std::make_pair("_D88", nullptr),
3535
std::make_pair("_D8demangleZ", "demangle"),
3636
std::make_pair("_D8demangle4testZ", "demangle.test"),
3737
std::make_pair("_D8demangle4test5test2Z", "demangle.test.test2"),

0 commit comments

Comments
 (0)