summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2019-11-07 13:51:46 -0500
committerTim Foley <tfoleyNV@users.noreply.github.com>2019-11-07 10:51:46 -0800
commit99c295477fa1f6c5ce47e0d1c8fb3eea9d5e5f98 (patch)
treea546b873cb621eac61137b650b196a2a161815ad /source
parentfedda2e5342d3bfbdbbdd3ca232b3f69fff81ef7 (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
Diffstat (limited to 'source')
-rw-r--r--source/slang/slang-emit.cpp9
-rw-r--r--source/slang/slang-ir-dce.cpp5
-rw-r--r--source/slang/slang-ir-dce.h1
-rw-r--r--source/slang/slang-lower-to-ir.cpp23
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;
}