CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
148 lines
4.9 KiB
C++
148 lines
4.9 KiB
C++
//===- LLVMDialectBytecode.cpp - LLVM Bytecode Implementation -------------===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "LLVMDialectBytecode.h"
|
|
#include "mlir/Bytecode/BytecodeImplementation.h"
|
|
#include "mlir/Dialect/LLVMIR/LLVMAttrs.h"
|
|
#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
|
|
#include "mlir/Dialect/LLVMIR/LLVMTypes.h"
|
|
#include "mlir/IR/Diagnostics.h"
|
|
#include "llvm/ADT/APFloat.h"
|
|
#include "llvm/ADT/SmallVector.h"
|
|
#include "llvm/ADT/TypeSwitch.h"
|
|
#include <type_traits>
|
|
|
|
using namespace mlir;
|
|
using namespace mlir::LLVM;
|
|
|
|
namespace {
|
|
|
|
//===--------------------------------------------------------------------===//
|
|
// Optional ArrayRefs
|
|
//
|
|
// Note that both the writer and reader functions consider attributes to be
|
|
// optional. This is because the attribute may be present or empty.
|
|
//===--------------------------------------------------------------------===//
|
|
|
|
template <class EntryTy>
|
|
static void writeOptionalArrayRef(DialectBytecodeWriter &writer,
|
|
ArrayRef<EntryTy> storage) {
|
|
if (storage.empty()) {
|
|
writer.writeOwnedBool(false);
|
|
return;
|
|
}
|
|
|
|
writer.writeOwnedBool(true);
|
|
writer.writeList(storage, [&](EntryTy val) {
|
|
if constexpr (std::is_base_of_v<Attribute, EntryTy>) {
|
|
(void)writer.writeOptionalAttribute(val);
|
|
} else if constexpr (std::is_integral_v<EntryTy>) {
|
|
(void)writer.writeVarInt(val);
|
|
} else {
|
|
static_assert(true, "EntryTy not supported");
|
|
}
|
|
});
|
|
}
|
|
|
|
template <class EntryTy>
|
|
static LogicalResult readOptionalArrayRef(DialectBytecodeReader &reader,
|
|
SmallVectorImpl<EntryTy> &storage) {
|
|
bool isPresent = false;
|
|
if (failed(reader.readBool(isPresent)))
|
|
return failure();
|
|
// Nothing to do here, the array is empty.
|
|
if (!isPresent)
|
|
return success();
|
|
|
|
auto readEntry = [&]() -> FailureOr<EntryTy> {
|
|
EntryTy temp;
|
|
if constexpr (std::is_base_of_v<Attribute, EntryTy>) {
|
|
if (succeeded(reader.readOptionalAttribute(temp)))
|
|
return temp;
|
|
} else if constexpr (std::is_integral_v<EntryTy>) {
|
|
if (succeeded(reader.readVarInt(temp)))
|
|
return temp;
|
|
} else {
|
|
static_assert(true, "EntryTy not supported");
|
|
}
|
|
return failure();
|
|
};
|
|
|
|
return reader.readList(storage, readEntry);
|
|
}
|
|
|
|
//===--------------------------------------------------------------------===//
|
|
// Optional integral types
|
|
//===--------------------------------------------------------------------===//
|
|
|
|
template <class EntryTy>
|
|
static void writeOptionalInt(DialectBytecodeWriter &writer,
|
|
std::optional<EntryTy> storage) {
|
|
static_assert(std::is_integral_v<EntryTy>,
|
|
"EntryTy must be an integral type");
|
|
EntryTy val = storage.value_or(0);
|
|
writer.writeVarIntWithFlag(val, storage.has_value());
|
|
}
|
|
|
|
template <class EntryTy>
|
|
static LogicalResult readOptionalInt(DialectBytecodeReader &reader,
|
|
std::optional<EntryTy> &storage) {
|
|
static_assert(std::is_integral_v<EntryTy>,
|
|
"EntryTy must be an integral type");
|
|
uint64_t result = 0;
|
|
bool flag = false;
|
|
if (failed(reader.readVarIntWithFlag(result, flag)))
|
|
return failure();
|
|
if (flag)
|
|
storage = static_cast<EntryTy>(result);
|
|
else
|
|
storage = std::nullopt;
|
|
return success();
|
|
}
|
|
|
|
//===--------------------------------------------------------------------===//
|
|
// Tablegen generated bytecode functions
|
|
//===--------------------------------------------------------------------===//
|
|
|
|
#include "mlir/Dialect/LLVMIR/LLVMDialectBytecode.cpp.inc"
|
|
|
|
//===--------------------------------------------------------------------===//
|
|
// LLVMDialectBytecodeInterface
|
|
//===--------------------------------------------------------------------===//
|
|
|
|
/// This class implements the bytecode interface for the LLVM dialect.
|
|
struct LLVMDialectBytecodeInterface : public BytecodeDialectInterface {
|
|
LLVMDialectBytecodeInterface(Dialect *dialect)
|
|
: BytecodeDialectInterface(dialect) {}
|
|
|
|
// Attributes
|
|
Attribute readAttribute(DialectBytecodeReader &reader) const override {
|
|
return ::readAttribute(getContext(), reader);
|
|
}
|
|
|
|
LogicalResult writeAttribute(Attribute attr,
|
|
DialectBytecodeWriter &writer) const override {
|
|
return ::writeAttribute(attr, writer);
|
|
}
|
|
|
|
// Types
|
|
Type readType(DialectBytecodeReader &reader) const override {
|
|
return ::readType(getContext(), reader);
|
|
}
|
|
|
|
LogicalResult writeType(Type type,
|
|
DialectBytecodeWriter &writer) const override {
|
|
return ::writeType(type, writer);
|
|
}
|
|
};
|
|
} // namespace
|
|
|
|
void LLVM::detail::addBytecodeInterface(LLVMDialect *dialect) {
|
|
dialect->addInterfaces<LLVMDialectBytecodeInterface>();
|
|
}
|