Skip to content

Commit

Permalink
[demangler] Add StringView conversion operator
Browse files Browse the repository at this point in the history
The OutputBuffer class tries to present a NUL-terminated string API to
consumers.  But several of them would prefer a StringView.  In
particular the Microsoft demangler, juggles between NUL-terminated and
StringView, which is confusing.

This adds a StringView conversion, and adjusts the Demanglers that can
benefit from that.

Reviewed By: dblaikie

Differential Revision: https://reviews.llvm.org/D120990
  • Loading branch information
urnathan committed Mar 28, 2022
1 parent b6dab4e commit 1066e39
Show file tree
Hide file tree
Showing 6 changed files with 19 additions and 20 deletions.
2 changes: 2 additions & 0 deletions libcxxabi/src/demangle/Utility.h
Expand Up @@ -75,6 +75,8 @@ class OutputBuffer {
OutputBuffer(const OutputBuffer &) = delete;
OutputBuffer &operator=(const OutputBuffer &) = delete;

operator StringView() const { return StringView(Buffer, CurrentPosition); }

void reset(char *Buffer_, size_t BufferCapacity_) {
CurrentPosition = 0;
Buffer = Buffer_;
Expand Down
2 changes: 2 additions & 0 deletions llvm/include/llvm/Demangle/Utility.h
Expand Up @@ -75,6 +75,8 @@ class OutputBuffer {
OutputBuffer(const OutputBuffer &) = delete;
OutputBuffer &operator=(const OutputBuffer &) = delete;

operator StringView() const { return StringView(Buffer, CurrentPosition); }

void reset(char *Buffer_, size_t BufferCapacity_) {
CurrentPosition = 0;
Buffer = Buffer_;
Expand Down
25 changes: 9 additions & 16 deletions llvm/lib/Demangle/MicrosoftDemangle.cpp
Expand Up @@ -970,12 +970,9 @@ void Demangler::memorizeIdentifier(IdentifierNode *Identifier) {
// FIXME: Propagate out-of-memory as an error?
std::terminate();
Identifier->output(OB, OF_Default);
OB << '\0';
char *Name = OB.getBuffer();

StringView Owned = copyString(Name);
StringView Owned = copyString(OB);
memorizeString(Owned);
std::free(Name);
std::free(OB.getBuffer());
}

IdentifierNode *
Expand Down Expand Up @@ -1279,7 +1276,6 @@ Demangler::demangleStringLiteral(StringView &MangledName) {
bool IsWcharT = false;
bool IsNegative = false;
size_t CrcEndPos = 0;
char *ResultBuffer = nullptr;

EncodedStringLiteralNode *Result = Arena.alloc<EncodedStringLiteralNode>();

Expand Down Expand Up @@ -1375,10 +1371,8 @@ Demangler::demangleStringLiteral(StringView &MangledName) {
}
}

OB << '\0';
ResultBuffer = OB.getBuffer();
Result->DecodedString = copyString(ResultBuffer);
std::free(ResultBuffer);
Result->DecodedString = copyString(OB);
std::free(OB.getBuffer());
return Result;

StringLiteralError:
Expand Down Expand Up @@ -1455,10 +1449,9 @@ Demangler::demangleLocallyScopedNamePiece(StringView &MangledName) {
Scope->output(OB, OF_Default);
OB << '\'';
OB << "::`" << Number << "'";
OB << '\0';
char *Result = OB.getBuffer();
Identifier->Name = copyString(Result);
std::free(Result);

Identifier->Name = copyString(OB);
std::free(OB.getBuffer());
return Identifier;
}

Expand Down Expand Up @@ -2322,8 +2315,8 @@ void Demangler::dumpBackReferences() {
TypeNode *T = Backrefs.FunctionParams[I];
T->output(OB, OF_Default);

std::printf(" [%d] - %.*s\n", (int)I, (int)OB.getCurrentPosition(),
OB.getBuffer());
StringView B = OB;
std::printf(" [%d] - %.*s\n", (int)I, (int)B.size(), B.begin());
}
std::free(OB.getBuffer());

Expand Down
4 changes: 2 additions & 2 deletions llvm/lib/Demangle/MicrosoftDemangleNodes.cpp
Expand Up @@ -121,8 +121,8 @@ std::string Node::toString(OutputFlags Flags) const {
OutputBuffer OB;
initializeOutputBuffer(nullptr, nullptr, OB, 1024);
this->output(OB, Flags);
OB << '\0';
std::string Owned(OB.getBuffer());
StringView SV = OB;
std::string Owned(SV.begin(), SV.end());
std::free(OB.getBuffer());
return Owned;
}
Expand Down
3 changes: 2 additions & 1 deletion llvm/unittests/Demangle/ItaniumDemangleTest.cpp
Expand Up @@ -53,7 +53,8 @@ TEST(ItaniumDemangle, MethodOverride) {
}

static std::string toString(OutputBuffer &OB) {
return {OB.getBuffer(), OB.getCurrentPosition()};
StringView SV = OB;
return {SV.begin(), SV.end()};
}

TEST(ItaniumDemangle, HalfType) {
Expand Down
3 changes: 2 additions & 1 deletion llvm/unittests/Demangle/OutputBufferTest.cpp
Expand Up @@ -15,7 +15,8 @@ using namespace llvm;
using llvm::itanium_demangle::OutputBuffer;

static std::string toString(OutputBuffer &OB) {
return {OB.getBuffer(), OB.getCurrentPosition()};
StringView SV = OB;
return {SV.begin(), SV.end()};
}

template <typename T> static std::string printToString(const T &Value) {
Expand Down

0 comments on commit 1066e39

Please sign in to comment.