brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.3 KiB · 31aff47 Raw
187 lines · cpp
1//===- BuiltinDialectBytecode.cpp - Builtin Bytecode Implementation -------===//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-exception6//7//===----------------------------------------------------------------------===//8 9#include "BuiltinDialectBytecode.h"10#include "AttributeDetail.h"11#include "mlir/Bytecode/BytecodeImplementation.h"12#include "mlir/IR/BuiltinAttributes.h"13#include "mlir/IR/BuiltinDialect.h"14#include "mlir/IR/BuiltinTypes.h"15#include "mlir/IR/Diagnostics.h"16#include "mlir/IR/DialectResourceBlobManager.h"17#include "mlir/IR/Location.h"18#include "mlir/Support/LLVM.h"19#include "llvm/ADT/TypeSwitch.h"20#include <cstdint>21 22using namespace mlir;23 24//===----------------------------------------------------------------------===//25// BuiltinDialectBytecodeInterface26//===----------------------------------------------------------------------===//27 28namespace {29 30//===----------------------------------------------------------------------===//31// Utility functions32//===----------------------------------------------------------------------===//33 34// TODO: Move these to separate file.35 36// Returns the bitwidth if known, else return 0.37static unsigned getIntegerBitWidth(DialectBytecodeReader &reader, Type type) {38  if (auto intType = dyn_cast<IntegerType>(type)) {39    return intType.getWidth();40  }41  if (llvm::isa<IndexType>(type)) {42    return IndexType::kInternalStorageBitWidth;43  }44  reader.emitError()45      << "expected integer or index type for IntegerAttr, but got: " << type;46  return 0;47}48 49static LogicalResult readAPIntWithKnownWidth(DialectBytecodeReader &reader,50                                             Type type, FailureOr<APInt> &val) {51  unsigned bitWidth = getIntegerBitWidth(reader, type);52  val = reader.readAPIntWithKnownWidth(bitWidth);53  return val;54}55 56static LogicalResult57readAPFloatWithKnownSemantics(DialectBytecodeReader &reader, Type type,58                              FailureOr<APFloat> &val) {59  auto ftype = dyn_cast<FloatType>(type);60  if (!ftype)61    return failure();62  val = reader.readAPFloatWithKnownSemantics(ftype.getFloatSemantics());63  return success();64}65 66LogicalResult67readPotentiallySplatString(DialectBytecodeReader &reader, ShapedType type,68                           bool isSplat,69                           SmallVectorImpl<StringRef> &rawStringData) {70  rawStringData.resize(isSplat ? 1 : type.getNumElements());71  for (StringRef &value : rawStringData)72    if (failed(reader.readString(value)))73      return failure();74  return success();75}76 77static void writePotentiallySplatString(DialectBytecodeWriter &writer,78                                        DenseStringElementsAttr attr) {79  bool isSplat = attr.isSplat();80  if (isSplat)81    return writer.writeOwnedString(attr.getRawStringData().front());82 83  for (StringRef str : attr.getRawStringData())84    writer.writeOwnedString(str);85}86 87static FileLineColRange getFileLineColRange(MLIRContext *context,88                                            StringAttr filename,89                                            ArrayRef<uint64_t> lineCols) {90  switch (lineCols.size()) {91  case 0:92    return FileLineColRange::get(filename);93  case 1:94    return FileLineColRange::get(filename, lineCols[0]);95  case 2:96    return FileLineColRange::get(filename, lineCols[0], lineCols[1]);97  case 3:98    return FileLineColRange::get(filename, lineCols[0], lineCols[1],99                                 lineCols[2]);100  case 4:101    return FileLineColRange::get(filename, lineCols[0], lineCols[1],102                                 lineCols[2], lineCols[3]);103  default:104    return {};105  }106}107 108static LogicalResult109readFileLineColRangeLocs(DialectBytecodeReader &reader,110                         SmallVectorImpl<uint64_t> &lineCols) {111  return reader.readList(112      lineCols, [&reader](uint64_t &val) { return reader.readVarInt(val); });113}114 115static void writeFileLineColRangeLocs(DialectBytecodeWriter &writer,116                                      FileLineColRange range) {117  if (range.getStartLine() == 0 && range.getStartColumn() == 0 &&118      range.getEndLine() == 0 && range.getEndColumn() == 0) {119    writer.writeVarInt(0);120    return;121  }122  if (range.getStartColumn() == 0 &&123      range.getStartLine() == range.getEndLine()) {124    writer.writeVarInt(1);125    writer.writeVarInt(range.getStartLine());126    return;127  }128  // The single file:line:col is handled by other writer, but checked here for129  // completeness.130  if (range.getEndColumn() == range.getStartColumn() &&131      range.getStartLine() == range.getEndLine()) {132    writer.writeVarInt(2);133    writer.writeVarInt(range.getStartLine());134    writer.writeVarInt(range.getStartColumn());135    return;136  }137  if (range.getStartLine() == range.getEndLine()) {138    writer.writeVarInt(3);139    writer.writeVarInt(range.getStartLine());140    writer.writeVarInt(range.getStartColumn());141    writer.writeVarInt(range.getEndColumn());142    return;143  }144  writer.writeVarInt(4);145  writer.writeVarInt(range.getStartLine());146  writer.writeVarInt(range.getStartColumn());147  writer.writeVarInt(range.getEndLine());148  writer.writeVarInt(range.getEndColumn());149}150 151#include "mlir/IR/BuiltinDialectBytecode.cpp.inc"152 153/// This class implements the bytecode interface for the builtin dialect.154struct BuiltinDialectBytecodeInterface : public BytecodeDialectInterface {155  BuiltinDialectBytecodeInterface(Dialect *dialect)156      : BytecodeDialectInterface(dialect) {}157 158  //===--------------------------------------------------------------------===//159  // Attributes160 161  Attribute readAttribute(DialectBytecodeReader &reader) const override {162    return ::readAttribute(getContext(), reader);163  }164 165  LogicalResult writeAttribute(Attribute attr,166                               DialectBytecodeWriter &writer) const override {167    return ::writeAttribute(attr, writer);168  }169 170  //===--------------------------------------------------------------------===//171  // Types172 173  Type readType(DialectBytecodeReader &reader) const override {174    return ::readType(getContext(), reader);175  }176 177  LogicalResult writeType(Type type,178                          DialectBytecodeWriter &writer) const override {179    return ::writeType(type, writer);180  }181};182} // namespace183 184void builtin_dialect_detail::addBytecodeInterface(BuiltinDialect *dialect) {185  dialect->addInterfaces<BuiltinDialectBytecodeInterface>();186}187