2017-11-28 10:15:26 +08:00
|
|
|
//===- Strings.cpp -------------------------------------------------------===//
|
|
|
|
//
|
2019-01-19 16:50:56 +08:00
|
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
2017-11-28 10:15:26 +08:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#include "lld/Common/Strings.h"
|
2018-03-01 01:38:19 +08:00
|
|
|
#include "lld/Common/ErrorHandler.h"
|
|
|
|
#include "lld/Common/LLVM.h"
|
2017-11-28 10:15:26 +08:00
|
|
|
#include "llvm/Demangle/Demangle.h"
|
2020-05-28 21:37:17 +08:00
|
|
|
#include "llvm/Support/FileSystem.h"
|
2018-03-01 01:38:19 +08:00
|
|
|
#include "llvm/Support/GlobPattern.h"
|
|
|
|
#include <algorithm>
|
|
|
|
#include <mutex>
|
|
|
|
#include <vector>
|
|
|
|
|
2017-11-28 10:15:26 +08:00
|
|
|
using namespace llvm;
|
|
|
|
using namespace lld;
|
|
|
|
|
2019-09-27 20:24:18 +08:00
|
|
|
// Returns the demangled C++ symbol name for name.
|
|
|
|
std::string lld::demangleItanium(StringRef name) {
|
clang+lld: Improve clang+ld.darwinnew.lld interaction, pass -demangle
This patch:
- adds an ld64.lld.darwinnew symlink for lld, to go with f2710d4b576,
so that `clang -fuse-ld=lld.darwinnew` can be used to test new
Mach-O lld while it's in bring-up. (The expectation is that we'll
remove this again once new Mach-O lld is the defauld and only Mach-O
lld.)
- lets the clang driver know if the linker is lld (currently
only triggered if `-fuse-ld=lld` or `-fuse-ld=lld.darwinnew` is
passed). Currently only used for the next point, but could be used
to implement other features that need close coordination between
compiler and linker, e.g. having a diag for calling `clang++` instead
of `clang` when link errors are caused by a missing C++ stdlib.
- lets the clang driver pass `-demangle` to Mach-O lld (both old and
new), in addition to ld64
- implements -demangle for new Mach-O lld
- changes demangleItanium() to accept _Z, __Z, ___Z, ____Z prefixes
(and updates one test added in D68014). Mach-O has an extra
underscore for symbols, and the three (or, on Mach-O, four)
underscores are used for block names.
Differential Revision: https://reviews.llvm.org/D91884
2020-11-21 02:57:44 +08:00
|
|
|
// demangleItanium() can be called for all symbols. Only demangle C++ symbols,
|
|
|
|
// to avoid getting unexpected result for a C symbol that happens to match a
|
|
|
|
// mangled type name such as "Pi" (which would demangle to "int*").
|
|
|
|
if (!name.startswith("_Z") && !name.startswith("__Z") &&
|
|
|
|
!name.startswith("___Z") && !name.startswith("____Z"))
|
2020-01-29 03:23:46 +08:00
|
|
|
return std::string(name);
|
2017-11-28 10:15:26 +08:00
|
|
|
|
2020-01-29 03:23:46 +08:00
|
|
|
return demangle(std::string(name));
|
2017-11-28 10:15:26 +08:00
|
|
|
}
|
2018-03-01 01:38:19 +08:00
|
|
|
|
[lld/ELF] PR44498: Support input filename in double quote
Summary:
Linker scripts allow filenames to be put in double quotes to prevent
characters in filenames that are part of the linker script syntax from
having their special meaning. Case in point the * wildcard character.
Availability of double quoting filenames also allows to fix a failure in
ELF/linkerscript/filename-spec.s when the path contain a @ which the
lexer consider as a special characters and thus break up a filename
containing it. This may happens under Jenkins which createspath such as
pipeline@2.
To avoid the need for escaping GlobPattern metacharacters in filename
in double quotes, GlobPattern::create is augmented with a new parameter
to request literal matching instead of relying on the presence of a
wildcard character in the pattern.
Reviewers: jhenderson, MaskRay, evgeny777, espindola, alexshap
Reviewed By: MaskRay
Subscribers: peter.smith, grimar, ruiu, emaste, arichardson, hiraditya, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D72517
2020-01-11 00:56:07 +08:00
|
|
|
SingleStringMatcher::SingleStringMatcher(StringRef Pattern) {
|
|
|
|
if (Pattern.size() > 2 && Pattern.startswith("\"") &&
|
|
|
|
Pattern.endswith("\"")) {
|
|
|
|
ExactMatch = true;
|
|
|
|
ExactPattern = Pattern.substr(1, Pattern.size() - 2);
|
|
|
|
} else {
|
|
|
|
Expected<GlobPattern> Glob = GlobPattern::create(Pattern);
|
|
|
|
if (!Glob) {
|
|
|
|
error(toString(Glob.takeError()));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
ExactMatch = false;
|
|
|
|
GlobPatternMatcher = *Glob;
|
2018-03-01 01:38:19 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
[lld/ELF] PR44498: Support input filename in double quote
Summary:
Linker scripts allow filenames to be put in double quotes to prevent
characters in filenames that are part of the linker script syntax from
having their special meaning. Case in point the * wildcard character.
Availability of double quoting filenames also allows to fix a failure in
ELF/linkerscript/filename-spec.s when the path contain a @ which the
lexer consider as a special characters and thus break up a filename
containing it. This may happens under Jenkins which createspath such as
pipeline@2.
To avoid the need for escaping GlobPattern metacharacters in filename
in double quotes, GlobPattern::create is augmented with a new parameter
to request literal matching instead of relying on the presence of a
wildcard character in the pattern.
Reviewers: jhenderson, MaskRay, evgeny777, espindola, alexshap
Reviewed By: MaskRay
Subscribers: peter.smith, grimar, ruiu, emaste, arichardson, hiraditya, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D72517
2020-01-11 00:56:07 +08:00
|
|
|
bool SingleStringMatcher::match(StringRef s) const {
|
|
|
|
return ExactMatch ? (ExactPattern == s) : GlobPatternMatcher.match(s);
|
|
|
|
}
|
|
|
|
|
2018-03-01 01:38:19 +08:00
|
|
|
bool StringMatcher::match(StringRef s) const {
|
[lld/ELF] PR44498: Support input filename in double quote
Summary:
Linker scripts allow filenames to be put in double quotes to prevent
characters in filenames that are part of the linker script syntax from
having their special meaning. Case in point the * wildcard character.
Availability of double quoting filenames also allows to fix a failure in
ELF/linkerscript/filename-spec.s when the path contain a @ which the
lexer consider as a special characters and thus break up a filename
containing it. This may happens under Jenkins which createspath such as
pipeline@2.
To avoid the need for escaping GlobPattern metacharacters in filename
in double quotes, GlobPattern::create is augmented with a new parameter
to request literal matching instead of relying on the presence of a
wildcard character in the pattern.
Reviewers: jhenderson, MaskRay, evgeny777, espindola, alexshap
Reviewed By: MaskRay
Subscribers: peter.smith, grimar, ruiu, emaste, arichardson, hiraditya, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D72517
2020-01-11 00:56:07 +08:00
|
|
|
for (const SingleStringMatcher &pat : patterns)
|
2018-03-01 01:38:19 +08:00
|
|
|
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) {
|
2021-03-12 01:38:15 +08:00
|
|
|
return !s.empty() && !isDigit(s[0]) &&
|
|
|
|
llvm::all_of(s, [](char c) { return isAlnum(c) || c == '_'; });
|
2018-03-01 01:38:19 +08:00
|
|
|
}
|
2018-05-23 04:20:25 +08:00
|
|
|
|
|
|
|
// Write the contents of the a buffer to a file
|
|
|
|
void lld::saveBuffer(StringRef buffer, const Twine &path) {
|
|
|
|
std::error_code ec;
|
2019-08-05 13:43:48 +08:00
|
|
|
raw_fd_ostream os(path.str(), ec, sys::fs::OpenFlags::OF_None);
|
2018-05-23 04:20:25 +08:00
|
|
|
if (ec)
|
|
|
|
error("cannot create " + path + ": " + ec.message());
|
|
|
|
os << buffer;
|
|
|
|
}
|