1c60b897dSRiver Riddle //===- Parser.cpp - MLIR Unified Parser Interface -------------------------===//
29b9f7ff5SChris Lattner //
330857107SMehdi Amini // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
456222a06SMehdi Amini // See https://llvm.org/LICENSE.txt for license information.
556222a06SMehdi Amini // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
69b9f7ff5SChris Lattner //
756222a06SMehdi Amini //===----------------------------------------------------------------------===//
89b9f7ff5SChris Lattner //
99b9f7ff5SChris Lattner // This file implements the parser for the MLIR textual form.
109b9f7ff5SChris Lattner //
119b9f7ff5SChris Lattner //===----------------------------------------------------------------------===//
129b9f7ff5SChris Lattner
139eaff423SRiver Riddle #include "mlir/Parser/Parser.h"
14c60b897dSRiver Riddle #include "mlir/AsmParser/AsmParser.h"
15f3acb54cSRiver Riddle #include "mlir/Bytecode/BytecodeReader.h"
1672645b31SJames Molloy #include "llvm/Support/SourceMgr.h"
1751114686SRiver Riddle
189b9f7ff5SChris Lattner using namespace mlir;
199b9f7ff5SChris Lattner
parseSourceFile(const llvm::SourceMgr & sourceMgr,Block * block,const ParserConfig & config,LocationAttr * sourceFileLoc)20c60b897dSRiver Riddle LogicalResult mlir::parseSourceFile(const llvm::SourceMgr &sourceMgr,
21c60b897dSRiver Riddle Block *block, const ParserConfig &config,
22c60b897dSRiver Riddle LocationAttr *sourceFileLoc) {
23b5798030SRiver Riddle const auto *sourceBuf = sourceMgr.getMemoryBuffer(sourceMgr.getMainFileID());
24c60b897dSRiver Riddle if (sourceFileLoc) {
25c60b897dSRiver Riddle *sourceFileLoc = FileLineColLoc::get(config.getContext(),
26c60b897dSRiver Riddle sourceBuf->getBufferIdentifier(),
27ea488bd6SRiver Riddle /*line=*/0, /*column=*/0);
28c60b897dSRiver Riddle }
29f3acb54cSRiver Riddle if (isBytecode(*sourceBuf))
30f3acb54cSRiver Riddle return readBytecodeFile(*sourceBuf, block, config);
31c60b897dSRiver Riddle return parseAsmSourceFile(sourceMgr, block, config);
329b9f7ff5SChris Lattner }
3318546ff8SRiver Riddle LogicalResult
parseSourceFile(const std::shared_ptr<llvm::SourceMgr> & sourceMgr,Block * block,const ParserConfig & config,LocationAttr * sourceFileLoc)3418546ff8SRiver Riddle mlir::parseSourceFile(const std::shared_ptr<llvm::SourceMgr> &sourceMgr,
3518546ff8SRiver Riddle Block *block, const ParserConfig &config,
3618546ff8SRiver Riddle LocationAttr *sourceFileLoc) {
3718546ff8SRiver Riddle const auto *sourceBuf =
3818546ff8SRiver Riddle sourceMgr->getMemoryBuffer(sourceMgr->getMainFileID());
3918546ff8SRiver Riddle if (sourceFileLoc) {
4018546ff8SRiver Riddle *sourceFileLoc = FileLineColLoc::get(config.getContext(),
4118546ff8SRiver Riddle sourceBuf->getBufferIdentifier(),
4218546ff8SRiver Riddle /*line=*/0, /*column=*/0);
4318546ff8SRiver Riddle }
4418546ff8SRiver Riddle if (isBytecode(*sourceBuf))
4518546ff8SRiver Riddle return readBytecodeFile(sourceMgr, block, config);
4618546ff8SRiver Riddle return parseAsmSourceFile(*sourceMgr, block, config);
4718546ff8SRiver Riddle }
48b7fc8348SJacques Pienaar
parseSourceFile(llvm::StringRef filename,Block * block,const ParserConfig & config,LocationAttr * sourceFileLoc)49b5798030SRiver Riddle LogicalResult mlir::parseSourceFile(llvm::StringRef filename, Block *block,
50ea488bd6SRiver Riddle const ParserConfig &config,
51b5798030SRiver Riddle LocationAttr *sourceFileLoc) {
5218546ff8SRiver Riddle auto sourceMgr = std::make_shared<llvm::SourceMgr>();
53ea488bd6SRiver Riddle return parseSourceFile(filename, sourceMgr, block, config, sourceFileLoc);
54d4cf54f2SJacques Pienaar }
55d4cf54f2SJacques Pienaar
loadSourceFileBuffer(llvm::StringRef filename,llvm::SourceMgr & sourceMgr,MLIRContext * ctx)5618546ff8SRiver Riddle static LogicalResult loadSourceFileBuffer(llvm::StringRef filename,
5718546ff8SRiver Riddle llvm::SourceMgr &sourceMgr,
5818546ff8SRiver Riddle MLIRContext *ctx) {
5918546ff8SRiver Riddle if (sourceMgr.getNumBuffers() != 0) {
6018546ff8SRiver Riddle // TODO: Extend to support multiple buffers.
6118546ff8SRiver Riddle return emitError(mlir::UnknownLoc::get(ctx),
6218546ff8SRiver Riddle "only main buffer parsed at the moment");
6318546ff8SRiver Riddle }
6418546ff8SRiver Riddle auto fileOrErr = llvm::MemoryBuffer::getFileOrSTDIN(filename);
650a0aff2dSMikhail Goncharov if (fileOrErr.getError())
6618546ff8SRiver Riddle return emitError(mlir::UnknownLoc::get(ctx),
6718546ff8SRiver Riddle "could not open input file " + filename);
6818546ff8SRiver Riddle
6918546ff8SRiver Riddle // Load the MLIR source file.
7018546ff8SRiver Riddle sourceMgr.AddNewSourceBuffer(std::move(*fileOrErr), SMLoc());
7118546ff8SRiver Riddle return success();
7218546ff8SRiver Riddle }
7318546ff8SRiver Riddle
parseSourceFile(llvm::StringRef filename,llvm::SourceMgr & sourceMgr,Block * block,const ParserConfig & config,LocationAttr * sourceFileLoc)74b5798030SRiver Riddle LogicalResult mlir::parseSourceFile(llvm::StringRef filename,
75b5798030SRiver Riddle llvm::SourceMgr &sourceMgr, Block *block,
76ea488bd6SRiver Riddle const ParserConfig &config,
77c60b897dSRiver Riddle LocationAttr *sourceFileLoc) {
7818546ff8SRiver Riddle if (failed(loadSourceFileBuffer(filename, sourceMgr, config.getContext())))
7918546ff8SRiver Riddle return failure();
8018546ff8SRiver Riddle return parseSourceFile(sourceMgr, block, config, sourceFileLoc);
81d4cf54f2SJacques Pienaar }
parseSourceFile(llvm::StringRef filename,const std::shared_ptr<llvm::SourceMgr> & sourceMgr,Block * block,const ParserConfig & config,LocationAttr * sourceFileLoc)8218546ff8SRiver Riddle LogicalResult mlir::parseSourceFile(
8318546ff8SRiver Riddle llvm::StringRef filename, const std::shared_ptr<llvm::SourceMgr> &sourceMgr,
8418546ff8SRiver Riddle Block *block, const ParserConfig &config, LocationAttr *sourceFileLoc) {
8518546ff8SRiver Riddle if (failed(loadSourceFileBuffer(filename, *sourceMgr, config.getContext())))
8618546ff8SRiver Riddle return failure();
87c60b897dSRiver Riddle return parseSourceFile(sourceMgr, block, config, sourceFileLoc);
880f5602aeSMehdi Amini }
890f5602aeSMehdi Amini
parseSourceString(llvm::StringRef sourceStr,Block * block,const ParserConfig & config,StringRef sourceName,LocationAttr * sourceFileLoc)90b5798030SRiver Riddle LogicalResult mlir::parseSourceString(llvm::StringRef sourceStr, Block *block,
91ea488bd6SRiver Riddle const ParserConfig &config,
9237107e17Srkayaith StringRef sourceName,
93b5798030SRiver Riddle LocationAttr *sourceFileLoc) {
94*7c800a41SJacques Pienaar auto memBuffer =
95*7c800a41SJacques Pienaar llvm::MemoryBuffer::getMemBuffer(sourceStr, sourceName,
96*7c800a41SJacques Pienaar /*RequiresNullTerminator=*/false);
97b7fc8348SJacques Pienaar if (!memBuffer)
98b5798030SRiver Riddle return failure();
99b7fc8348SJacques Pienaar
100c60b897dSRiver Riddle llvm::SourceMgr sourceMgr;
101b7fc8348SJacques Pienaar sourceMgr.AddNewSourceBuffer(std::move(memBuffer), SMLoc());
102ea488bd6SRiver Riddle return parseSourceFile(sourceMgr, block, config, sourceFileLoc);
103b7fc8348SJacques Pienaar }
104