Pass Order¶
The plugin auto-registers passes via registerOptimizerLastEPCallback, so the
ordering below runs after the standard -O1 / -O2 optimizations.
Ordering matters: e.g. kagura-tamper measures function checksums before
CFG-mutating passes change the IR.
-O1 / -O2 (standard optimizations first)
1. kagura-config → load JSON policy (if -kagura-config is set)
2. kagura-ci → external call indirection
3. kagura-pac → pointer auth
4. kagura-str[-aes] → encrypt narrow strings
5. kagura-wstr → encrypt wide strings / CFString
5a. kagura-string-split → fragment long string literals (after str/str-aes)
6. kagura-tamper → integrity hash (before CFG changes)
7. kagura-objc → ObjC selector/class obfuscation
8. kagura-jni → JNI dynamic registration
9. kagura-anti-debug → anti-analysis checks
10. kagura-fsplit → function splitting
11. kagura-genc → encrypt globals
12. kagura-honey → inject honey values and fake stubs
13. kagura-sv → hide symbols
14. kagura-fla → CFG flattening ┐
15. kagura-bcf → bogus control flow │
16. kagura-bbs → BB splitting │
17. kagura-bbr → BB reordering │
18. kagura-dci → dead code insertion │
19. kagura-sub → instruction subst. │ function passes
20. kagura-cse-break → break CSE re-folding │
21. kagura-co → constant obfuscation │
21. kagura-mvo → memory value XOR │
22. kagura-pe → pointer encryption │
23. kagura-telemetry → telemetry probes │
24. kagura-bbcheck → BB checksum guards │
25. kagura-elt → encrypted lookup tbl ┘
26. kagura-dwarf-control → DWARF strip/obfuscate (if -kagura-dwarf != keep)
27. kagura-vtp → RTTI/vtable protection
28. kagura-symmap → emit JSON symbol map (if -kagura-symmap)
29. kagura-audit → emit audit log (if -kagura-audit)
Manual ordering with opt¶
Use the same order if you drive the plugin from opt instead of letting the
auto-registration handle it:
opt --load-pass-plugin=KaguraObfuscator.dylib \
-passes="kagura-str,function(kagura-fla,kagura-bcf,kagura-sub)" \
input.bc -o output.bc
Module-level passes (config, ci, pac, str, …) appear at the top level;
function-level passes are wrapped in function(...).