[Mlir-commits] [mlir] f56b1d8 - [mlir][spirv] Use ScopedPrinter in deserialization debugging
Lei Zhang
llvmlistbot at llvm.org
Mon Dec 13 07:52:01 PST 2021
Author: Lei Zhang
Date: 2021-12-13T10:51:56-05:00
New Revision: f56b1d813fc9e2a15931294a776c141a386b6c1f
URL: https://github.com/llvm/llvm-project/commit/f56b1d813fc9e2a15931294a776c141a386b6c1f
DIFF: https://github.com/llvm/llvm-project/commit/f56b1d813fc9e2a15931294a776c141a386b6c1f.diff
LOG: [mlir][spirv] Use ScopedPrinter in deserialization debugging
This gives us better debugging print as it supports indent
levels and other nice features.
Reviewed By: Hardcode84
Differential Revision: https://reviews.llvm.org/D115583
Added:
Modified:
mlir/lib/Target/SPIRV/Deserialization/DeserializeOps.cpp
mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp
mlir/lib/Target/SPIRV/Deserialization/Deserializer.h
Removed:
################################################################################
diff --git a/mlir/lib/Target/SPIRV/Deserialization/DeserializeOps.cpp b/mlir/lib/Target/SPIRV/Deserialization/DeserializeOps.cpp
index ab5d69b49bef..bf2875d03674 100644
--- a/mlir/lib/Target/SPIRV/Deserialization/DeserializeOps.cpp
+++ b/mlir/lib/Target/SPIRV/Deserialization/DeserializeOps.cpp
@@ -104,8 +104,8 @@ spirv::Deserializer::sliceInstruction(spirv::Opcode &opcode,
LogicalResult spirv::Deserializer::processInstruction(
spirv::Opcode opcode, ArrayRef<uint32_t> operands, bool deferInstructions) {
- LLVM_DEBUG(llvm::dbgs() << "[inst] processing instruction "
- << spirv::stringifyOpcode(opcode) << "\n");
+ LLVM_DEBUG(logger.startLine() << "[inst] processing instruction "
+ << spirv::stringifyOpcode(opcode) << "\n");
// First dispatch all the instructions whose opcode does not correspond to
// those that have a direct mirror in the SPIR-V dialect
diff --git a/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp b/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp
index 0ef9c39647ff..8d055eed6a68 100644
--- a/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp
+++ b/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp
@@ -51,10 +51,20 @@ static inline bool isFnEntryBlock(Block *block) {
spirv::Deserializer::Deserializer(ArrayRef<uint32_t> binary,
MLIRContext *context)
: binary(binary), context(context), unknownLoc(UnknownLoc::get(context)),
- module(createModuleOp()), opBuilder(module->getRegion()) {}
+ module(createModuleOp()), opBuilder(module->getRegion())
+#ifndef NDEBUG
+ ,
+ logger(llvm::dbgs())
+#endif
+{
+}
LogicalResult spirv::Deserializer::deserialize() {
- LLVM_DEBUG(llvm::dbgs() << "+++ starting deserialization +++\n");
+ LLVM_DEBUG({
+ logger.resetIndent();
+ logger.startLine()
+ << "//+++---------- start deserialization ----------+++//\n";
+ });
if (failed(processHeader()))
return failure();
@@ -83,7 +93,8 @@ LogicalResult spirv::Deserializer::deserialize() {
attachVCETriple();
- LLVM_DEBUG(llvm::dbgs() << "+++ completed deserialization +++\n");
+ LLVM_DEBUG(logger.startLine()
+ << "//+++-------- completed deserialization --------+++//\n");
return success();
}
@@ -340,7 +351,8 @@ spirv::Deserializer::processFunction(ArrayRef<uint32_t> operands) {
<< operands[0];
}
- if (funcMap.count(operands[1])) {
+ uint32_t fnID = operands[1];
+ if (funcMap.count(fnID)) {
return emitError(unknownLoc, "duplicate function definition/declaration");
}
@@ -363,15 +375,20 @@ spirv::Deserializer::processFunction(ArrayRef<uint32_t> operands) {
<< functionType << " and return type " << resultType << " specified";
}
- std::string fnName = getFunctionSymbol(operands[1]);
+ std::string fnName = getFunctionSymbol(fnID);
auto funcOp = opBuilder.create<spirv::FuncOp>(
unknownLoc, fnName, functionType, fnControl.getValue());
- curFunction = funcMap[operands[1]] = funcOp;
- LLVM_DEBUG(llvm::dbgs() << "-- start function " << fnName << " (type = "
- << fnType << ", id = " << operands[1] << ") --\n");
+ curFunction = funcMap[fnID] = funcOp;
auto *entryBlock = funcOp.addEntryBlock();
- LLVM_DEBUG(llvm::dbgs() << "[block] created entry block " << entryBlock
- << "\n");
+ LLVM_DEBUG({
+ logger.startLine()
+ << "//===-------------------------------------------===//\n";
+ logger.startLine() << "[fn] name: " << fnName << "\n";
+ logger.startLine() << "[fn] type: " << fnType << "\n";
+ logger.startLine() << "[fn] ID: " << fnID << "\n";
+ logger.startLine() << "[fn] entry block: " << entryBlock << "\n";
+ logger.indent();
+ });
// Parse the op argument instructions
if (functionType.getNumInputs()) {
@@ -403,7 +420,7 @@ spirv::Deserializer::processFunction(ArrayRef<uint32_t> operands) {
<< argDefinedType << " at argument " << i;
}
if (getValue(operands[1])) {
- return emitError(unknownLoc, "duplicate definition of result <id> '")
+ return emitError(unknownLoc, "duplicate definition of result <id> ")
<< operands[1];
}
auto argValue = funcOp.getArgument(i);
@@ -428,9 +445,6 @@ spirv::Deserializer::processFunction(ArrayRef<uint32_t> operands) {
return failure();
}
if (opcode == spirv::Opcode::OpFunctionEnd) {
- LLVM_DEBUG(llvm::dbgs()
- << "-- completed function '" << fnName << "' (type = " << fnType
- << ", id = " << operands[1] << ") --\n");
return processFunctionEnd(instOperands);
}
if (opcode != spirv::Opcode::OpLabel) {
@@ -457,8 +471,6 @@ spirv::Deserializer::processFunction(ArrayRef<uint32_t> operands) {
return failure();
}
- LLVM_DEBUG(llvm::dbgs() << "-- completed function '" << fnName << "' (type = "
- << fnType << ", id = " << operands[1] << ") --\n");
return processFunctionEnd(instOperands);
}
@@ -478,6 +490,11 @@ spirv::Deserializer::processFunctionEnd(ArrayRef<uint32_t> operands) {
curBlock = nullptr;
curFunction = llvm::None;
+ LLVM_DEBUG({
+ logger.unindent();
+ logger.startLine()
+ << "//===-------------------------------------------===//\n";
+ });
return success();
}
@@ -1407,8 +1424,8 @@ spirv::Deserializer::processConstantNull(ArrayRef<uint32_t> operands) {
Block *spirv::Deserializer::getOrCreateBlock(uint32_t id) {
if (auto *block = getBlock(id)) {
- LLVM_DEBUG(llvm::dbgs() << "[block] got exiting block for id = " << id
- << " @ " << block << "\n");
+ LLVM_DEBUG(logger.startLine() << "[block] got exiting block for id = " << id
+ << " @ " << block << "\n");
return block;
}
@@ -1416,8 +1433,8 @@ Block *spirv::Deserializer::getOrCreateBlock(uint32_t id) {
// spv.mlir.selection or spv.mlir.loop or function). Create it into the
// function for now and sort out the proper place later.
auto *block = curFunction->addBlock();
- LLVM_DEBUG(llvm::dbgs() << "[block] created block for id = " << id << " @ "
- << block << "\n");
+ LLVM_DEBUG(logger.startLine() << "[block] created block for id = " << id
+ << " @ " << block << "\n");
return blockMap[id] = block;
}
@@ -1487,7 +1504,8 @@ LogicalResult spirv::Deserializer::processLabel(ArrayRef<uint32_t> operands) {
auto labelID = operands[0];
// We may have forward declared this block.
auto *block = getOrCreateBlock(labelID);
- LLVM_DEBUG(llvm::dbgs() << "[block] populating block " << block << "\n");
+ LLVM_DEBUG(logger.startLine()
+ << "[block] populating block " << block << "\n");
// If we have seen this block, make sure it was just a forward declaration.
assert(block->empty() && "re-deserialize the same block!");
@@ -1564,9 +1582,9 @@ LogicalResult spirv::Deserializer::processPhi(ArrayRef<uint32_t> operands) {
Type blockArgType = getType(operands[0]);
BlockArgument blockArg = curBlock->addArgument(blockArgType);
valueMap[operands[1]] = blockArg;
- LLVM_DEBUG(llvm::dbgs() << "[phi] created block argument " << blockArg
- << " id = " << operands[1] << " of type "
- << blockArgType << '\n');
+ LLVM_DEBUG(logger.startLine()
+ << "[phi] created block argument " << blockArg
+ << " id = " << operands[1] << " of type " << blockArgType << "\n");
// For each (value, predecessor) pair, insert the value to the predecessor's
// blockPhiInfo entry so later we can fix the block argument there.
@@ -1575,8 +1593,8 @@ LogicalResult spirv::Deserializer::processPhi(ArrayRef<uint32_t> operands) {
Block *predecessor = getOrCreateBlock(operands[i + 1]);
std::pair<Block *, Block *> predecessorTargetPair{predecessor, curBlock};
blockPhiInfo[predecessorTargetPair].push_back(value);
- LLVM_DEBUG(llvm::dbgs() << "[phi] predecessor @ " << predecessor
- << " with arg id = " << value << '\n');
+ LLVM_DEBUG(logger.startLine() << "[phi] predecessor @ " << predecessor
+ << " with arg id = " << value << "\n");
}
return success();
@@ -1587,6 +1605,22 @@ namespace {
/// spv.mlir.selection/spv.mlir.loop op.
class ControlFlowStructurizer {
public:
+#ifndef NDEBUG
+ ControlFlowStructurizer(Location loc, uint32_t control,
+ spirv::BlockMergeInfoMap &mergeInfo, Block *header,
+ Block *merge, Block *cont,
+ llvm::ScopedPrinter &logger)
+ : location(loc), control(control), blockMergeInfo(mergeInfo),
+ headerBlock(header), mergeBlock(merge), continueBlock(cont),
+ logger(logger) {}
+#else
+ ControlFlowStructurizer(Location loc, uint32_t control,
+ spirv::BlockMergeInfoMap &mergeInfo, Block *header,
+ Block *merge, Block *cont)
+ : location(loc), control(control), blockMergeInfo(mergeInfo),
+ headerBlock(header), mergeBlock(merge), continueBlock(cont) {}
+#endif
+
/// Structurizes the loop at the given `headerBlock`.
///
/// This method will create an spv.mlir.loop op in the `mergeBlock` and move
@@ -1594,22 +1628,9 @@ class ControlFlowStructurizer {
/// branches to the `headerBlock` will be redirected to the `mergeBlock`. This
/// method will also update `mergeInfo` by remapping all blocks inside to the
/// newly cloned ones inside structured control flow op's regions.
- static LogicalResult structurize(Location loc, uint32_t control,
- spirv::BlockMergeInfoMap &mergeInfo,
- Block *headerBlock, Block *mergeBlock,
- Block *continueBlock) {
- return ControlFlowStructurizer(loc, control, mergeInfo, headerBlock,
- mergeBlock, continueBlock)
- .structurizeImpl();
- }
+ LogicalResult structurize();
private:
- ControlFlowStructurizer(Location loc, uint32_t control,
- spirv::BlockMergeInfoMap &mergeInfo, Block *header,
- Block *merge, Block *cont)
- : location(loc), control(control), blockMergeInfo(mergeInfo),
- headerBlock(header), mergeBlock(merge), continueBlock(cont) {}
-
/// Creates a new spv.mlir.selection op at the beginning of the `mergeBlock`.
spirv::SelectionOp createSelectionOp(uint32_t selectionControl);
@@ -1619,8 +1640,6 @@ class ControlFlowStructurizer {
/// Collects all blocks reachable from `headerBlock` except `mergeBlock`.
void collectBlocksInConstruct();
- LogicalResult structurizeImpl();
-
Location location;
uint32_t control;
@@ -1631,6 +1650,11 @@ class ControlFlowStructurizer {
Block *continueBlock; // nullptr for spv.mlir.selection
SetVector<Block *> constructBlocks;
+
+#ifndef NDEBUG
+ /// A logger used to emit information during the deserialzation process.
+ llvm::ScopedPrinter &logger;
+#endif
};
} // namespace
@@ -1674,7 +1698,7 @@ void ControlFlowStructurizer::collectBlocksInConstruct() {
}
}
-LogicalResult ControlFlowStructurizer::structurizeImpl() {
+LogicalResult ControlFlowStructurizer::structurize() {
Operation *op = nullptr;
bool isLoop = continueBlock != nullptr;
if (isLoop) {
@@ -1720,17 +1744,17 @@ LogicalResult ControlFlowStructurizer::structurizeImpl() {
// SelectionOp/LoopOp's region.
auto *newBlock = builder.createBlock(&body.back());
mapper.map(block, newBlock);
- LLVM_DEBUG(llvm::dbgs() << "[cf] cloned block " << newBlock
- << " from block " << block << "\n");
+ LLVM_DEBUG(logger.startLine() << "[cf] cloned block " << newBlock
+ << " from block " << block << "\n");
if (!isFnEntryBlock(block)) {
for (BlockArgument blockArg : block->getArguments()) {
auto newArg = newBlock->addArgument(blockArg.getType());
mapper.map(blockArg, newArg);
- LLVM_DEBUG(llvm::dbgs() << "[cf] remapped block argument " << blockArg
- << " to " << newArg << '\n');
+ LLVM_DEBUG(logger.startLine() << "[cf] remapped block argument "
+ << blockArg << " to " << newArg << "\n");
}
} else {
- LLVM_DEBUG(llvm::dbgs()
+ LLVM_DEBUG(logger.startLine()
<< "[cf] block " << block << " is a function entry block\n");
}
@@ -1758,9 +1782,11 @@ LogicalResult ControlFlowStructurizer::structurizeImpl() {
// SelectionOp/LoopOp resides right now.
headerBlock->replaceAllUsesWith(mergeBlock);
- LLVM_DEBUG(llvm::dbgs() << "[cf] after cloning and fixing references:\n");
- LLVM_DEBUG(llvm::dbgs() << *headerBlock->getParentOp());
- LLVM_DEBUG(llvm::dbgs() << "\n");
+ LLVM_DEBUG({
+ logger.startLine() << "[cf] after cloning and fixing references:\n";
+ headerBlock->getParentOp()->print(logger.getOStream());
+ logger.startLine() << "\n";
+ });
if (isLoop) {
if (!mergeBlock->args_empty()) {
@@ -1790,7 +1816,7 @@ LogicalResult ControlFlowStructurizer::structurizeImpl() {
// All the blocks cloned into the SelectionOp/LoopOp's region can now be
// cleaned up.
- LLVM_DEBUG(llvm::dbgs() << "[cf] cleaning up blocks after clone\n");
+ LLVM_DEBUG(logger.startLine() << "[cf] cleaning up blocks after clone\n");
// First we need to drop all operands' references inside all blocks. This is
// needed because we can have blocks referencing SSA values from one another.
for (auto *block : constructBlocks)
@@ -1853,29 +1879,33 @@ LogicalResult ControlFlowStructurizer::structurizeImpl() {
// flow, we cannot just simply erase it because it may contain arguments
// matching the function signature and used by the cloned blocks.
if (isFnEntryBlock(block)) {
- LLVM_DEBUG(llvm::dbgs() << "[cf] changing entry block " << block
- << " to only contain a spv.Branch op\n");
+ LLVM_DEBUG(logger.startLine() << "[cf] changing entry block " << block
+ << " to only contain a spv.Branch op\n");
// Still keep the function entry block for the potential block arguments,
// but replace all ops inside with a branch to the merge block.
block->clear();
builder.setInsertionPointToEnd(block);
builder.create<spirv::BranchOp>(location, mergeBlock);
} else {
- LLVM_DEBUG(llvm::dbgs() << "[cf] erasing block " << block << "\n");
+ LLVM_DEBUG(logger.startLine() << "[cf] erasing block " << block << "\n");
block->erase();
}
}
- LLVM_DEBUG(
- llvm::dbgs() << "[cf] after structurizing construct with header block "
- << headerBlock << ":\n"
- << *op << '\n');
+ LLVM_DEBUG(logger.startLine()
+ << "[cf] after structurizing construct with header block "
+ << headerBlock << ":\n"
+ << *op << "\n");
return success();
}
LogicalResult spirv::Deserializer::wireUpBlockArgument() {
- LLVM_DEBUG(llvm::dbgs() << "[phi] start wiring up block arguments\n");
+ LLVM_DEBUG({
+ logger.startLine()
+ << "//----- [phi] start wiring up block arguments -----//\n";
+ logger.indent();
+ });
OpBuilder::InsertionGuard guard(opBuilder);
@@ -1883,10 +1913,12 @@ LogicalResult spirv::Deserializer::wireUpBlockArgument() {
Block *block = info.first.first;
Block *target = info.first.second;
const BlockPhiInfo &phiInfo = info.second;
- LLVM_DEBUG(llvm::dbgs() << "[phi] block " << block << "\n");
- LLVM_DEBUG(llvm::dbgs() << "[phi] before creating block argument:\n");
- LLVM_DEBUG(block->getParentOp()->print(llvm::dbgs()));
- LLVM_DEBUG(llvm::dbgs() << '\n');
+ LLVM_DEBUG({
+ logger.startLine() << "[phi] block " << block << "\n";
+ logger.startLine() << "[phi] before creating block argument:\n";
+ block->getParentOp()->print(logger.getOStream());
+ logger.startLine() << "\n";
+ });
// Set insertion point to before this block's terminator early because we
// may materialize ops via getValue() call.
@@ -1898,8 +1930,8 @@ LogicalResult spirv::Deserializer::wireUpBlockArgument() {
for (uint32_t valueId : phiInfo) {
if (Value value = getValue(valueId)) {
blockArgs.push_back(value);
- LLVM_DEBUG(llvm::dbgs() << "[phi] block argument " << value
- << " id = " << valueId << '\n');
+ LLVM_DEBUG(logger.startLine() << "[phi] block argument " << value
+ << " id = " << valueId << "\n");
} else {
return emitError(unknownLoc, "OpPhi references undefined value!");
}
@@ -1932,49 +1964,75 @@ LogicalResult spirv::Deserializer::wireUpBlockArgument() {
return emitError(unknownLoc, "unimplemented terminator for Phi creation");
}
- LLVM_DEBUG(llvm::dbgs() << "[phi] after creating block argument:\n");
- LLVM_DEBUG(block->getParentOp()->print(llvm::dbgs()));
- LLVM_DEBUG(llvm::dbgs() << '\n');
+ LLVM_DEBUG({
+ logger.startLine() << "[phi] after creating block argument:\n";
+ block->getParentOp()->print(logger.getOStream());
+ logger.startLine() << "\n";
+ });
}
blockPhiInfo.clear();
- LLVM_DEBUG(llvm::dbgs() << "[phi] completed wiring up block arguments\n");
+ LLVM_DEBUG({
+ logger.unindent();
+ logger.startLine()
+ << "//--- [phi] completed wiring up block arguments ---//\n";
+ });
return success();
}
LogicalResult spirv::Deserializer::structurizeControlFlow() {
- LLVM_DEBUG(llvm::dbgs() << "[cf] start structurizing control flow\n");
+ LLVM_DEBUG({
+ logger.startLine()
+ << "//----- [cf] start structurizing control flow -----//\n";
+ logger.indent();
+ });
while (!blockMergeInfo.empty()) {
Block *headerBlock = blockMergeInfo.begin()->first;
BlockMergeInfo mergeInfo = blockMergeInfo.begin()->second;
- LLVM_DEBUG(llvm::dbgs() << "[cf] header block " << headerBlock << ":\n");
- LLVM_DEBUG(headerBlock->print(llvm::dbgs()));
+ LLVM_DEBUG({
+ logger.startLine() << "[cf] header block " << headerBlock << ":\n";
+ headerBlock->print(logger.getOStream());
+ logger.startLine() << "\n";
+ });
auto *mergeBlock = mergeInfo.mergeBlock;
assert(mergeBlock && "merge block cannot be nullptr");
if (!mergeBlock->args_empty())
return emitError(unknownLoc, "OpPhi in loop merge block unimplemented");
- LLVM_DEBUG(llvm::dbgs() << "[cf] merge block " << mergeBlock << ":\n");
- LLVM_DEBUG(mergeBlock->print(llvm::dbgs()));
+ LLVM_DEBUG({
+ logger.startLine() << "[cf] merge block " << mergeBlock << ":\n";
+ mergeBlock->print(logger.getOStream());
+ logger.startLine() << "\n";
+ });
auto *continueBlock = mergeInfo.continueBlock;
- if (continueBlock) {
- LLVM_DEBUG(llvm::dbgs()
- << "[cf] continue block " << continueBlock << ":\n");
- LLVM_DEBUG(continueBlock->print(llvm::dbgs()));
- }
+ LLVM_DEBUG(if (continueBlock) {
+ logger.startLine() << "[cf] continue block " << continueBlock << ":\n";
+ continueBlock->print(logger.getOStream());
+ logger.startLine() << "\n";
+ });
// Erase this case before calling into structurizer, who will update
// blockMergeInfo.
blockMergeInfo.erase(blockMergeInfo.begin());
- if (failed(ControlFlowStructurizer::structurize(
- mergeInfo.loc, mergeInfo.control, blockMergeInfo, headerBlock,
- mergeBlock, continueBlock)))
+ ControlFlowStructurizer structurizer(mergeInfo.loc, mergeInfo.control,
+ blockMergeInfo, headerBlock,
+ mergeBlock, continueBlock
+#ifndef NDEBUG
+ ,
+ logger
+#endif
+ );
+ if (failed(structurizer.structurize()))
return failure();
}
- LLVM_DEBUG(llvm::dbgs() << "[cf] completed structurizing control flow\n");
+ LLVM_DEBUG({
+ logger.unindent();
+ logger.startLine()
+ << "//--- [cf] completed structurizing control flow ---//\n";
+ });
return success();
}
@@ -1990,7 +2048,7 @@ Location spirv::Deserializer::createFileLineColLoc(OpBuilder opBuilder) {
if (fileName.empty())
fileName = "<unknown>";
return FileLineColLoc::get(opBuilder.getStringAttr(fileName), debugLine->line,
- debugLine->col);
+ debugLine->column);
}
LogicalResult
@@ -2002,7 +2060,7 @@ spirv::Deserializer::processDebugLine(ArrayRef<uint32_t> operands) {
// OpNoLine instruction."
if (operands.size() != 3)
return emitError(unknownLoc, "OpLine must have 3 operands");
- debugLine = DebugLine(operands[0], operands[1], operands[2]);
+ debugLine = DebugLine{operands[0], operands[1], operands[2]};
return success();
}
diff --git a/mlir/lib/Target/SPIRV/Deserialization/Deserializer.h b/mlir/lib/Target/SPIRV/Deserialization/Deserializer.h
index 5e5dccdf76bd..402bfcbae1d9 100644
--- a/mlir/lib/Target/SPIRV/Deserialization/Deserializer.h
+++ b/mlir/lib/Target/SPIRV/Deserialization/Deserializer.h
@@ -19,6 +19,7 @@
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/StringRef.h"
+#include "llvm/Support/ScopedPrinter.h"
#include <cstdint>
namespace mlir {
@@ -37,7 +38,7 @@ struct BlockMergeInfo {
Block *mergeBlock;
Block *continueBlock; // nullptr for spv.mlir.selection
Location loc;
- uint32_t control;
+ uint32_t control; // Selection/loop control
BlockMergeInfo(Location location, uint32_t control)
: mergeBlock(nullptr), continueBlock(nullptr), loc(location),
@@ -51,10 +52,7 @@ struct BlockMergeInfo {
struct DebugLine {
uint32_t fileID;
uint32_t line;
- uint32_t col;
-
- DebugLine(uint32_t fileIDNum, uint32_t lineNum, uint32_t colNum)
- : fileID(fileIDNum), line(lineNum), col(colNum) {}
+ uint32_t column;
};
/// Map from a selection/loop's header block to its merge (and continue) target.
@@ -599,6 +597,11 @@ class Deserializer {
/// A list of all structs which have unresolved member types.
SmallVector<DeferredStructTypeInfo, 0> deferredStructTypesInfos;
+
+#ifndef NDEBUG
+ /// A logger used to emit information during the deserialzation process.
+ llvm::ScopedPrinter logger;
+#endif
};
} // namespace spirv
More information about the Mlir-commits
mailing list