xref: /freebsd/contrib/llvm-project/llvm/include/llvm/TextAPI/Utils.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1cb14a3feSDimitry Andric //===- llvm/TextAPI/Utils.h - TAPI Utils -----------------------*- C++ -*-===//
2cb14a3feSDimitry Andric //
3cb14a3feSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4cb14a3feSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5cb14a3feSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6cb14a3feSDimitry Andric //
7cb14a3feSDimitry Andric //===----------------------------------------------------------------------===//
8cb14a3feSDimitry Andric //
9cb14a3feSDimitry Andric // Helper functionality used for Darwin specific operations.
10cb14a3feSDimitry Andric //
11cb14a3feSDimitry Andric //===----------------------------------------------------------------------===//
12cb14a3feSDimitry Andric 
13cb14a3feSDimitry Andric #ifndef LLVM_TEXTAPI_UTILS_H
14cb14a3feSDimitry Andric #define LLVM_TEXTAPI_UTILS_H
15cb14a3feSDimitry Andric 
16cb14a3feSDimitry Andric #include "llvm/ADT/Twine.h"
17*0fca6ea1SDimitry Andric #include "llvm/Support/Error.h"
18cb14a3feSDimitry Andric #include "llvm/Support/FileSystem.h"
19*0fca6ea1SDimitry Andric #include "llvm/Support/MemoryBuffer.h"
20cb14a3feSDimitry Andric #include "llvm/Support/Path.h"
21*0fca6ea1SDimitry Andric #include "llvm/Support/Regex.h"
22*0fca6ea1SDimitry Andric #include "llvm/TextAPI/Symbol.h"
23*0fca6ea1SDimitry Andric #include <map>
24cb14a3feSDimitry Andric 
25cb14a3feSDimitry Andric #if !defined(PATH_MAX)
26cb14a3feSDimitry Andric #define PATH_MAX 1024
27*0fca6ea1SDimitry Andric #endif // !defined(PATH_MAX)
28*0fca6ea1SDimitry Andric 
29*0fca6ea1SDimitry Andric #define MACCATALYST_PREFIX_PATH "/System/iOSSupport"
30*0fca6ea1SDimitry Andric #define DRIVERKIT_PREFIX_PATH "/System/DriverKit"
31cb14a3feSDimitry Andric 
32cb14a3feSDimitry Andric namespace llvm::MachO {
33cb14a3feSDimitry Andric 
34cb14a3feSDimitry Andric using PathSeq = std::vector<std::string>;
35*0fca6ea1SDimitry Andric using PathToPlatform = std::pair<std::string, std::optional<PlatformType>>;
36*0fca6ea1SDimitry Andric using PathToPlatformSeq = std::vector<PathToPlatform>;
37*0fca6ea1SDimitry Andric 
38*0fca6ea1SDimitry Andric // Defines simple struct for storing symbolic links.
39*0fca6ea1SDimitry Andric struct SymLink {
40*0fca6ea1SDimitry Andric   std::string SrcPath;
41*0fca6ea1SDimitry Andric   std::string LinkContent;
42*0fca6ea1SDimitry Andric 
SymLinkSymLink43*0fca6ea1SDimitry Andric   SymLink(std::string Path, std::string Link)
44*0fca6ea1SDimitry Andric       : SrcPath(std::move(Path)), LinkContent(std::move(Link)) {}
45*0fca6ea1SDimitry Andric 
SymLinkSymLink46*0fca6ea1SDimitry Andric   SymLink(StringRef Path, StringRef Link)
47*0fca6ea1SDimitry Andric       : SrcPath(std::string(Path)), LinkContent(std::string(Link)) {}
48*0fca6ea1SDimitry Andric };
49cb14a3feSDimitry Andric 
50cb14a3feSDimitry Andric /// Replace extension considering frameworks.
51cb14a3feSDimitry Andric ///
52cb14a3feSDimitry Andric /// \param Path Location of file.
53cb14a3feSDimitry Andric /// \param Extension File extension to update with.
54cb14a3feSDimitry Andric void replace_extension(SmallVectorImpl<char> &Path, const Twine &Extension);
55*0fca6ea1SDimitry Andric 
56*0fca6ea1SDimitry Andric /// Determine whether to skip over symlink due to either too many symlink levels
57*0fca6ea1SDimitry Andric /// or is cyclic.
58*0fca6ea1SDimitry Andric ///
59*0fca6ea1SDimitry Andric /// \param Path Location to symlink.
60*0fca6ea1SDimitry Andric /// \param Result Holds whether to skip over Path.
61*0fca6ea1SDimitry Andric std::error_code shouldSkipSymLink(const Twine &Path, bool &Result);
62*0fca6ea1SDimitry Andric 
63*0fca6ea1SDimitry Andric /// Turn absolute symlink into relative.
64*0fca6ea1SDimitry Andric ///
65*0fca6ea1SDimitry Andric /// \param From The symlink.
66*0fca6ea1SDimitry Andric /// \param To What the symlink points to.
67*0fca6ea1SDimitry Andric /// \param RelativePath Path location to update what the symlink points to.
68*0fca6ea1SDimitry Andric std::error_code make_relative(StringRef From, StringRef To,
69*0fca6ea1SDimitry Andric                               SmallVectorImpl<char> &RelativePath);
70*0fca6ea1SDimitry Andric 
71*0fca6ea1SDimitry Andric /// Determine if library is private by parsing file path.
72*0fca6ea1SDimitry Andric /// It does not touch the file system.
73*0fca6ea1SDimitry Andric ///
74*0fca6ea1SDimitry Andric /// \param Path File path for library.
75*0fca6ea1SDimitry Andric /// \param IsSymLink Whether path points to a symlink.
76*0fca6ea1SDimitry Andric bool isPrivateLibrary(StringRef Path, bool IsSymLink = false);
77*0fca6ea1SDimitry Andric 
78*0fca6ea1SDimitry Andric /// Create a regex rule from provided glob string.
79*0fca6ea1SDimitry Andric /// \param Glob String that represents glob input.
80*0fca6ea1SDimitry Andric /// \return The equivalent regex rule.
81*0fca6ea1SDimitry Andric llvm::Expected<llvm::Regex> createRegexFromGlob(llvm::StringRef Glob);
82*0fca6ea1SDimitry Andric 
83*0fca6ea1SDimitry Andric using AliasEntry = std::pair<std::string, EncodeKind>;
84*0fca6ea1SDimitry Andric using AliasMap = std::map<AliasEntry, AliasEntry>;
85*0fca6ea1SDimitry Andric 
86*0fca6ea1SDimitry Andric /// Parse input list and capture symbols and their alias.
87*0fca6ea1SDimitry Andric ///
88*0fca6ea1SDimitry Andric /// \param Buffer Data contents of file for the alias list.
89*0fca6ea1SDimitry Andric /// \return Lookup table of alias to their base symbol.
90*0fca6ea1SDimitry Andric Expected<AliasMap> parseAliasList(std::unique_ptr<llvm::MemoryBuffer> &Buffer);
91*0fca6ea1SDimitry Andric 
92*0fca6ea1SDimitry Andric /// Pickup active paths for a given platform.
93*0fca6ea1SDimitry Andric ///
94*0fca6ea1SDimitry Andric /// \param Paths File or search paths to pick up.
95*0fca6ea1SDimitry Andric /// \param Platform Platform to collect paths for.
96*0fca6ea1SDimitry Andric PathSeq getPathsForPlatform(const PathToPlatformSeq &Paths,
97*0fca6ea1SDimitry Andric                             PlatformType Platform);
98*0fca6ea1SDimitry Andric 
99cb14a3feSDimitry Andric } // namespace llvm::MachO
100cb14a3feSDimitry Andric #endif // LLVM_TEXTAPI_UTILS_H
101