1*c60b897dSRiver 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"
14*c60b897dSRiver Riddle #include "mlir/AsmParser/AsmParser.h"
1572645b31SJames Molloy #include "llvm/Support/SourceMgr.h"
1651114686SRiver Riddle
179b9f7ff5SChris Lattner using namespace mlir;
189b9f7ff5SChris Lattner
parseSourceFile(const llvm::SourceMgr & sourceMgr,Block * block,const ParserConfig & config,LocationAttr * sourceFileLoc)19*c60b897dSRiver Riddle LogicalResult mlir::parseSourceFile(const llvm::SourceMgr &sourceMgr,
20*c60b897dSRiver Riddle Block *block, const ParserConfig &config,
21*c60b897dSRiver Riddle LocationAttr *sourceFileLoc) {
22b5798030SRiver Riddle const auto *sourceBuf = sourceMgr.getMemoryBuffer(sourceMgr.getMainFileID());
23*c60b897dSRiver Riddle if (sourceFileLoc) {
24*c60b897dSRiver Riddle *sourceFileLoc = FileLineColLoc::get(config.getContext(),
25*c60b897dSRiver Riddle sourceBuf->getBufferIdentifier(),
26ea488bd6SRiver Riddle /*line=*/0, /*column=*/0);
27*c60b897dSRiver Riddle }
28*c60b897dSRiver Riddle return parseAsmSourceFile(sourceMgr, block, config);
299b9f7ff5SChris Lattner }
30b7fc8348SJacques Pienaar
parseSourceFile(llvm::StringRef filename,Block * block,const ParserConfig & config,LocationAttr * sourceFileLoc)31b5798030SRiver Riddle LogicalResult mlir::parseSourceFile(llvm::StringRef filename, Block *block,
32ea488bd6SRiver Riddle const ParserConfig &config,
33b5798030SRiver Riddle LocationAttr *sourceFileLoc) {
34d4cf54f2SJacques Pienaar llvm::SourceMgr sourceMgr;
35ea488bd6SRiver Riddle return parseSourceFile(filename, sourceMgr, block, config, sourceFileLoc);
36d4cf54f2SJacques Pienaar }
37d4cf54f2SJacques Pienaar
parseSourceFile(llvm::StringRef filename,llvm::SourceMgr & sourceMgr,Block * block,const ParserConfig & config,LocationAttr * sourceFileLoc)38b5798030SRiver Riddle LogicalResult mlir::parseSourceFile(llvm::StringRef filename,
39b5798030SRiver Riddle llvm::SourceMgr &sourceMgr, Block *block,
40ea488bd6SRiver Riddle const ParserConfig &config,
41*c60b897dSRiver Riddle LocationAttr *sourceFileLoc) {
42d4cf54f2SJacques Pienaar if (sourceMgr.getNumBuffers() != 0) {
439db53a18SRiver Riddle // TODO: Extend to support multiple buffers.
44ea488bd6SRiver Riddle return emitError(mlir::UnknownLoc::get(config.getContext()),
45d4cf54f2SJacques Pienaar "only main buffer parsed at the moment");
46d4cf54f2SJacques Pienaar }
4705fb2606SUday Bondhugula auto fileOrErr = llvm::MemoryBuffer::getFileOrSTDIN(filename);
4805fb2606SUday Bondhugula if (std::error_code error = fileOrErr.getError())
49ea488bd6SRiver Riddle return emitError(mlir::UnknownLoc::get(config.getContext()),
50d4cf54f2SJacques Pienaar "could not open input file " + filename);
510f5602aeSMehdi Amini
52b5798030SRiver Riddle // Load the MLIR source file.
536842ec42SRiver Riddle sourceMgr.AddNewSourceBuffer(std::move(*fileOrErr), SMLoc());
54*c60b897dSRiver Riddle return parseSourceFile(sourceMgr, block, config, sourceFileLoc);
550f5602aeSMehdi Amini }
560f5602aeSMehdi Amini
parseSourceString(llvm::StringRef sourceStr,Block * block,const ParserConfig & config,LocationAttr * sourceFileLoc)57b5798030SRiver Riddle LogicalResult mlir::parseSourceString(llvm::StringRef sourceStr, Block *block,
58ea488bd6SRiver Riddle const ParserConfig &config,
59b5798030SRiver Riddle LocationAttr *sourceFileLoc) {
60*c60b897dSRiver Riddle auto memBuffer = llvm::MemoryBuffer::getMemBuffer(sourceStr);
61b7fc8348SJacques Pienaar if (!memBuffer)
62b5798030SRiver Riddle return failure();
63b7fc8348SJacques Pienaar
64*c60b897dSRiver Riddle llvm::SourceMgr sourceMgr;
65b7fc8348SJacques Pienaar sourceMgr.AddNewSourceBuffer(std::move(memBuffer), SMLoc());
66ea488bd6SRiver Riddle return parseSourceFile(sourceMgr, block, config, sourceFileLoc);
67b7fc8348SJacques Pienaar }
68