21 const Twine &Extension) {
26 if (!ParentPath.ends_with(Filename.str() +
".framework")) {
34 StringRef Ext = Extension.toStringRef(Storage);
37 if (!Ext.empty() && Ext[0] !=
'.')
41 Path.append(Ext.begin(), Ext.end());
48 auto P = Path.toNullTerminatedStringRef(Storage);
51 if (EC == std::errc::too_many_symbolic_link_levels) {
60 while (!Parent.
empty()) {
91 for (; IT1 != IE1 && IT2 != IE2; ++IT1, ++IT2) {
96 for (; IT1 != IE1; ++IT1)
99 for (; IT2 != IE2; ++IT2)
105 RelativePath.
swap(Result);
115 Path.consume_front(
"/Library/Apple");
117 if (Path.starts_with(
"/usr/local/lib"))
120 if (Path.starts_with(
"/System/Library/PrivateFrameworks"))
123 if (Path.starts_with(
"/System/Library/SubFrameworks"))
128 if (Path.consume_front(
"/usr/lib/swift/"))
133 if (Path.consume_front(
"/usr/lib/"))
134 return Path.contains(
'/');
137 if (Path.starts_with(
"/System/Library/Frameworks/")) {
139 std::tie(Name, Rest) =
140 Path.drop_front(
sizeof(
"/System/Library/Frameworks")).split(
'.');
143 if (IsSymLink && Rest ==
"framework")
156 (IsSymLink && Rest.
ends_with(
"Current"))));
165 unsigned NumWildcards = 0;
166 for (
unsigned i = 0; i < Glob.
size(); ++i) {
173 const char *PrevChar = i > 0 ? Glob.
data() + i - 1 :
nullptr;
176 while (i < Glob.
size() && Glob[i] ==
'*') {
180 const char *NextChar = i < Glob.
size() ? Glob.
data() + i :
nullptr;
182 if ((NumWildcards > 1) && (PrevChar ==
nullptr || *PrevChar ==
'/') &&
183 (NextChar ==
nullptr || *NextChar ==
'/')) {
184 RegexString +=
"(([^/]*(/|$))*)";
186 RegexString +=
"([^/]*)";
196 if (NumWildcards == 0)
204 return std::move(Rule);
211 Buffer->getBuffer().split(Lines,
"\n", -1,
218 if (L.starts_with(
"#"))
224 std::tie(Alias, Remain) =
getToken(Remain,
"#");
225 Alias = Alias.
trim();
229 (
"missing alias for: " +
Symbol).str()));
242 for (
const auto &[Path, CurrP] : Paths) {
243 if (!CurrP.has_value() || CurrP.value() == Platform)
244 Result.push_back(Path);
static const char RegexMetachars[]
Define TAPI specific error codes.
#define DRIVERKIT_PREFIX_PATH
#define MACCATALYST_PREFIX_PATH
Lightweight error class with error context and mandatory checking.
Tagged union holding either a T or a Error.
LLVM_ABI bool isValid(std::string &Error) const
isValid - returns the error encountered during regex compilation, if any.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void swap(SmallVectorImpl &RHS)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
A wrapper around a string literal that serves as a proxy for constructing global tables of StringRefs...
StringRef - Represent a constant reference to a string, i.e.
std::string str() const
str - Get the contents as an std::string.
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
constexpr bool empty() const
empty - Check if the string is empty.
constexpr size_t size() const
size - Get the string size.
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
StringRef trim(char Char) const
Return string with consecutive Char characters starting from the left and right removed.
bool ends_with(StringRef Suffix) const
Check if this string ends with the given Suffix.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Represents the result of a call to sys::fs::status().
@ C
The default llvm calling convention, compatible with C.
LLVM_ABI std::error_code make_relative(StringRef From, StringRef To, SmallVectorImpl< char > &RelativePath)
Turn absolute symlink into relative.
std::vector< PathToPlatform > PathToPlatformSeq
LLVM_ABI void replace_extension(SmallVectorImpl< char > &Path, const Twine &Extension)
Replace extension considering frameworks.
LLVM_ABI bool isPrivateLibrary(StringRef Path, bool IsSymLink=false)
Determine if library is private by parsing file path.
LLVM_ABI llvm::Expected< llvm::Regex > createRegexFromGlob(llvm::StringRef Glob)
Create a regex rule from provided glob string.
LLVM_ABI SimpleSymbol parseSymbol(StringRef SymName)
Get symbol classification by parsing the name of a symbol.
LLVM_ABI PathSeq getPathsForPlatform(const PathToPlatformSeq &Paths, PlatformType Platform)
Pickup active paths for a given platform.
LLVM_ABI std::error_code shouldSkipSymLink(const Twine &Path, bool &Result)
Determine whether to skip over symlink due to either too many symlink levels or is cyclic.
LLVM_ABI Expected< AliasMap > parseAliasList(std::unique_ptr< llvm::MemoryBuffer > &Buffer)
Parse input list and capture symbols and their alias.
std::vector< std::string > PathSeq
std::map< AliasEntry, AliasEntry > AliasMap
LLVM_ABI void make_absolute(const Twine ¤t_directory, SmallVectorImpl< char > &path)
Make path an absolute path.
LLVM_ABI std::error_code status(const Twine &path, file_status &result, bool follow=true)
Get file status as if by POSIX stat().
LLVM_ABI bool equivalent(file_status A, file_status B)
Do file_status's represent the same thing?
LLVM_ABI void replace_extension(SmallVectorImpl< char > &path, const Twine &extension, Style style=Style::native)
Replace the file extension of path with extension.
LLVM_ABI const_iterator begin(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get begin iterator over path.
LLVM_ABI StringRef parent_path(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get parent path.
LLVM_ABI StringRef filename(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get filename.
LLVM_ABI void append(SmallVectorImpl< char > &path, const Twine &a, const Twine &b="", const Twine &c="", const Twine &d="")
Append to path.
LLVM_ABI const_iterator end(StringRef path LLVM_LIFETIME_BOUND)
Get end iterator over path.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI std::pair< StringRef, StringRef > getToken(StringRef Source, StringRef Delimiters=" \t\n\v\f\r")
getToken - This function extracts one token from source, ignoring any leading characters that appear ...
LLVM_ABI std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
Lightweight struct for passing around symbol information.