This commit adds a new bytecode serialization format for MLIR. The actual serialization of MLIR to binary is relatively straightforward, given the very very general structure of MLIR. The underlying basis for this format is a variable-length encoding for integers, which gets heavily used for nearly all aspects of the encoding (given that most of the encoding is just indexing into lists). The format currently does not provide support for custom attribute/type serialization, and thus always uses an assembly format fallback. It also doesn't provide support for resources. These will be added in followups, the intention for this patch is to provide something that supports the basic cases, and can be built on top of. https://discourse.llvm.org/t/rfc-a-binary-serialization-format-for-mlir/63518 Differential Revision: https://reviews.llvm.org/D131747
71 lines
3.0 KiB
C++
71 lines
3.0 KiB
C++
//===- Parser.cpp - MLIR Unified Parser Interface -------------------------===//
|
|
//
|
|
// 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 implements the parser for the MLIR textual form.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "mlir/Parser/Parser.h"
|
|
#include "mlir/AsmParser/AsmParser.h"
|
|
#include "mlir/Bytecode/BytecodeReader.h"
|
|
#include "llvm/Support/SourceMgr.h"
|
|
|
|
using namespace mlir;
|
|
|
|
LogicalResult mlir::parseSourceFile(const llvm::SourceMgr &sourceMgr,
|
|
Block *block, const ParserConfig &config,
|
|
LocationAttr *sourceFileLoc) {
|
|
const auto *sourceBuf = sourceMgr.getMemoryBuffer(sourceMgr.getMainFileID());
|
|
if (sourceFileLoc) {
|
|
*sourceFileLoc = FileLineColLoc::get(config.getContext(),
|
|
sourceBuf->getBufferIdentifier(),
|
|
/*line=*/0, /*column=*/0);
|
|
}
|
|
if (isBytecode(*sourceBuf))
|
|
return readBytecodeFile(*sourceBuf, block, config);
|
|
return parseAsmSourceFile(sourceMgr, block, config);
|
|
}
|
|
|
|
LogicalResult mlir::parseSourceFile(llvm::StringRef filename, Block *block,
|
|
const ParserConfig &config,
|
|
LocationAttr *sourceFileLoc) {
|
|
llvm::SourceMgr sourceMgr;
|
|
return parseSourceFile(filename, sourceMgr, block, config, sourceFileLoc);
|
|
}
|
|
|
|
LogicalResult mlir::parseSourceFile(llvm::StringRef filename,
|
|
llvm::SourceMgr &sourceMgr, Block *block,
|
|
const ParserConfig &config,
|
|
LocationAttr *sourceFileLoc) {
|
|
if (sourceMgr.getNumBuffers() != 0) {
|
|
// TODO: Extend to support multiple buffers.
|
|
return emitError(mlir::UnknownLoc::get(config.getContext()),
|
|
"only main buffer parsed at the moment");
|
|
}
|
|
auto fileOrErr = llvm::MemoryBuffer::getFileOrSTDIN(filename);
|
|
if (std::error_code error = fileOrErr.getError())
|
|
return emitError(mlir::UnknownLoc::get(config.getContext()),
|
|
"could not open input file " + filename);
|
|
|
|
// Load the MLIR source file.
|
|
sourceMgr.AddNewSourceBuffer(std::move(*fileOrErr), SMLoc());
|
|
return parseSourceFile(sourceMgr, block, config, sourceFileLoc);
|
|
}
|
|
|
|
LogicalResult mlir::parseSourceString(llvm::StringRef sourceStr, Block *block,
|
|
const ParserConfig &config,
|
|
LocationAttr *sourceFileLoc) {
|
|
auto memBuffer = llvm::MemoryBuffer::getMemBuffer(sourceStr);
|
|
if (!memBuffer)
|
|
return failure();
|
|
|
|
llvm::SourceMgr sourceMgr;
|
|
sourceMgr.AddNewSourceBuffer(std::move(memBuffer), SMLoc());
|
|
return parseSourceFile(sourceMgr, block, config, sourceFileLoc);
|
|
}
|