[llvm] aabeb5e - Revert "[demangler] Simplify OutputBuffer initialization"
Kirill Stoimenov via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 26 13:26:24 PDT 2022
Author: Kirill Stoimenov
Date: 2022-04-26T20:24:06Z
New Revision: aabeb5eb7f0aaa2c80147d904959c882cdeba1e5
URL: https://github.com/llvm/llvm-project/commit/aabeb5eb7f0aaa2c80147d904959c882cdeba1e5
DIFF: https://github.com/llvm/llvm-project/commit/aabeb5eb7f0aaa2c80147d904959c882cdeba1e5.diff
LOG: Revert "[demangler] Simplify OutputBuffer initialization"
Reverting due to a bot failure:
https://lab.llvm.org/buildbot/#/builders/5/builds/22738
This reverts commit 5b3ca24a35e91bf9c19af856e7f92c69b17f989e.
Added:
Modified:
libcxxabi/src/cxa_demangle.cpp
libcxxabi/src/demangle/Utility.h
llvm/include/llvm/Demangle/Utility.h
llvm/lib/Demangle/DLangDemangle.cpp
llvm/lib/Demangle/ItaniumDemangle.cpp
llvm/lib/Demangle/MicrosoftDemangle.cpp
llvm/lib/Demangle/MicrosoftDemangleNodes.cpp
llvm/lib/Demangle/RustDemangle.cpp
Removed:
################################################################################
diff --git a/libcxxabi/src/cxa_demangle.cpp b/libcxxabi/src/cxa_demangle.cpp
index 7baac680074ce..ddab6d33358a5 100644
--- a/libcxxabi/src/cxa_demangle.cpp
+++ b/libcxxabi/src/cxa_demangle.cpp
@@ -386,12 +386,15 @@ __cxa_demangle(const char *MangledName, char *Buf, size_t *N, int *Status) {
int InternalStatus = demangle_success;
Demangler Parser(MangledName, MangledName + std::strlen(MangledName));
+ OutputBuffer O;
+
Node *AST = Parser.parse();
if (AST == nullptr)
InternalStatus = demangle_invalid_mangled_name;
+ else if (!initializeOutputBuffer(Buf, N, O, 1024))
+ InternalStatus = demangle_memory_alloc_failure;
else {
- OutputBuffer O(Buf, N);
assert(Parser.ForwardTemplateRefs.empty());
AST->print(O);
O += '\0';
diff --git a/libcxxabi/src/demangle/Utility.h b/libcxxabi/src/demangle/Utility.h
index 00572880237a0..6e0fa38632c89 100644
--- a/libcxxabi/src/demangle/Utility.h
+++ b/libcxxabi/src/demangle/Utility.h
@@ -69,9 +69,7 @@ class OutputBuffer {
public:
OutputBuffer(char *StartBuf, size_t Size)
- : Buffer(StartBuf), BufferCapacity(Size) {}
- OutputBuffer(char *StartBuf, size_t *SizePtr)
- : OutputBuffer(StartBuf, StartBuf ? *SizePtr : 0) {}
+ : Buffer(StartBuf), CurrentPosition(0), BufferCapacity(Size) {}
OutputBuffer() = default;
// Non-copyable
OutputBuffer(const OutputBuffer &) = delete;
@@ -79,6 +77,12 @@ class OutputBuffer {
operator StringView() const { return StringView(Buffer, CurrentPosition); }
+ void reset(char *Buffer_, size_t BufferCapacity_) {
+ CurrentPosition = 0;
+ Buffer = Buffer_;
+ BufferCapacity = BufferCapacity_;
+ }
+
/// If a ParameterPackExpansion (or similar type) is encountered, the offset
/// into the pack that we're currently printing.
unsigned CurrentPackIndex = std::numeric_limits<unsigned>::max();
@@ -193,6 +197,21 @@ template <class T> class ScopedOverride {
ScopedOverride &operator=(const ScopedOverride &) = delete;
};
+inline bool initializeOutputBuffer(char *Buf, size_t *N, OutputBuffer &OB,
+ size_t InitSize) {
+ size_t BufferSize;
+ if (Buf == nullptr) {
+ Buf = static_cast<char *>(std::malloc(InitSize));
+ if (Buf == nullptr)
+ return false;
+ BufferSize = InitSize;
+ } else
+ BufferSize = *N;
+
+ OB.reset(Buf, BufferSize);
+ return true;
+}
+
DEMANGLE_NAMESPACE_END
#endif
diff --git a/llvm/include/llvm/Demangle/Utility.h b/llvm/include/llvm/Demangle/Utility.h
index 7025469d03531..b17eadcfa3bee 100644
--- a/llvm/include/llvm/Demangle/Utility.h
+++ b/llvm/include/llvm/Demangle/Utility.h
@@ -69,9 +69,7 @@ class OutputBuffer {
public:
OutputBuffer(char *StartBuf, size_t Size)
- : Buffer(StartBuf), BufferCapacity(Size) {}
- OutputBuffer(char *StartBuf, size_t *SizePtr)
- : OutputBuffer(StartBuf, StartBuf ? *SizePtr : 0) {}
+ : Buffer(StartBuf), CurrentPosition(0), BufferCapacity(Size) {}
OutputBuffer() = default;
// Non-copyable
OutputBuffer(const OutputBuffer &) = delete;
@@ -79,6 +77,12 @@ class OutputBuffer {
operator StringView() const { return StringView(Buffer, CurrentPosition); }
+ void reset(char *Buffer_, size_t BufferCapacity_) {
+ CurrentPosition = 0;
+ Buffer = Buffer_;
+ BufferCapacity = BufferCapacity_;
+ }
+
/// If a ParameterPackExpansion (or similar type) is encountered, the offset
/// into the pack that we're currently printing.
unsigned CurrentPackIndex = std::numeric_limits<unsigned>::max();
@@ -193,6 +197,21 @@ template <class T> class ScopedOverride {
ScopedOverride &operator=(const ScopedOverride &) = delete;
};
+inline bool initializeOutputBuffer(char *Buf, size_t *N, OutputBuffer &OB,
+ size_t InitSize) {
+ size_t BufferSize;
+ if (Buf == nullptr) {
+ Buf = static_cast<char *>(std::malloc(InitSize));
+ if (Buf == nullptr)
+ return false;
+ BufferSize = InitSize;
+ } else
+ BufferSize = *N;
+
+ OB.reset(Buf, BufferSize);
+ return true;
+}
+
DEMANGLE_NAMESPACE_END
#endif
diff --git a/llvm/lib/Demangle/DLangDemangle.cpp b/llvm/lib/Demangle/DLangDemangle.cpp
index b747b0f9cc677..7cecd80070878 100644
--- a/llvm/lib/Demangle/DLangDemangle.cpp
+++ b/llvm/lib/Demangle/DLangDemangle.cpp
@@ -548,6 +548,9 @@ char *llvm::dlangDemangle(const char *MangledName) {
return nullptr;
OutputBuffer Demangled;
+ if (!initializeOutputBuffer(nullptr, nullptr, Demangled, 1024))
+ return nullptr;
+
if (strcmp(MangledName, "_Dmain") == 0) {
Demangled << "D main";
} else {
diff --git a/llvm/lib/Demangle/ItaniumDemangle.cpp b/llvm/lib/Demangle/ItaniumDemangle.cpp
index 9b646ea800aa6..1c9209d8f3693 100644
--- a/llvm/lib/Demangle/ItaniumDemangle.cpp
+++ b/llvm/lib/Demangle/ItaniumDemangle.cpp
@@ -375,12 +375,15 @@ char *llvm::itaniumDemangle(const char *MangledName, char *Buf,
int InternalStatus = demangle_success;
Demangler Parser(MangledName, MangledName + std::strlen(MangledName));
+ OutputBuffer OB;
+
Node *AST = Parser.parse();
if (AST == nullptr)
InternalStatus = demangle_invalid_mangled_name;
+ else if (!initializeOutputBuffer(Buf, N, OB, 1024))
+ InternalStatus = demangle_memory_alloc_failure;
else {
- OutputBuffer OB(Buf, N);
assert(Parser.ForwardTemplateRefs.empty());
AST->print(OB);
OB += '\0';
@@ -424,7 +427,9 @@ bool ItaniumPartialDemangler::partialDemangle(const char *MangledName) {
}
static char *printNode(const Node *RootNode, char *Buf, size_t *N) {
- OutputBuffer OB(Buf, N);
+ OutputBuffer OB;
+ if (!initializeOutputBuffer(Buf, N, OB, 128))
+ return nullptr;
RootNode->print(OB);
OB += '\0';
if (N != nullptr)
@@ -467,7 +472,9 @@ char *ItaniumPartialDemangler::getFunctionDeclContextName(char *Buf,
return nullptr;
const Node *Name = static_cast<const FunctionEncoding *>(RootNode)->getName();
- OutputBuffer OB(Buf, N);
+ OutputBuffer OB;
+ if (!initializeOutputBuffer(Buf, N, OB, 128))
+ return nullptr;
KeepGoingLocalFunction:
while (true) {
@@ -518,7 +525,9 @@ char *ItaniumPartialDemangler::getFunctionParameters(char *Buf,
return nullptr;
NodeArray Params = static_cast<FunctionEncoding *>(RootNode)->getParams();
- OutputBuffer OB(Buf, N);
+ OutputBuffer OB;
+ if (!initializeOutputBuffer(Buf, N, OB, 128))
+ return nullptr;
OB += '(';
Params.printWithComma(OB);
@@ -534,7 +543,9 @@ char *ItaniumPartialDemangler::getFunctionReturnType(
if (!isFunction())
return nullptr;
- OutputBuffer OB(Buf, N);
+ OutputBuffer OB;
+ if (!initializeOutputBuffer(Buf, N, OB, 128))
+ return nullptr;
if (const Node *Ret =
static_cast<const FunctionEncoding *>(RootNode)->getReturnType())
diff --git a/llvm/lib/Demangle/MicrosoftDemangle.cpp b/llvm/lib/Demangle/MicrosoftDemangle.cpp
index 26087a5b444c2..aca8cf7a0a58c 100644
--- a/llvm/lib/Demangle/MicrosoftDemangle.cpp
+++ b/llvm/lib/Demangle/MicrosoftDemangle.cpp
@@ -966,6 +966,9 @@ void Demangler::memorizeIdentifier(IdentifierNode *Identifier) {
// Render this class template name into a string buffer so that we can
// memorize it for the purpose of back-referencing.
OutputBuffer OB;
+ if (!initializeOutputBuffer(nullptr, nullptr, OB, 1024))
+ // FIXME: Propagate out-of-memory as an error?
+ std::terminate();
Identifier->output(OB, OF_Default);
StringView Owned = copyString(OB);
memorizeString(Owned);
@@ -1276,6 +1279,11 @@ Demangler::demangleStringLiteral(StringView &MangledName) {
EncodedStringLiteralNode *Result = Arena.alloc<EncodedStringLiteralNode>();
+ // Must happen before the first `goto StringLiteralError`.
+ if (!initializeOutputBuffer(nullptr, nullptr, OB, 1024))
+ // FIXME: Propagate out-of-memory as an error?
+ std::terminate();
+
// Prefix indicating the beginning of a string literal
if (!MangledName.consumeFront("@_"))
goto StringLiteralError;
@@ -1434,6 +1442,9 @@ Demangler::demangleLocallyScopedNamePiece(StringView &MangledName) {
// Render the parent symbol's name into a buffer.
OutputBuffer OB;
+ if (!initializeOutputBuffer(nullptr, nullptr, OB, 1024))
+ // FIXME: Propagate out-of-memory as an error?
+ std::terminate();
OB << '`';
Scope->output(OB, OF_Default);
OB << '\'';
@@ -2296,6 +2307,8 @@ void Demangler::dumpBackReferences() {
// Create an output stream so we can render each type.
OutputBuffer OB;
+ if (!initializeOutputBuffer(nullptr, nullptr, OB, 1024))
+ std::terminate();
for (size_t I = 0; I < Backrefs.FunctionParamCount; ++I) {
OB.setCurrentPosition(0);
@@ -2322,6 +2335,7 @@ char *llvm::microsoftDemangle(const char *MangledName, size_t *NMangled,
char *Buf, size_t *N,
int *Status, MSDemangleFlags Flags) {
Demangler D;
+ OutputBuffer OB;
StringView Name{MangledName};
SymbolNode *AST = D.parse(Name);
@@ -2346,8 +2360,9 @@ char *llvm::microsoftDemangle(const char *MangledName, size_t *NMangled,
int InternalStatus = demangle_success;
if (D.Error)
InternalStatus = demangle_invalid_mangled_name;
+ else if (!initializeOutputBuffer(Buf, N, OB, 1024))
+ InternalStatus = demangle_memory_alloc_failure;
else {
- OutputBuffer OB(Buf, N);
AST->output(OB, OF);
OB += '\0';
if (N != nullptr)
diff --git a/llvm/lib/Demangle/MicrosoftDemangleNodes.cpp b/llvm/lib/Demangle/MicrosoftDemangleNodes.cpp
index 975649f28ad21..494cdabad41f3 100644
--- a/llvm/lib/Demangle/MicrosoftDemangleNodes.cpp
+++ b/llvm/lib/Demangle/MicrosoftDemangleNodes.cpp
@@ -119,6 +119,7 @@ static void outputCallingConvention(OutputBuffer &OB, CallingConv CC) {
std::string Node::toString(OutputFlags Flags) const {
OutputBuffer OB;
+ initializeOutputBuffer(nullptr, nullptr, OB, 1024);
this->output(OB, Flags);
StringView SV = OB;
std::string Owned(SV.begin(), SV.end());
diff --git a/llvm/lib/Demangle/RustDemangle.cpp b/llvm/lib/Demangle/RustDemangle.cpp
index 8c01155127d85..32b10db2a968d 100644
--- a/llvm/lib/Demangle/RustDemangle.cpp
+++ b/llvm/lib/Demangle/RustDemangle.cpp
@@ -157,6 +157,9 @@ char *llvm::rustDemangle(const char *MangledName) {
return nullptr;
Demangler D;
+ if (!initializeOutputBuffer(nullptr, nullptr, D.Output, 1024))
+ return nullptr;
+
if (!D.demangle(Mangled)) {
std::free(D.Output.getBuffer());
return nullptr;
More information about the llvm-commits
mailing list