1 //===- ToolUtilities.cpp - MLIR Tool Utilities ----------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file defines common utilities for implementing MLIR tools. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "mlir/Support/ToolUtilities.h" 14 #include "mlir/Support/LLVM.h" 15 #include "mlir/Support/LogicalResult.h" 16 #include "llvm/Support/SourceMgr.h" 17 18 using namespace mlir; 19 20 LogicalResult 21 mlir::splitAndProcessBuffer(std::unique_ptr<llvm::MemoryBuffer> originalBuffer, 22 ChunkBufferHandler processChunkBuffer, 23 raw_ostream &os) { 24 const char splitMarker[] = "// -----"; 25 26 auto *origMemBuffer = originalBuffer.get(); 27 SmallVector<StringRef, 8> sourceBuffers; 28 origMemBuffer->getBuffer().split(sourceBuffers, splitMarker); 29 30 // Add the original buffer to the source manager. 31 llvm::SourceMgr fileSourceMgr; 32 fileSourceMgr.AddNewSourceBuffer(std::move(originalBuffer), llvm::SMLoc()); 33 34 // Process each chunk in turn. 35 bool hadFailure = false; 36 for (auto &subBuffer : sourceBuffers) { 37 auto splitLoc = llvm::SMLoc::getFromPointer(subBuffer.data()); 38 unsigned splitLine = fileSourceMgr.getLineAndColumn(splitLoc).first; 39 auto subMemBuffer = llvm::MemoryBuffer::getMemBufferCopy( 40 subBuffer, Twine("within split at ") + 41 origMemBuffer->getBufferIdentifier() + ":" + 42 Twine(splitLine) + " offset "); 43 if (failed(processChunkBuffer(std::move(subMemBuffer), os))) 44 hadFailure = true; 45 } 46 47 // If any fails, then return a failure of the tool. 48 return failure(hadFailure); 49 } 50