diff options
author | Martin Storsjo <martin@martin.st> | 2019-09-27 12:23:45 +0000 |
---|---|---|
committer | Martin Storsjo <martin@martin.st> | 2019-09-27 12:23:45 +0000 |
commit | bf6f4e99329ec2e038904e73193f0e9fe2fc128a (patch) | |
tree | a6cf804976ea8e4d882d2880c54ccd59aa63b269 | |
parent | 06bc9d579cacae1f4209635bb2770b61231befbe (diff) | |
download | bcm5719-llvm-bf6f4e99329ec2e038904e73193f0e9fe2fc128a.tar.gz bcm5719-llvm-bf6f4e99329ec2e038904e73193f0e9fe2fc128a.zip |
[LLD] [COFF] Use the unified llvm demangle frontend function. NFC.
Add test cases for some cases where we don't want demangling to happen.
Differential Revision: https://reviews.llvm.org/D67301
llvm-svn: 373075
-rw-r--r-- | lld/COFF/CMakeLists.txt | 1 | ||||
-rw-r--r-- | lld/COFF/Symbols.cpp | 30 | ||||
-rw-r--r-- | lld/Common/Strings.cpp | 17 | ||||
-rw-r--r-- | lld/include/lld/Common/Strings.h | 1 | ||||
-rw-r--r-- | lld/test/COFF/undefined-symbol-itanium-i386.s | 5 | ||||
-rw-r--r-- | lld/test/COFF/undefined-symbol.s | 5 |
6 files changed, 26 insertions, 33 deletions
diff --git a/lld/COFF/CMakeLists.txt b/lld/COFF/CMakeLists.txt index 4a133835932..da2916f0cfc 100644 --- a/lld/COFF/CMakeLists.txt +++ b/lld/COFF/CMakeLists.txt @@ -30,6 +30,7 @@ add_lld_library(lldCOFF DebugInfoCodeView DebugInfoMSF DebugInfoPDB + Demangle LibDriver LTO MC diff --git a/lld/COFF/Symbols.cpp b/lld/COFF/Symbols.cpp index 0b89fc65f78..817ae8b7488 100644 --- a/lld/COFF/Symbols.cpp +++ b/lld/COFF/Symbols.cpp @@ -12,6 +12,7 @@ #include "lld/Common/Memory.h" #include "lld/Common/Strings.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/Demangle/Demangle.h" #include "llvm/Support/Debug.h" #include "llvm/Support/raw_ostream.h" @@ -26,26 +27,25 @@ static_assert(sizeof(SymbolUnion) <= 48, "symbols should be optimized for memory usage"); // Returns a symbol name for an error message. -static std::string demangle(StringRef symName) { +static std::string maybeDemangleSymbol(StringRef symName) { if (config->demangle) { - if (Optional<std::string> s = demangleMSVC(symName)) - return *s; - if (config->mingw) { - StringRef demangleInput = symName; - std::string prefix; - if (demangleInput.consume_front("__imp_")) - prefix = "__declspec(dllimport) "; - if (config->machine == I386) - demangleInput.consume_front("_"); - if (Optional<std::string> s = demangleItanium(demangleInput)) - return prefix + *s; - } + std::string prefix; + StringRef demangleInput = symName; + if (demangleInput.consume_front("__imp_")) + prefix = "__declspec(dllimport) "; + if (config->machine == I386) + demangleInput.consume_front("_"); + std::string demangled = demangle(demangleInput); + if (demangled != demangleInput) + return prefix + demangled; } return symName; } -std::string toString(coff::Symbol &b) { return demangle(b.getName()); } +std::string toString(coff::Symbol &b) { + return maybeDemangleSymbol(b.getName()); +} std::string toCOFFString(const Archive::Symbol &b) { - return demangle(b.getName()); + return maybeDemangleSymbol(b.getName()); } namespace coff { diff --git a/lld/Common/Strings.cpp b/lld/Common/Strings.cpp index 2240f9644e1..5cb44e9a8fe 100644 --- a/lld/Common/Strings.cpp +++ b/lld/Common/Strings.cpp @@ -36,23 +36,6 @@ Optional<std::string> lld::demangleItanium(StringRef name) { return s; } -Optional<std::string> lld::demangleMSVC(StringRef name) { - std::string prefix; - if (name.consume_front("__imp_")) - prefix = "__declspec(dllimport) "; - - // Demangle only C++ names. - if (!name.startswith("?")) - return None; - - char *buf = microsoftDemangle(name.str().c_str(), nullptr, nullptr, nullptr); - if (!buf) - return None; - std::string s(buf); - free(buf); - return prefix + s; -} - StringMatcher::StringMatcher(ArrayRef<StringRef> pat) { for (StringRef s : pat) { Expected<GlobPattern> pat = GlobPattern::create(s); diff --git a/lld/include/lld/Common/Strings.h b/lld/include/lld/Common/Strings.h index ded22dd769b..eb9bd43a478 100644 --- a/lld/include/lld/Common/Strings.h +++ b/lld/include/lld/Common/Strings.h @@ -20,7 +20,6 @@ namespace lld { // Returns a demangled C++ symbol name. If Name is not a mangled // name, it returns Optional::None. llvm::Optional<std::string> demangleItanium(llvm::StringRef name); -llvm::Optional<std::string> demangleMSVC(llvm::StringRef s); std::vector<uint8_t> parseHex(llvm::StringRef s); bool isValidCIdentifier(llvm::StringRef s); diff --git a/lld/test/COFF/undefined-symbol-itanium-i386.s b/lld/test/COFF/undefined-symbol-itanium-i386.s index 228f2d81c1a..478e943bd88 100644 --- a/lld/test/COFF/undefined-symbol-itanium-i386.s +++ b/lld/test/COFF/undefined-symbol-itanium-i386.s @@ -7,6 +7,7 @@ # NODEMANGLE: error: undefined symbol: __Z3fooi # NODEMANGLE: error: undefined symbol: __Z3barPKc # NODEMANGLE: error: undefined symbol: __imp___Z3bazv +# NODEMANGLE: error: undefined symbol: _Z3fooi # CHECK: error: undefined symbol: foo(int) # CHECK-NEXT: >>> referenced by {{.*}}.o:(_main) @@ -18,6 +19,9 @@ # CHECK-EMPTY: # CHECK-NEXT: error: undefined symbol: __declspec(dllimport) baz() # CHECK-NEXT: >>> referenced by {{.*}}.o:(_f2) +# CHECK-EMPTY: +# CHECK-NEXT: error: undefined symbol: _Z3fooi +# CHECK-NEXT: >>> referenced by {{.*}}.o:(_f2) .section .text,"xr",one_only,_main .globl _main @@ -34,3 +38,4 @@ _f1: .globl _f2 _f2: call *__imp___Z3bazv + call _Z3fooi diff --git a/lld/test/COFF/undefined-symbol.s b/lld/test/COFF/undefined-symbol.s index 5fb2511ae25..e3f07ab0739 100644 --- a/lld/test/COFF/undefined-symbol.s +++ b/lld/test/COFF/undefined-symbol.s @@ -7,6 +7,7 @@ # NODEMANGLE: error: undefined symbol: ?foo@@YAHXZ # NODEMANGLE: error: undefined symbol: ?bar@@YAHXZ # NODEMANGLE: error: undefined symbol: __imp_?baz@@YAHXZ +# NODEMANGLE: error: undefined symbol: __imp_undecorated # CHECK: error: undefined symbol: int __cdecl foo(void) # CHECK-NEXT: >>> referenced by {{.*}}.obj:(main) @@ -18,6 +19,9 @@ # CHECK-EMPTY: # CHECK-NEXT: error: undefined symbol: __declspec(dllimport) int __cdecl baz(void) # CHECK-NEXT: >>> referenced by {{.*}}.obj:(f2) +# CHECK-EMPTY: +# CHECK-NEXT: error: undefined symbol: __imp_undecorated +# CHECK-NEXT: >>> referenced by {{.*}}.obj:(f2) .section .text,"xr",one_only,main .globl main @@ -34,3 +38,4 @@ f1: .globl f2 f2: callq *"__imp_?baz@@YAHXZ"(%rip) + callq *__imp_undecorated(%rip) |