LLVM: lib/TextAPI/Utils.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

16

17using namespace llvm;

19

21 const Twine &Extension) {

22 StringRef P(Path.begin(), Path.size());

25

26 if (!ParentPath.ends_with(Filename.str() + ".framework")) {

28 return;

29 }

30

31

32

34 StringRef Ext = Extension.toStringRef(Storage);

35

36

37 if (!Ext.empty() && Ext[0] != '.')

38 Path.push_back('.');

39

40

41 Path.append(Ext.begin(), Ext.end());

42}

43

45 bool &Result) {

46 Result = false;

48 auto P = Path.toNullTerminatedStringRef(Storage);

51 if (EC == std::errc::too_many_symbolic_link_levels) {

52 Result = true;

53 return {};

54 }

55

56 if (EC)

57 return EC;

58

60 while (!Parent.empty()) {

63 return ec;

64

66 Result = true;

67 return {};

68 }

69

71 }

72 return {};

73}

74

75std::error_code

81 return EC;

82

84 return EC;

85

90

91 for (; IT1 != IE1 && IT2 != IE2; ++IT1, ++IT2) {

92 if (*IT1 != *IT2)

93 break;

94 }

95

96 for (; IT1 != IE1; ++IT1)

98

99 for (; IT2 != IE2; ++IT2)

101

102 if (Result.empty())

103 Result = ".";

104

105 RelativePath.swap(Result);

106

107 return {};

108}

109

111

114

115 Path.consume_front("/Library/Apple");

116

117 if (Path.starts_with("/usr/local/lib"))

118 return true;

119

120 if (Path.starts_with("/System/Library/PrivateFrameworks"))

121 return true;

122

123 if (Path.starts_with("/System/Library/SubFrameworks"))

124 return true;

125

126

127

128 if (Path.consume_front("/usr/lib/swift/"))

129 return false;

130

131

132

133 if (Path.consume_front("/usr/lib/"))

134 return Path.contains('/');

135

136

137 if (Path.starts_with("/System/Library/Frameworks/")) {

139 std::tie(Name, Rest) =

140 Path.drop_front(sizeof("/System/Library/Frameworks")).split('.');

141

142

143 if (IsSymLink && Rest == "framework")

144 return false;

145

146

147

148

149

150

151

152

153

154 return !(Rest.starts_with("framework/") &&

156 (IsSymLink && Rest.ends_with("Current"))));

157 }

158 return false;

159}

160

162

165 unsigned NumWildcards = 0;

166 for (unsigned i = 0; i < Glob.size(); ++i) {

167 char C = Glob[i];

168 switch (C) {

169 case '?':

170 RegexString += '.';

171 break;

172 case '*': {

173 const char *PrevChar = i > 0 ? Glob.data() + i - 1 : nullptr;

174 NumWildcards = 1;

175 ++i;

176 while (i < Glob.size() && Glob[i] == '*') {

177 ++NumWildcards;

178 ++i;

179 }

180 const char *NextChar = i < Glob.size() ? Glob.data() + i : nullptr;

181

182 if ((NumWildcards > 1) && (PrevChar == nullptr || *PrevChar == '/') &&

183 (NextChar == nullptr || *NextChar == '/')) {

184 RegexString += "(([^/]*(/|$))*)";

185 } else

186 RegexString += "([^/]*)";

187 break;

188 }

189 default:

193 }

194 }

196 if (NumWildcards == 0)

198

200 std::string Error;

203

204 return std::move(Rule);

205}

206

211 Buffer->getBuffer().split(Lines, "\n", -1,

212 false);

213 for (const StringRef Line : Lines) {

215 if (L.empty())

216 continue;

217

218 if (L.starts_with("#"))

219 continue;

221

223

224 std::tie(Alias, Remain) = getToken(Remain, "#");

225 Alias = Alias.trim();

226 if (Alias.empty())

229 ("missing alias for: " + Symbol).str()));

233 BaseSym.Kind};

234 }

235

236 return Aliases;

237}

238

242 for (const auto &[Path, CurrP] : Paths) {

243 if (!CurrP.has_value() || CurrP.value() == Platform)

244 Result.push_back(Path);

245 }

246 return Result;

247}

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.

Definition Utils.cpp:76

std::vector< PathToPlatform > PathToPlatformSeq

LLVM_ABI void replace_extension(SmallVectorImpl< char > &Path, const Twine &Extension)

Replace extension considering frameworks.

Definition Utils.cpp:20

LLVM_ABI bool isPrivateLibrary(StringRef Path, bool IsSymLink=false)

Determine if library is private by parsing file path.

Definition Utils.cpp:110

LLVM_ABI llvm::Expected< llvm::Regex > createRegexFromGlob(llvm::StringRef Glob)

Create a regex rule from provided glob string.

Definition Utils.cpp:163

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.

Definition Utils.cpp:239

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.

Definition Utils.cpp:44

LLVM_ABI Expected< AliasMap > parseAliasList(std::unique_ptr< llvm::MemoryBuffer > &Buffer)

Parse input list and capture symbols and their alias.

Definition Utils.cpp:208

std::vector< std::string > PathSeq

std::map< AliasEntry, AliasEntry > AliasMap

LLVM_ABI std::error_code make_absolute(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.