github.com/johnnyeven/libtools@v0.0.0-20191126065708-61829c1adf46/third_party/mlir/lib/Dialect/SPIRV/Serialization/ConvertToBinary.cpp (about)

     1  //===- ConvertToBinary.cpp - MLIR SPIR-V module to binary conversion ------===//
     2  //
     3  // Copyright 2019 The MLIR Authors.
     4  //
     5  // Licensed under the Apache License, Version 2.0 (the "License");
     6  // you may not use this file except in compliance with the License.
     7  // You may obtain a copy of the License at
     8  //
     9  //   http://www.apache.org/licenses/LICENSE-2.0
    10  //
    11  // Unless required by applicable law or agreed to in writing, software
    12  // distributed under the License is distributed on an "AS IS" BASIS,
    13  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14  // See the License for the specific language governing permissions and
    15  // limitations under the License.
    16  // =============================================================================
    17  //
    18  // This file implements a translation from MLIR SPIR-V ModuleOp to SPIR-V
    19  // binary module.
    20  //
    21  //===----------------------------------------------------------------------===//
    22  
    23  #include "mlir/Dialect/SPIRV/SPIRVOps.h"
    24  #include "mlir/Dialect/SPIRV/Serialization.h"
    25  #include "mlir/IR/Function.h"
    26  #include "mlir/IR/Module.h"
    27  #include "mlir/Support/FileUtilities.h"
    28  #include "mlir/Support/LogicalResult.h"
    29  #include "mlir/Translation.h"
    30  #include "llvm/ADT/StringRef.h"
    31  #include "llvm/Support/ToolOutputFile.h"
    32  
    33  using namespace mlir;
    34  
    35  LogicalResult serializeModule(ModuleOp module, StringRef outputFilename) {
    36    if (!module)
    37      return failure();
    38  
    39    SmallVector<uint32_t, 0> binary;
    40    bool done = false;
    41    auto result = failure();
    42  
    43    for (auto spirvModule : module.getOps<spirv::ModuleOp>()) {
    44      if (done)
    45        return spirvModule.emitError("found more than one 'spv.module' op");
    46  
    47      done = true;
    48      result = spirv::serialize(spirvModule, binary);
    49    }
    50  
    51    if (failed(result))
    52      return failure();
    53  
    54    auto file = openOutputFile(outputFilename);
    55    if (!file)
    56      return failure();
    57  
    58    file->os().write(reinterpret_cast<char *>(binary.data()),
    59                     binary.size() * sizeof(uint32_t));
    60    file->keep();
    61  
    62    return mlir::success();
    63  }
    64  
    65  static TranslateFromMLIRRegistration
    66      registration("serialize-spirv",
    67                   [](ModuleOp module, StringRef outputFilename) {
    68                     return serializeModule(module, outputFilename);
    69                   });