If you’ve ever had to decompile tricky code that demanded writing a decompiler plugin, you probably know about the Hex-Rays Microcode—an intermediate representation (IR) generated from CPU-specific assembler and refined through multiple maturity levels.
For each function, microcode (mba_t) is organized into blocks (mblock_t), each containing microinstructions (minsn_t) that operate on zero to three microoperands (mop_t). As microcode matures, instructions often get optimized away, while those that remain tend to grow more complex. Microoperands can themselves be the output of other microinstructions (sub-instructions), making it possible to nest microcode several levels deep.
Simple: the microcode layer is where you can write custom optimization rules (optinsn_t and optblock_t) to catch compiler or obfuscator patterns missed by the decompiler. These user-induced tweaks still go through the existing optimization passes, so you get all the benefits of the decompiler’s higher-level analyses.
The Hex-Rays Decompiler SDK lets you hook into the pipeline and intercept microcode generation, so plugins can reshape the hierarchy however they see fit. (Pro tip: always run verify() on your mba_t after you’re done messing with improving it. verify.cpp will translate those cryptic interr numbers—seriously, use it!)
Over the years, the community has built IDA plugins to visualize microcode at different stages, embedding subviews directly into IDA. (Shoutout to Markus Gaasedelen, patois, and Rolf Rolles—we’ve been piggybacking on your work for far too long.) Now, with IDA 9.2 (coming soon), we’re introducing a built-in subview for exploring generated microcode at any maturity level.
Note: This is just the first iteration of the microcode viewer; there’s more work to be done. We have plans to continue to add more key features in the near future.
This new microcode view syncs with disassembly, pseudocode, or other microcode views—at any stage in the decompilation process. In 9.2, it’s a straightforward tool for inspecting transformations and a first step toward our goal of making the decompiler more accessible and interactive. (Remember our mention of interactivity in the 2025 roadmap? Here we are.)
We’ve got plenty of exciting ideas for expanding this widget in future releases. Stay tuned—things are about to get interesting.