diff options
author | Rui Ueyama <ruiu@google.com> | 2018-02-28 17:38:19 +0000 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2018-02-28 17:38:19 +0000 |
commit | ee17371897d449d2d5ae6643d820a499f95d8724 (patch) | |
tree | a2c9ecbb92b4476b6642fa90a2412723106596ee /lld/Common | |
parent | aa2022e74f50c537da62173c4f03fe54d59b0100 (diff) | |
download | bcm5719-llvm-ee17371897d449d2d5ae6643d820a499f95d8724.tar.gz bcm5719-llvm-ee17371897d449d2d5ae6643d820a499f95d8724.zip |
Merge {COFF,ELF}/Strings.cpp to Common/Strings.cpp.
This should resolve the issue that lld build fails in some hosts
that uses case-insensitive file system.
Differential Revision: https://reviews.llvm.org/D43788
llvm-svn: 326339
Diffstat (limited to 'lld/Common')
-rw-r--r-- | lld/Common/Strings.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/lld/Common/Strings.cpp b/lld/Common/Strings.cpp index 6cd4ad8d600..16c4edb0885 100644 --- a/lld/Common/Strings.cpp +++ b/lld/Common/Strings.cpp @@ -8,7 +8,19 @@ //===----------------------------------------------------------------------===// #include "lld/Common/Strings.h" +#include "lld/Common/ErrorHandler.h" +#include "lld/Common/LLVM.h" #include "llvm/Demangle/Demangle.h" +#include "llvm/Support/GlobPattern.h" +#include <algorithm> +#include <mutex> +#include <vector> + +#if defined(_MSC_VER) +#include <DbgHelp.h> +#include <Windows.h> +#pragma comment(lib, "dbghelp.lib") +#endif using namespace llvm; using namespace lld; @@ -30,3 +42,57 @@ Optional<std::string> lld::demangleItanium(StringRef Name) { free(Buf); return S; } + +Optional<std::string> lld::demangleMSVC(StringRef S) { +#if defined(_MSC_VER) + // UnDecorateSymbolName is not thread-safe, so we need a mutex. + static std::mutex Mu; + std::lock_guard<std::mutex> Lock(Mu); + + char Buf[4096]; + if (S.startswith("?")) + if (size_t Len = UnDecorateSymbolName(S.str().c_str(), Buf, sizeof(Buf), 0)) + return std::string(Buf, Len); +#endif + return None; +} + +StringMatcher::StringMatcher(ArrayRef<StringRef> Pat) { + for (StringRef S : Pat) { + Expected<GlobPattern> Pat = GlobPattern::create(S); + if (!Pat) + error(toString(Pat.takeError())); + else + Patterns.push_back(*Pat); + } +} + +bool StringMatcher::match(StringRef S) const { + for (const GlobPattern &Pat : Patterns) + if (Pat.match(S)) + return true; + return false; +} + +// Converts a hex string (e.g. "deadbeef") to a vector. +std::vector<uint8_t> lld::parseHex(StringRef S) { + std::vector<uint8_t> Hex; + while (!S.empty()) { + StringRef B = S.substr(0, 2); + S = S.substr(2); + uint8_t H; + if (!to_integer(B, H, 16)) { + error("not a hexadecimal value: " + B); + return {}; + } + Hex.push_back(H); + } + return Hex; +} + +// Returns true if S is valid as a C language identifier. +bool lld::isValidCIdentifier(StringRef S) { + return !S.empty() && (isAlpha(S[0]) || S[0] == '_') && + std::all_of(S.begin() + 1, S.end(), + [](char C) { return C == '_' || isAlnum(C); }); +} |