From 99c295477fa1f6c5ce47e0d1c8fb3eea9d5e5f98 Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Thu, 7 Nov 2019 13:51:46 -0500 Subject: * Removed strip pass from emit as no longer needed (#1114) * If obfuscate is enabled do strip on Layout * Add option to keep insts that have layout decoration (else DCE strips layout) * Add NameHint back in lowering - as strip now correctly removes. We may want NameHints in some stages even with obfuscation (for error messages in IR passes), as long as they are removed appropriately at the end --- source/slang/slang-emit.cpp | 9 --------- source/slang/slang-ir-dce.cpp | 5 +++++ source/slang/slang-ir-dce.h | 1 + source/slang/slang-lower-to-ir.cpp | 23 ++++++++++++++++++----- 4 files changed, 24 insertions(+), 14 deletions(-) (limited to 'source') diff --git a/source/slang/slang-emit.cpp b/source/slang/slang-emit.cpp index 670848002..345dfe9b2 100644 --- a/source/slang/slang-emit.cpp +++ b/source/slang/slang-emit.cpp @@ -474,15 +474,6 @@ String emitEntryPoint( break; } - // If we have obfuscation strip - if (compileRequest->getLinkage()->m_obfuscateCode) - { - IRStripOptions options; - options.shouldStripNameHints = true; - options.stripSourceLocs = true; - stripFrontEndOnlyInstructions(irModule, options); - } - // The resource-based specialization pass above // may create specialized versions of functions, but // it does not try to completely eliminate the original diff --git a/source/slang/slang-ir-dce.cpp b/source/slang/slang-ir-dce.cpp index 4359e7e92..7c1cda75f 100644 --- a/source/slang/slang-ir-dce.cpp +++ b/source/slang/slang-ir-dce.cpp @@ -256,6 +256,11 @@ struct DeadCodeEliminationContext } } + if (options.keepLayoutsAlive && inst->findDecoration()) + { + return true; + } + // A basic block is an interesting case. Knowing that a function // is live means that its entry block is live, but the liveness // of any other blocks is determined by whether they are referenced diff --git a/source/slang/slang-ir-dce.h b/source/slang/slang-ir-dce.h index 6d4ae9d08..007905486 100644 --- a/source/slang/slang-ir-dce.h +++ b/source/slang/slang-ir-dce.h @@ -8,6 +8,7 @@ namespace Slang struct IRDeadCodeEliminationOptions { bool keepExportsAlive = false; + bool keepLayoutsAlive = false; }; /// Eliminate "dead" code from the given IR module. diff --git a/source/slang/slang-lower-to-ir.cpp b/source/slang/slang-lower-to-ir.cpp index f9d39993a..93084fedd 100644 --- a/source/slang/slang-lower-to-ir.cpp +++ b/source/slang/slang-lower-to-ir.cpp @@ -1846,11 +1846,6 @@ static void addNameHint( IRInst* inst, Decl* decl) { - if (context->shared->m_obfuscateCode) - { - return; - } - String name = getNameForNameHint(context, decl); if(name.getLength() == 0) return; @@ -7294,6 +7289,24 @@ RefPtr TargetProgram::createIRModuleForLayout(DiagnosticSink* sink) builder->addLayoutDecoration(irType, irTypeLayout); } + // Lets strip and run DCE here + if (linkage->m_obfuscateCode) + { + IRStripOptions stripOptions; + + stripOptions.shouldStripNameHints = linkage->m_obfuscateCode; + stripOptions.stripSourceLocs = linkage->m_obfuscateCode; + + stripFrontEndOnlyInstructions(irModule, stripOptions); + + IRDeadCodeEliminationOptions options; + options.keepExportsAlive = true; + options.keepLayoutsAlive = true; + + // Eliminate any dead code + eliminateDeadCode(irModule, options); + } + m_irModuleForLayout = irModule; return irModule; } -- cgit v1.2.3