//===- OffloadBundler.h - File Bundling and Unbundling ----------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// /// /// \file /// This file defines an offload bundling API that bundles different files /// that relate with the same source code but different targets into a single /// one. Also the implements the opposite functionality, i.e. unbundle files /// previous created by this API. /// //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_DRIVER_OFFLOADBUNDLER_H #define LLVM_CLANG_DRIVER_OFFLOADBUNDLER_H #include "llvm/Support/Error.h" #include "llvm/TargetParser/Triple.h" #include #include #include namespace clang { class OffloadBundlerConfig { public: OffloadBundlerConfig(); bool AllowNoHost = false; bool AllowMissingBundles = false; bool CheckInputArchive = false; bool PrintExternalCommands = false; bool HipOpenmpCompatible = false; bool Compress = false; bool Verbose = false; unsigned BundleAlignment = 1; unsigned HostInputIndex = ~0u; std::string FilesType; std::string ObjcopyPath; // TODO: Convert these to llvm::SmallVector std::vector TargetNames; std::vector InputFileNames; std::vector OutputFileNames; }; class OffloadBundler { public: const OffloadBundlerConfig &BundlerConfig; // TODO: Add error checking from ClangOffloadBundler.cpp OffloadBundler(const OffloadBundlerConfig &BC) : BundlerConfig(BC) {} // List bundle IDs. Return true if an error was found. static llvm::Error ListBundleIDsInFile(llvm::StringRef InputFileName, const OffloadBundlerConfig &BundlerConfig); llvm::Error BundleFiles(); llvm::Error UnbundleFiles(); llvm::Error UnbundleArchive(); }; /// Obtain the offload kind, real machine triple, and an optional TargetID /// out of the target information specified by the user. /// Bundle Entry ID (or, Offload Target String) has following components: /// * Offload Kind - Host, OpenMP, or HIP /// * Triple - Standard LLVM Triple /// * TargetID (Optional) - target ID, like gfx906:xnack+ or sm_30 struct OffloadTargetInfo { llvm::StringRef OffloadKind; llvm::Triple Triple; llvm::StringRef TargetID; const OffloadBundlerConfig &BundlerConfig; OffloadTargetInfo(const llvm::StringRef Target, const OffloadBundlerConfig &BC); bool hasHostKind() const; bool isOffloadKindValid() const; bool isOffloadKindCompatible(const llvm::StringRef TargetOffloadKind) const; bool isTripleValid() const; bool operator==(const OffloadTargetInfo &Target) const; std::string str() const; }; // CompressedOffloadBundle represents the format for the compressed offload // bundles. // // The format is as follows: // - Magic Number (4 bytes) - A constant "CCOB". // - Version (2 bytes) // - Compression Method (2 bytes) - Uses the values from // llvm::compression::Format. // - Uncompressed Size (4 bytes). // - Truncated MD5 Hash (8 bytes). // - Compressed Data (variable length). class CompressedOffloadBundle { private: static inline const size_t MagicSize = 4; static inline const size_t VersionFieldSize = sizeof(uint16_t); static inline const size_t MethodFieldSize = sizeof(uint16_t); static inline const size_t SizeFieldSize = sizeof(uint32_t); static inline const size_t HashFieldSize = 8; static inline const size_t HeaderSize = MagicSize + VersionFieldSize + MethodFieldSize + SizeFieldSize + HashFieldSize; static inline const llvm::StringRef MagicNumber = "CCOB"; static inline const uint16_t Version = 1; public: static llvm::Expected> compress(const llvm::MemoryBuffer &Input, bool Verbose = false); static llvm::Expected> decompress(const llvm::MemoryBuffer &Input, bool Verbose = false); }; } // namespace clang #endif // LLVM_CLANG_DRIVER_OFFLOADBUNDLER_H