1 //===- OffloadBundler.h - File Bundling and Unbundling ----------*- C++ -*-===// 2 // 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 6 // 7 //===----------------------------------------------------------------------===// 8 /// 9 /// \file 10 /// This file defines an offload bundling API that bundles different files 11 /// that relate with the same source code but different targets into a single 12 /// one. Also the implements the opposite functionality, i.e. unbundle files 13 /// previous created by this API. 14 /// 15 //===----------------------------------------------------------------------===// 16 17 #ifndef LLVM_CLANG_DRIVER_OFFLOADBUNDLER_H 18 #define LLVM_CLANG_DRIVER_OFFLOADBUNDLER_H 19 20 #include "llvm/Support/Error.h" 21 #include "llvm/TargetParser/Triple.h" 22 #include <string> 23 #include <vector> 24 25 namespace clang { 26 27 class OffloadBundlerConfig { 28 public: 29 bool AllowNoHost = false; 30 bool AllowMissingBundles = false; 31 bool CheckInputArchive = false; 32 bool PrintExternalCommands = false; 33 bool HipOpenmpCompatible = false; 34 35 unsigned BundleAlignment = 1; 36 unsigned HostInputIndex = ~0u; 37 38 std::string FilesType; 39 std::string ObjcopyPath; 40 41 // TODO: Convert these to llvm::SmallVector 42 std::vector<std::string> TargetNames; 43 std::vector<std::string> InputFileNames; 44 std::vector<std::string> OutputFileNames; 45 }; 46 47 class OffloadBundler { 48 public: 49 const OffloadBundlerConfig &BundlerConfig; 50 51 // TODO: Add error checking from ClangOffloadBundler.cpp 52 OffloadBundler(const OffloadBundlerConfig &BC) : BundlerConfig(BC) {} 53 54 // List bundle IDs. Return true if an error was found. 55 static llvm::Error 56 ListBundleIDsInFile(llvm::StringRef InputFileName, 57 const OffloadBundlerConfig &BundlerConfig); 58 59 llvm::Error BundleFiles(); 60 llvm::Error UnbundleFiles(); 61 llvm::Error UnbundleArchive(); 62 }; 63 64 /// Obtain the offload kind, real machine triple, and an optional GPUArch 65 /// out of the target information specified by the user. 66 /// Bundle Entry ID (or, Offload Target String) has following components: 67 /// * Offload Kind - Host, OpenMP, or HIP 68 /// * Triple - Standard LLVM Triple 69 /// * TargetID (Optional) - target ID, like gfx906:xnack+ or sm_30 70 struct OffloadTargetInfo { 71 llvm::StringRef OffloadKind; 72 llvm::Triple Triple; 73 llvm::StringRef TargetID; 74 75 const OffloadBundlerConfig &BundlerConfig; 76 77 OffloadTargetInfo(const llvm::StringRef Target, 78 const OffloadBundlerConfig &BC); 79 bool hasHostKind() const; 80 bool isOffloadKindValid() const; 81 bool isOffloadKindCompatible(const llvm::StringRef TargetOffloadKind) const; 82 bool isTripleValid() const; 83 bool operator==(const OffloadTargetInfo &Target) const; 84 std::string str() const; 85 }; 86 87 } // namespace clang 88 89 #endif // LLVM_CLANG_DRIVER_OFFLOADBUNDLER_H 90