Factor out common code to Common/Strings.cpp.
Differential Revision: https://reviews.llvm.org/D40530
llvm-svn: 319138
diff --git a/lld/COFF/Strings.cpp b/lld/COFF/Strings.cpp
index 84f9b9a..89b9c51 100644
--- a/lld/COFF/Strings.cpp
+++ b/lld/COFF/Strings.cpp
@@ -20,7 +20,7 @@
using namespace lld::coff;
using namespace llvm;
-Optional<std::string> coff::demangle(StringRef S) {
+Optional<std::string> coff::demangleMSVC(StringRef S) {
#if defined(_MSC_VER)
// UnDecorateSymbolName is not thread-safe, so we need a mutex.
static std::mutex Mu;
diff --git a/lld/COFF/Strings.h b/lld/COFF/Strings.h
index 1f85f3e..67fc1c7 100644
--- a/lld/COFF/Strings.h
+++ b/lld/COFF/Strings.h
@@ -16,7 +16,7 @@
namespace lld {
namespace coff {
-llvm::Optional<std::string> demangle(llvm::StringRef S);
+llvm::Optional<std::string> demangleMSVC(llvm::StringRef S);
}
}
diff --git a/lld/COFF/Symbols.cpp b/lld/COFF/Symbols.cpp
index f15607b..22a2ce6 100644
--- a/lld/COFF/Symbols.cpp
+++ b/lld/COFF/Symbols.cpp
@@ -21,7 +21,7 @@
// Returns a symbol name for an error message.
std::string lld::toString(coff::Symbol &B) {
- if (Optional<std::string> S = coff::demangle(B.getName()))
+ if (Optional<std::string> S = coff::demangleMSVC(B.getName()))
return ("\"" + *S + "\" (" + B.getName() + ")").str();
return B.getName();
}
diff --git a/lld/Common/CMakeLists.txt b/lld/Common/CMakeLists.txt
index 3d19fe9..e0ff979 100644
--- a/lld/Common/CMakeLists.txt
+++ b/lld/Common/CMakeLists.txt
@@ -5,6 +5,7 @@
add_lld_library(lldCommon
ErrorHandler.cpp
Reproduce.cpp
+ Strings.cpp
TargetOptionsCommandFlags.cpp
Threads.cpp
Version.cpp
diff --git a/lld/Common/Strings.cpp b/lld/Common/Strings.cpp
new file mode 100644
index 0000000..6cd4ad8
--- /dev/null
+++ b/lld/Common/Strings.cpp
@@ -0,0 +1,32 @@
+//===- Strings.cpp -------------------------------------------------------===//
+//
+// The LLVM Linker
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "lld/Common/Strings.h"
+#include "llvm/Demangle/Demangle.h"
+
+using namespace llvm;
+using namespace lld;
+
+// Returns the demangled C++ symbol name for Name.
+Optional<std::string> lld::demangleItanium(StringRef Name) {
+ // itaniumDemangle can be used to demangle strings other than symbol
+ // names which do not necessarily start with "_Z". Name can be
+ // either a C or C++ symbol. Don't call itaniumDemangle if the name
+ // does not look like a C++ symbol name to avoid getting unexpected
+ // result for a C symbol that happens to match a mangled type name.
+ if (!Name.startswith("_Z"))
+ return None;
+
+ char *Buf = itaniumDemangle(Name.str().c_str(), nullptr, nullptr, nullptr);
+ if (!Buf)
+ return None;
+ std::string S(Buf);
+ free(Buf);
+ return S;
+}
diff --git a/lld/ELF/Strings.cpp b/lld/ELF/Strings.cpp
index 909a306..0ef33a1 100644
--- a/lld/ELF/Strings.cpp
+++ b/lld/ELF/Strings.cpp
@@ -60,21 +60,3 @@
std::all_of(S.begin() + 1, S.end(),
[](char C) { return C == '_' || isAlnum(C); });
}
-
-// Returns the demangled C++ symbol name for Name.
-Optional<std::string> elf::demangle(StringRef Name) {
- // itaniumDemangle can be used to demangle strings other than symbol
- // names which do not necessarily start with "_Z". Name can be
- // either a C or C++ symbol. Don't call itaniumDemangle if the name
- // does not look like a C++ symbol name to avoid getting unexpected
- // result for a C symbol that happens to match a mangled type name.
- if (!Name.startswith("_Z"))
- return None;
-
- char *Buf = itaniumDemangle(Name.str().c_str(), nullptr, nullptr, nullptr);
- if (!Buf)
- return None;
- std::string S(Buf);
- free(Buf);
- return S;
-}
diff --git a/lld/ELF/Strings.h b/lld/ELF/Strings.h
index 3c7e744..5009df6 100644
--- a/lld/ELF/Strings.h
+++ b/lld/ELF/Strings.h
@@ -66,10 +66,6 @@
std::vector<llvm::GlobPattern> Patterns;
};
-// Returns a demangled C++ symbol name. If Name is not a mangled
-// name, it returns Optional::None.
-llvm::Optional<std::string> demangle(StringRef Name);
-
inline ArrayRef<uint8_t> toArrayRef(StringRef S) {
return {(const uint8_t *)S.data(), S.size()};
}
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp
index 86c506a..08a6d2f 100644
--- a/lld/ELF/SymbolTable.cpp
+++ b/lld/ELF/SymbolTable.cpp
@@ -21,6 +21,7 @@
#include "Symbols.h"
#include "SyntheticSections.h"
#include "lld/Common/ErrorHandler.h"
+#include "lld/Common/Strings.h"
#include "llvm/ADT/STLExtras.h"
using namespace llvm;
@@ -631,7 +632,7 @@
for (Symbol *Sym : SymVector) {
if (!Sym->isDefined())
continue;
- if (Optional<std::string> S = demangle(Sym->getName()))
+ if (Optional<std::string> S = demangleItanium(Sym->getName()))
(*DemangledSyms)[*S].push_back(Sym);
else
(*DemangledSyms)[Sym->getName()].push_back(Sym);
diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp
index 9822a2a..203551c 100644
--- a/lld/ELF/Symbols.cpp
+++ b/lld/ELF/Symbols.cpp
@@ -11,12 +11,12 @@
#include "InputFiles.h"
#include "InputSection.h"
#include "OutputSections.h"
-#include "Strings.h"
#include "SyntheticSections.h"
#include "Target.h"
#include "Writer.h"
#include "lld/Common/ErrorHandler.h"
+#include "lld/Common/Strings.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/Support/Path.h"
#include <cstring>
@@ -315,7 +315,7 @@
// Returns a symbol for an error message.
std::string lld::toString(const Symbol &B) {
if (Config->Demangle)
- if (Optional<std::string> S = demangle(B.getName()))
+ if (Optional<std::string> S = demangleItanium(B.getName()))
return *S;
return B.getName();
}
diff --git a/lld/include/lld/Common/Strings.h b/lld/include/lld/Common/Strings.h
new file mode 100644
index 0000000..1a63f75f
--- /dev/null
+++ b/lld/include/lld/Common/Strings.h
@@ -0,0 +1,23 @@
+//===- Strings.h ------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Linker
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLD_STRINGS_H
+#define LLD_STRINGS_H
+
+#include "llvm/ADT/Optional.h"
+#include "llvm/ADT/StringRef.h"
+#include <string>
+
+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);
+}
+
+#endif
diff --git a/lld/wasm/Strings.cpp b/lld/wasm/Strings.cpp
index fab03cc..dfc3254 100644
--- a/lld/wasm/Strings.cpp
+++ b/lld/wasm/Strings.cpp
@@ -9,32 +9,14 @@
#include "Strings.h"
#include "Config.h"
+#include "lld/Common/Strings.h"
#include "llvm/ADT/StringRef.h"
-#include "llvm/Demangle/Demangle.h"
using namespace llvm;
-// Returns the demangled C++ symbol name for Name.
-Optional<std::string> lld::wasm::demangle(StringRef Name) {
- // itaniumDemangle can be used to demangle strings other than symbol
- // names which do not necessarily start with "_Z". Name can be
- // either a C or C++ symbol. Don't call itaniumDemangle if the name
- // does not look like a C++ symbol name to avoid getting unexpected
- // result for a C symbol that happens to match a mangled type name.
- if (!Name.startswith("_Z"))
- return None;
-
- char *Buf = itaniumDemangle(Name.str().c_str(), nullptr, nullptr, nullptr);
- if (!Buf)
- return None;
- std::string S(Buf);
- free(Buf);
- return S;
-}
-
std::string lld::wasm::displayName(StringRef Name) {
if (Config->Demangle)
- if (Optional<std::string> S = demangle(Name))
+ if (Optional<std::string> S = demangleItanium(Name))
return "`" + *S + "'";
return Name;
}
diff --git a/lld/wasm/Strings.h b/lld/wasm/Strings.h
index fd46afb..5362827 100644
--- a/lld/wasm/Strings.h
+++ b/lld/wasm/Strings.h
@@ -17,10 +17,6 @@
namespace lld {
namespace wasm {
-// Returns a demangled C++ symbol name. If Name is not a mangled
-// name, it returns Optional::None.
-llvm::Optional<std::string> demangle(llvm::StringRef Name);
-
std::string displayName(llvm::StringRef Name);
} // namespace wasm