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