mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-08 02:18:43 +00:00
Factor out common code to Common/Strings.cpp.
Differential Revision: https://reviews.llvm.org/D40530 llvm-svn: 319138
This commit is contained in:
parent
3ecd20430c
commit
53fe469162
@ -20,7 +20,7 @@ using namespace lld;
|
||||
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;
|
||||
|
@ -16,7 +16,7 @@
|
||||
|
||||
namespace lld {
|
||||
namespace coff {
|
||||
llvm::Optional<std::string> demangle(llvm::StringRef S);
|
||||
llvm::Optional<std::string> demangleMSVC(llvm::StringRef S);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -21,7 +21,7 @@ using namespace llvm::object;
|
||||
|
||||
// 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();
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ endif()
|
||||
add_lld_library(lldCommon
|
||||
ErrorHandler.cpp
|
||||
Reproduce.cpp
|
||||
Strings.cpp
|
||||
TargetOptionsCommandFlags.cpp
|
||||
Threads.cpp
|
||||
Version.cpp
|
||||
|
32
lld/Common/Strings.cpp
Normal file
32
lld/Common/Strings.cpp
Normal file
@ -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;
|
||||
}
|
@ -60,21 +60,3 @@ bool elf::isValidCIdentifier(StringRef S) {
|
||||
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;
|
||||
}
|
||||
|
@ -66,10 +66,6 @@ private:
|
||||
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()};
|
||||
}
|
||||
|
@ -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 @@ StringMap<std::vector<Symbol *>> &SymbolTable::getDemangledSyms() {
|
||||
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);
|
||||
|
@ -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 @@ void elf::printTraceSymbol(Symbol *Sym) {
|
||||
// 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();
|
||||
}
|
||||
|
23
lld/include/lld/Common/Strings.h
Normal file
23
lld/include/lld/Common/Strings.h
Normal file
@ -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
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user