Change the parseSource* methods to return OwningModuleRef instead of ModuleOp.
authorRiver Riddle <riverriddle@google.com>
Fri, 30 Aug 2019 05:19:29 +0000 (22:19 -0700)
committerA. Unique TensorFlower <gardener@tensorflow.org>
Fri, 30 Aug 2019 05:20:10 +0000 (22:20 -0700)
This avoids potential memory leaks from misuse of the API.

PiperOrigin-RevId: 266305750

mlir/include/mlir/Parser.h
mlir/lib/Parser/Parser.cpp

index 71babe7..5ed8341 100644 (file)
@@ -30,32 +30,34 @@ class StringRef;
 
 namespace mlir {
 class Location;
-class ModuleOp;
 class MLIRContext;
+class OwningModuleRef;
 class Type;
 
 /// This parses the file specified by the indicated SourceMgr and returns an
 /// MLIR module if it was valid.  If not, the error message is emitted through
 /// the error handler registered in the context, and a null pointer is returned.
-ModuleOp parseSourceFile(const llvm::SourceMgr &sourceMgr,
-                         MLIRContext *context);
+OwningModuleRef parseSourceFile(const llvm::SourceMgr &sourceMgr,
+                                MLIRContext *context);
 
 /// This parses the file specified by the indicated filename and returns an
 /// MLIR module if it was valid.  If not, the error message is emitted through
 /// the error handler registered in the context, and a null pointer is returned.
-ModuleOp parseSourceFile(llvm::StringRef filename, MLIRContext *context);
+OwningModuleRef parseSourceFile(llvm::StringRef filename, MLIRContext *context);
 
 /// This parses the file specified by the indicated filename using the provided
 /// SourceMgr and returns an MLIR module if it was valid.  If not, the error
 /// message is emitted through the error handler registered in the context, and
 /// a null pointer is returned.
-ModuleOp parseSourceFile(llvm::StringRef filename, llvm::SourceMgr &sourceMgr,
-                         MLIRContext *context);
+OwningModuleRef parseSourceFile(llvm::StringRef filename,
+                                llvm::SourceMgr &sourceMgr,
+                                MLIRContext *context);
 
 /// This parses the module string to a MLIR module if it was valid.  If not, the
 /// error message is emitted through the error handler registered in the
 /// context, and a null pointer is returned.
-ModuleOp parseSourceString(llvm::StringRef moduleStr, MLIRContext *context);
+OwningModuleRef parseSourceString(llvm::StringRef moduleStr,
+                                  MLIRContext *context);
 
 /// This parses a single MLIR type to an MLIR context if it was valid.  If not,
 /// an error message is emitted through a new SourceMgrDiagnosticHandler
index dde24e4..a6ccd76 100644 (file)
@@ -4133,8 +4133,8 @@ ParseResult ModuleParser::parseModule(ModuleOp module) {
 /// This parses the file specified by the indicated SourceMgr and returns an
 /// MLIR module if it was valid.  If not, it emits diagnostics and returns
 /// null.
-ModuleOp mlir::parseSourceFile(const llvm::SourceMgr &sourceMgr,
-                               MLIRContext *context) {
+OwningModuleRef mlir::parseSourceFile(const llvm::SourceMgr &sourceMgr,
+                                      MLIRContext *context) {
   auto sourceBuf = sourceMgr.getMemoryBuffer(sourceMgr.getMainFileID());
 
   // This is the result module we are parsing into.
@@ -4150,13 +4150,14 @@ ModuleOp mlir::parseSourceFile(const llvm::SourceMgr &sourceMgr,
   if (failed(verify(*module)))
     return nullptr;
 
-  return module.release();
+  return module;
 }
 
 /// This parses the file specified by the indicated filename and returns an
 /// MLIR module if it was valid.  If not, the error message is emitted through
 /// the error handler registered in the context, and a null pointer is returned.
-ModuleOp mlir::parseSourceFile(StringRef filename, MLIRContext *context) {
+OwningModuleRef mlir::parseSourceFile(StringRef filename,
+                                      MLIRContext *context) {
   llvm::SourceMgr sourceMgr;
   return parseSourceFile(filename, sourceMgr, context);
 }
@@ -4165,8 +4166,9 @@ ModuleOp mlir::parseSourceFile(StringRef filename, MLIRContext *context) {
 /// SourceMgr and returns an MLIR module if it was valid.  If not, the error
 /// message is emitted through the error handler registered in the context, and
 /// a null pointer is returned.
-ModuleOp mlir::parseSourceFile(StringRef filename, llvm::SourceMgr &sourceMgr,
-                               MLIRContext *context) {
+OwningModuleRef mlir::parseSourceFile(StringRef filename,
+                                      llvm::SourceMgr &sourceMgr,
+                                      MLIRContext *context) {
   if (sourceMgr.getNumBuffers() != 0) {
     // TODO(b/136086478): Extend to support multiple buffers.
     emitError(mlir::UnknownLoc::get(context),
@@ -4187,7 +4189,8 @@ ModuleOp mlir::parseSourceFile(StringRef filename, llvm::SourceMgr &sourceMgr,
 
 /// This parses the program string to a MLIR module if it was valid. If not,
 /// it emits diagnostics and returns null.
-ModuleOp mlir::parseSourceString(StringRef moduleStr, MLIRContext *context) {
+OwningModuleRef mlir::parseSourceString(StringRef moduleStr,
+                                        MLIRContext *context) {
   auto memBuffer = MemoryBuffer::getMemBuffer(moduleStr);
   if (!memBuffer)
     return nullptr;