// slang-ir-strip.cpp #include "slang-ir-strip.h" #include "slang-ir-insts.h" #include "slang-ir.h" namespace Slang { /// Should `inst` be stripped, given the current `options`? static bool _shouldStripInst(IRInst* inst, IRStripOptions const& options) { switch (inst->getOp()) { default: return false; case kIROp_HighLevelDeclDecoration: return true; case kIROp_NameHintDecoration: return options.shouldStripNameHints; } } /// Recursively strip `inst` and its children according to `options`. static void _stripFrontEndOnlyInstructionsRec(IRInst* inst, IRStripOptions const& options) { if (_shouldStripInst(inst, options)) { inst->removeAndDeallocate(); return; } if (options.stripSourceLocs) { inst->sourceLoc = SourceLoc(); } IRInst* nextChild = nullptr; for (IRInst* child = inst->getFirstDecorationOrChild(); child; child = nextChild) { nextChild = child->getNextInst(); _stripFrontEndOnlyInstructionsRec(child, options); } } void stripFrontEndOnlyInstructions(IRModule* module, IRStripOptions const& options) { _stripFrontEndOnlyInstructionsRec(module->getModuleInst(), options); } } // namespace Slang