@@ -189,11 +189,11 @@ class FileProcessor {
189189 std::string errorMessage;
190190 auto input = openInputFile (fileName, &errorMessage);
191191 if (!input)
192- return emitFileError (fileName, errorMessage);
192+ return linker. emitFileError (fileName, errorMessage);
193193
194194 // Process each file chunk
195195 if (failed (processFile (std::move (input), config)))
196- return emitFileError (fileName, " Failed to process input file" );
196+ return linker. emitFileError (fileName, " Failed to process input file" );
197197
198198 return success ();
199199 }
@@ -220,26 +220,20 @@ class FileProcessor {
220220 // Parse the source file
221221 OwningOpRef<Operation *> op =
222222 parseSourceFileForTool (sourceMgr, ctx, true /* insertImplicitModule*/ );
223-
224223 ctx->enableMultithreading (wasThreadingEnabled);
225224
226225 if (!op)
227- return emitError (" Failed to parse source file" );
226+ return linker.emitError (" Failed to parse source file" );
227+
228+ if (!isa<ModuleOp>(op.get ()))
229+ return op->emitError (" Expected a ModuleOp" );
228230
229231 // TBD: symbol promotion
230232
231233 // TBD: internalization
232-
234+ OwningOpRef<ModuleOp> mod = cast<ModuleOp>(op. release ());
233235 // Link the parsed operation
234- return linker.linkInModule (std::move (op), config.flags );
235- }
236-
237- LogicalResult emitFileError (const Twine &fileName, const Twine &message) {
238- return emitError (" Error processing file '" + fileName + " ': " + message);
239- }
240-
241- LogicalResult emitError (const Twine &message) {
242- return mlir::emitError (mlir::UnknownLoc::get (linker.getContext ()), message);
236+ return linker.linkInModule (std::move (mod), config.flags );
243237 }
244238
245239 Linker &linker;
@@ -269,22 +263,14 @@ LogicalResult mlir::MlirLinkMain(int argc, char **argv,
269263 MLIRContext context (registry);
270264 context.allowUnregisteredDialects (config.shouldAllowUnregisteredDialects ());
271265
272- // Create composite module
273- OwningOpRef<ModuleOp> composite = [&context]() {
274- OpBuilder builder (&context);
275- return OwningOpRef<ModuleOp>(builder.create <ModuleOp>(
276- FileLineColLoc::get (&context, " mlir-link" , 0 , 0 )));
277- }();
278-
279- Linker linker (composite.get (), config);
266+ Linker linker (config, &context);
280267
281268 // Prepare output file
282269 std::string errorMessage;
283270 auto out = openOutputFile (config.outputFile , &errorMessage);
284271
285272 if (!out) {
286- errs () << errorMessage;
287- return failure ();
273+ return linker.emitError (" Failed to open output file: " + errorMessage);
288274 }
289275
290276 StringRef inMarker = config.inputSplitMarker ();
@@ -296,10 +282,11 @@ LogicalResult mlir::MlirLinkMain(int argc, char **argv,
296282 if (failed (proc.linkFiles (config.inputFiles )))
297283 return failure ();
298284
299- // TODO: Remove
285+ OwningOpRef<ModuleOp> composite = linker. takeModule ();
300286 if (failed (verify (composite.get (), true ))) {
301- llvm::outs () << " Verify failed\n " ;
287+ return composite-> emitError ( " verification after linking failed" ) ;
302288 }
289+
303290 composite->print (out->os ());
304291 out->keep ();
305292
0 commit comments