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