xref: /llvm-project/mlir/lib/Parser/Parser.cpp (revision 7c800a41b04304719f98af376e488962fc3725da)
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