[llvm] r342330 - Update microsoftDemangle() to work more like itaniumDemangle().
Nico Weber via llvm-commits
llvm-commits at lists.llvm.org
Sat Sep 15 11:24:20 PDT 2018
Author: nico
Date: Sat Sep 15 11:24:20 2018
New Revision: 342330
URL: http://llvm.org/viewvc/llvm-project?rev=342330&view=rev
Log:
Update microsoftDemangle() to work more like itaniumDemangle().
* Use same method of initializing the output stream and its buffer
* Allow a nullptr Status pointer
* Don't print the mangled name on demangling error
* Write to N (if it is non-nullptr)
Differential Revision: https://reviews.llvm.org/D52104
Modified:
llvm/trunk/include/llvm/Demangle/Utility.h
llvm/trunk/lib/Demangle/ItaniumDemangle.cpp
llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp
Modified: llvm/trunk/include/llvm/Demangle/Utility.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Demangle/Utility.h?rev=342330&r1=342329&r2=342330&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Demangle/Utility.h (original)
+++ llvm/trunk/include/llvm/Demangle/Utility.h Sat Sep 15 11:24:20 2018
@@ -70,22 +70,6 @@ public:
BufferCapacity = BufferCapacity_;
}
- /// Create an OutputStream from a buffer and a size. If either of these are
- /// null a buffer is allocated.
- static OutputStream create(char *StartBuf, size_t *Size, size_t AllocSize) {
- OutputStream Result;
-
- if (!StartBuf || !Size) {
- StartBuf = static_cast<char *>(std::malloc(AllocSize));
- if (StartBuf == nullptr)
- std::terminate();
- Size = &AllocSize;
- }
-
- Result.reset(StartBuf, *Size);
- return Result;
- }
-
/// 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();
@@ -185,4 +169,19 @@ public:
SwapAndRestore &operator=(const SwapAndRestore &) = delete;
};
+inline bool initializeOutputStream(char *Buf, size_t *N, OutputStream &S,
+ size_t InitSize) {
+ size_t BufferSize;
+ if (Buf == nullptr) {
+ Buf = static_cast<char *>(std::malloc(InitSize));
+ if (Buf == nullptr)
+ return true;
+ BufferSize = InitSize;
+ } else
+ BufferSize = *N;
+
+ S.reset(Buf, BufferSize);
+ return false;
+}
+
#endif
Modified: llvm/trunk/lib/Demangle/ItaniumDemangle.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Demangle/ItaniumDemangle.cpp?rev=342330&r1=342329&r2=342330&view=diff
==============================================================================
--- llvm/trunk/lib/Demangle/ItaniumDemangle.cpp (original)
+++ llvm/trunk/lib/Demangle/ItaniumDemangle.cpp Sat Sep 15 11:24:20 2018
@@ -310,21 +310,6 @@ public:
return Alloc.allocate(sizeof(Node *) * sz);
}
};
-
-bool initializeOutputStream(char *Buf, size_t *N, OutputStream &S,
- size_t InitSize) {
- size_t BufferSize;
- if (Buf == nullptr) {
- Buf = static_cast<char *>(std::malloc(InitSize));
- if (Buf == nullptr)
- return true;
- BufferSize = InitSize;
- } else
- BufferSize = *N;
-
- S.reset(Buf, BufferSize);
- return false;
-}
} // unnamed namespace
//===----------------------------------------------------------------------===//
Modified: llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp?rev=342330&r1=342329&r2=342330&view=diff
==============================================================================
--- llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp (original)
+++ llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp Sat Sep 15 11:24:20 2018
@@ -1016,7 +1016,10 @@ NamedIdentifierNode *Demangler::demangle
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.
- OutputStream OS = OutputStream::create(nullptr, nullptr, 1024);
+ OutputStream OS;
+ if (initializeOutputStream(nullptr, nullptr, OS, 1024))
+ // FIXME: Propagate out-of-memory as an error?
+ std::terminate();
Identifier->output(OS, OF_Default);
OS << '\0';
char *Name = OS.getBuffer();
@@ -1346,7 +1349,9 @@ Demangler::demangleStringLiteral(StringV
if (MangledName.empty())
goto StringLiteralError;
- OS = OutputStream::create(nullptr, nullptr, 1024);
+ if (initializeOutputStream(nullptr, nullptr, OS, 1024))
+ // FIXME: Propagate out-of-memory as an error?
+ std::terminate();
if (IsWcharT) {
Result->Char = CharKind::Wchar;
if (StringByteSize > 64)
@@ -1466,7 +1471,10 @@ Demangler::demangleLocallyScopedNamePiec
return nullptr;
// Render the parent symbol's name into a buffer.
- OutputStream OS = OutputStream::create(nullptr, nullptr, 1024);
+ OutputStream OS;
+ if (initializeOutputStream(nullptr, nullptr, OS, 1024))
+ // FIXME: Propagate out-of-memory as an error?
+ std::terminate();
OS << '`';
Scope->output(OS, OF_Default);
OS << '\'';
@@ -2289,7 +2297,9 @@ void Demangler::dumpBackReferences() {
(int)Backrefs.FunctionParamCount);
// Create an output stream so we can render each type.
- OutputStream OS = OutputStream::create(nullptr, 0, 1024);
+ OutputStream OS;
+ if (initializeOutputStream(nullptr, nullptr, OS, 1024))
+ std::terminate();
for (size_t I = 0; I < Backrefs.FunctionParamCount; ++I) {
OS.setCurrentPosition(0);
@@ -2314,21 +2324,29 @@ void Demangler::dumpBackReferences() {
char *llvm::microsoftDemangle(const char *MangledName, char *Buf, size_t *N,
int *Status, MSDemangleFlags Flags) {
+ int InternalStatus = demangle_success;
Demangler D;
+ OutputStream S;
+
StringView Name{MangledName};
- SymbolNode *S = D.parse(Name);
+ SymbolNode *AST = D.parse(Name);
if (Flags & MSDF_DumpBackrefs)
D.dumpBackReferences();
- OutputStream OS = OutputStream::create(Buf, N, 1024);
- if (D.Error) {
- OS << MangledName;
- *Status = llvm::demangle_invalid_mangled_name;
- } else {
- S->output(OS, OF_Default);
- *Status = llvm::demangle_success;
+
+ if (D.Error)
+ InternalStatus = demangle_invalid_mangled_name;
+ else if (initializeOutputStream(Buf, N, S, 1024))
+ InternalStatus = demangle_memory_alloc_failure;
+ else {
+ AST->output(S, OF_Default);
+ S += '\0';
+ if (N != nullptr)
+ *N = S.getCurrentPosition();
+ Buf = S.getBuffer();
}
- OS << '\0';
- return OS.getBuffer();
+ if (Status)
+ *Status = InternalStatus;
+ return InternalStatus == demangle_success ? Buf : nullptr;
}
More information about the llvm-commits
mailing list