clang 20.0.0 (based on r547379) from build 12806354. Bug: http://b/379133546 Test: N/A Change-Id: I2eb8938af55d809de674be63cb30cf27e801862b Upstream-Commit: ad834e67b1105d15ef907f6255d4c96e8e733f57
136 lines
4.6 KiB
C++
136 lines
4.6 KiB
C++
//===- 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/Compression.h"
|
|
#include "llvm/Support/Error.h"
|
|
#include "llvm/TargetParser/Triple.h"
|
|
#include <llvm/Support/MemoryBuffer.h>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
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;
|
|
llvm::compression::Format CompressionFormat;
|
|
int CompressionLevel;
|
|
|
|
unsigned BundleAlignment = 1;
|
|
unsigned HostInputIndex = ~0u;
|
|
|
|
std::string FilesType;
|
|
std::string ObjcopyPath;
|
|
|
|
// TODO: Convert these to llvm::SmallVector
|
|
std::vector<std::string> TargetNames;
|
|
std::vector<std::string> InputFileNames;
|
|
std::vector<std::string> 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.
|
|
// - Total file size (4 bytes). Available in version 2 and above.
|
|
// - 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 FileSizeFieldSize = sizeof(uint32_t);
|
|
static inline const size_t UncompressedSizeFieldSize = sizeof(uint32_t);
|
|
static inline const size_t HashFieldSize = sizeof(uint64_t);
|
|
static inline const size_t V1HeaderSize =
|
|
MagicSize + VersionFieldSize + MethodFieldSize +
|
|
UncompressedSizeFieldSize + HashFieldSize;
|
|
static inline const size_t V2HeaderSize =
|
|
MagicSize + VersionFieldSize + FileSizeFieldSize + MethodFieldSize +
|
|
UncompressedSizeFieldSize + HashFieldSize;
|
|
static inline const llvm::StringRef MagicNumber = "CCOB";
|
|
static inline const uint16_t Version = 2;
|
|
|
|
public:
|
|
static llvm::Expected<std::unique_ptr<llvm::MemoryBuffer>>
|
|
compress(llvm::compression::Params P, const llvm::MemoryBuffer &Input,
|
|
bool Verbose = false);
|
|
static llvm::Expected<std::unique_ptr<llvm::MemoryBuffer>>
|
|
decompress(const llvm::MemoryBuffer &Input, bool Verbose = false);
|
|
};
|
|
|
|
} // namespace clang
|
|
|
|
#endif // LLVM_CLANG_DRIVER_OFFLOADBUNDLER_H
|