1//===- Utils.cpp ----------------------------------------------------------===// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7//===----------------------------------------------------------------------===// 9// Implements utility functions for TextAPI Darwin operations. 11//===----------------------------------------------------------------------===// 21constTwine &Extension) {
26if (!ParentPath.ends_with(Filename.str() +
".framework")) {
30// Framework dylibs do not have a file extension, in those cases the new 31// extension is appended. e.g. given Path: "Foo.framework/Foo" and Extension: 32// "tbd", the result is "Foo.framework/Foo.tbd". 34StringRef Ext = Extension.toStringRef(Storage);
36// Append '.' if needed. 37if (!Ext.empty() && Ext[0] !=
'.')
41 Path.append(Ext.begin(), Ext.end());
48autoP = Path.toNullTerminatedStringRef(Storage);
51if (EC == std::errc::too_many_symbolic_link_levels) {
60while (!Parent.
empty()) {
90// Ignore the common part. 91for (; IT1 != IE1 && IT2 != IE2; ++IT1, ++IT2) {
96for (; IT1 != IE1; ++IT1)
99for (; IT2 != IE2; ++IT2)
105 RelativePath.
swap(Result);
111// Remove the iOSSupport and DriverKit prefix to identify public locations. 114// Also /Library/Apple prefix for ROSP. 115 Path.consume_front(
"/Library/Apple");
117if (Path.starts_with(
"/usr/local/lib"))
120if (Path.starts_with(
"/System/Library/PrivateFrameworks"))
123if (Path.starts_with(
"/System/Library/SubFrameworks"))
126// Everything in /usr/lib/swift (including sub-directories) are considered 128if (Path.consume_front(
"/usr/lib/swift/"))
131// Only libraries directly in /usr/lib are public. All other libraries in 132// sub-directories are private. 133if (Path.consume_front(
"/usr/lib/"))
134return Path.contains(
'/');
136// "/System/Library/Frameworks/" is a public location. 137if (Path.starts_with(
"/System/Library/Frameworks/")) {
139 std::tie(
Name, Rest) =
140 Path.drop_front(
sizeof(
"/System/Library/Frameworks")).split(
'.');
142// Allow symlinks to top-level frameworks. 143if (IsSymLink && Rest ==
"framework")
146// Only top level framework are public. 147// /System/Library/Frameworks/Foo.framework/Foo ==> true 148// /System/Library/Frameworks/Foo.framework/Versions/A/Foo ==> true 149// /System/Library/Frameworks/Foo.framework/Resources/libBar.dylib ==> false 150// /System/Library/Frameworks/Foo.framework/Frameworks/Bar.framework/Bar 152// /System/Library/Frameworks/Foo.framework/Frameworks/Xfoo.framework/XFoo 156 (IsSymLink && Rest.
ends_with(
"Current"))));
165unsigned NumWildcards = 0;
166for (
unsigned i = 0; i < Glob.
size(); ++i) {
173constchar *PrevChar = i > 0 ? Glob.
data() + i - 1 :
nullptr;
176while (i < Glob.
size() && Glob[i] ==
'*') {
180constchar *NextChar = i < Glob.
size() ? Glob.
data() + i :
nullptr;
182if ((NumWildcards > 1) && (PrevChar ==
nullptr || *PrevChar ==
'/') &&
183 (NextChar ==
nullptr || *NextChar ==
'/')) {
184 RegexString +=
"(([^/]*(/|$))*)";
186 RegexString +=
"([^/]*)";
196if (NumWildcards == 0)
204return std::move(Rule);
211 Buffer->getBuffer().split(Lines,
"\n",
/*MaxSplit=*/-1,
218if (L.starts_with(
"#"))
221// Base symbol is separated by whitespace. 222 std::tie(
Symbol, Remain) = getToken(L);
223// The Alias symbol ends before a comment or EOL. 224 std::tie(Alias, Remain) = getToken(Remain,
"#");
225 Alias = Alias.
trim();
227return make_error<TextAPIError>(
229 (
"missing alias for: " +
Symbol).str()));
242for (
constauto &[Path, CurrP] : Paths) {
243if (!CurrP.has_value() || CurrP.value() == Platform)
244 Result.push_back(Path);
BlockVerifier::State From
This file contains some functions that are useful when dealing with strings.
Define TAPI specific error codes.
static StringLiteral RegexMetachars
#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.
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).
bool contains(StringRef Other) const
Return true if the given string is a substring of *this, and false otherwise.
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.
std::map< AliasEntry, AliasEntry > AliasMap
std::error_code make_relative(StringRef From, StringRef To, SmallVectorImpl< char > &RelativePath)
Turn absolute symlink into relative.
void replace_extension(SmallVectorImpl< char > &Path, const Twine &Extension)
Replace extension considering frameworks.
std::vector< PathToPlatform > PathToPlatformSeq
bool isPrivateLibrary(StringRef Path, bool IsSymLink=false)
Determine if library is private by parsing file path.
std::vector< std::string > PathSeq
llvm::Expected< llvm::Regex > createRegexFromGlob(llvm::StringRef Glob)
Create a regex rule from provided glob string.
SimpleSymbol parseSymbol(StringRef SymName)
Get symbol classification by parsing the name of a symbol.
PathSeq getPathsForPlatform(const PathToPlatformSeq &Paths, PlatformType Platform)
Pickup active paths for a given platform.
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.
Expected< AliasMap > parseAliasList(std::unique_ptr< llvm::MemoryBuffer > &Buffer)
Parse input list and capture symbols and their alias.
bool equivalent(file_status A, file_status B)
Do file_status's represent the same thing?
void make_absolute(const Twine ¤t_directory, SmallVectorImpl< char > &path)
Make path an absolute path.
std::error_code status(const Twine &path, file_status &result, bool follow=true)
Get file status as if by POSIX stat().
void replace_extension(SmallVectorImpl< char > &path, const Twine &extension, Style style=Style::native)
Replace the file extension of path with extension.
const_iterator begin(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get begin iterator over path.
StringRef parent_path(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get parent path.
StringRef filename(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get filename.
void append(SmallVectorImpl< char > &path, const Twine &a, const Twine &b="", const Twine &c="", const Twine &d="")
Append to path.
const_iterator end(StringRef path LLVM_LIFETIME_BOUND)
Get end iterator over path.
This is an optimization pass for GlobalISel generic memory operations.
std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
Lightweight struct for passing around symbol information.