diff options
author | Daniel Paoliello <danpao@microsoft.com> | 2024-11-13 15:35:03 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-11-13 15:35:03 -0800 |
commit | fa0cf3d39e03c3c63478f30a4c8c17d119b54b7f (patch) | |
tree | 14333d1370f514eb74b076e0a8817a3e5be60a4d /llvm/lib/Demangle/MicrosoftDemangle.cpp | |
parent | ec066d30e29fce388b1722971970d73ec65f14fb (diff) | |
download | llvm-fa0cf3d39e03c3c63478f30a4c8c17d119b54b7f.zip llvm-fa0cf3d39e03c3c63478f30a4c8c17d119b54b7f.tar.gz llvm-fa0cf3d39e03c3c63478f30a4c8c17d119b54b7f.tar.bz2 |
[llvm][aarch64] Fix Arm64EC name mangling algorithm (#115567)
Arm64EC uses a special name mangling mode that adds `$$h` between the
symbol name and its type. In MSVC's name mangling `@` is used to
separate the name and type BUT it is also used for other purposes, such
as the separator between paths in a fully qualified name.
The original algorithm was quite fragile and made assumptions that
didn't hold true for all MSVC mangled symbols, so instead of trying to
improve this algorithm we are now using the demangler to indicate where
the insertion point should be (i.e., to parse the fully-qualified name
and return the current string offset).
Also fixed `isArm64ECMangledFunctionName` to search for `@$$h` since the
`$$h` must always be after a `@`.
Fixes #115231
Diffstat (limited to 'llvm/lib/Demangle/MicrosoftDemangle.cpp')
-rw-r--r-- | llvm/lib/Demangle/MicrosoftDemangle.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/llvm/lib/Demangle/MicrosoftDemangle.cpp b/llvm/lib/Demangle/MicrosoftDemangle.cpp index aa65f3b..6be8b0f 100644 --- a/llvm/lib/Demangle/MicrosoftDemangle.cpp +++ b/llvm/lib/Demangle/MicrosoftDemangle.cpp @@ -24,6 +24,7 @@ #include <array> #include <cctype> #include <cstdio> +#include <optional> #include <string_view> #include <tuple> @@ -2428,6 +2429,24 @@ void Demangler::dumpBackReferences() { std::printf("\n"); } +std::optional<size_t> +llvm::getArm64ECInsertionPointInMangledName(std::string_view MangledName) { + std::string_view ProcessedName{MangledName}; + + // We only support this for MSVC-style C++ symbols. + if (!consumeFront(ProcessedName, '?')) + return std::nullopt; + + // The insertion point is just after the name of the symbol, so parse that to + // remove it from the processed name. + Demangler D; + D.demangleFullyQualifiedSymbolName(ProcessedName); + if (D.Error) + return std::nullopt; + + return MangledName.length() - ProcessedName.length(); +} + char *llvm::microsoftDemangle(std::string_view MangledName, size_t *NMangled, int *Status, MSDemangleFlags Flags) { Demangler D; |