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 });