diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2019-11-07 13:51:46 -0500 |
|---|---|---|
| committer | Tim Foley <tfoleyNV@users.noreply.github.com> | 2019-11-07 10:51:46 -0800 |
| commit | 99c295477fa1f6c5ce47e0d1c8fb3eea9d5e5f98 (patch) | |
| tree | a546b873cb621eac61137b650b196a2a161815ad | |
| parent | fedda2e5342d3bfbdbbdd3ca232b3f69fff81ef7 (diff) | |
* 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
| -rw-r--r-- | source/slang/slang-emit.cpp | 9 | ||||
| -rw-r--r-- | source/slang/slang-ir-dce.cpp | 5 | ||||
| -rw-r--r-- | source/slang/slang-ir-dce.h | 1 | ||||
| -rw-r--r-- | source/slang/slang-lower-to-ir.cpp | 23 |
4 files changed, 24 insertions, 14 deletions
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<IRLayoutDecoration>()) + { + 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<IRModule> 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; } |
