//===--- Offloading.h - Utilities for handling offloading code -*- 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 // //===----------------------------------------------------------------------===// // // This file contains the binary format used for budingling device metadata with // an associated device image. The data can then be stored inside a host object // file to create a fat binary and read by the linker. This is intended to be a // thin wrapper around the image itself. If this format becomes sufficiently // complex it should be moved to a standard binary format like msgpack or ELF. // //===----------------------------------------------------------------------===// #ifndef LLVM_OBJECT_OFFLOADBINARY_H #define LLVM_OBJECT_OFFLOADBINARY_H #include "llvm/ADT/MapVector.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringRef.h" #include "llvm/Object/Binary.h" #include "llvm/Support/Error.h" #include "llvm/Support/MemoryBuffer.h" #include <memory> namespace llvm { namespace object { /// The producer of the associated offloading image. enum OffloadKind : uint16_t { … }; /// The type of contents the offloading image contains. enum ImageKind : uint16_t { … }; /// A simple binary serialization of an offloading file. We use this format to /// embed the offloading image into the host executable so it can be extracted /// and used by the linker. /// /// Many of these could be stored in the same section by the time the linker /// sees it so we mark this information with a header. The version is used to /// detect ABI stability and the size is used to find other offloading entries /// that may exist in the same section. All offsets are given as absolute byte /// offsets from the beginning of the file. class OffloadBinary : public Binary { … }; /// A class to contain the binary information for a single OffloadBinary that /// owns its memory. class OffloadFile : public OwningBinary<OffloadBinary> { … }; /// Extracts embedded device offloading code from a memory \p Buffer to a list /// of \p Binaries. Error extractOffloadBinaries(MemoryBufferRef Buffer, SmallVectorImpl<OffloadFile> &Binaries); /// Convert a string \p Name to an image kind. ImageKind getImageKind(StringRef Name); /// Convert an image kind to its string representation. StringRef getImageKindName(ImageKind Name); /// Convert a string \p Name to an offload kind. OffloadKind getOffloadKind(StringRef Name); /// Convert an offload kind to its string representation. StringRef getOffloadKindName(OffloadKind Name); /// If the target is AMD we check the target IDs for mutual compatibility. A /// target id is a string conforming to the folowing BNF syntax: /// /// target-id ::= '<arch> ( : <feature> ( '+' | '-' ) )*' /// /// The features 'xnack' and 'sramecc' are currently supported. These can be in /// the state of on, off, and any when unspecified. A target marked as any can /// bind with either on or off. This is used to link mutually compatible /// architectures together. Returns false in the case of an exact match. bool areTargetsCompatible(const OffloadFile::TargetID &LHS, const OffloadFile::TargetID &RHS); } // namespace object } // namespace llvm #endif