mirror of
https://github.com/revng/revng
synced 2026-06-21 14:07:57 +00:00
e1b5541462
The DLAStep SimplifyInstanceAtOffset0 now only triggers if the parent node has the child-at-offset-0 node as its only successor, or when the child-at-offset-0 doesn't have other predecessors. Doing this guarantees that it's impossible for another predecessor of the child-at-offset-0 to start seeing memory accesses that were initially relative to the parent. This condition is slightly more restrictive than the previous one, but it takes into consideration some far reaching consequences. If SimplifyInstanceAtOffset0 aggressively like we did before, DLA can end up inferring types in some memory locations, like executable segments, for which there aren't clues in the binary. This isn't bad per se, but if DLA does that, the newly recovered type is identified as non-executable data, causing misdecompilation because rev.ng doesn't decompile memory regions that it understands as non executable. This commit, making SimplifyInstanceAtOffset0 less aggressive, makes it play better with the rest of the assumptions of the decompilation pipeline. It also relaxes a decompilation test that was previously working by chance and that was effectively beyond the current expressive power of reasoning for DLA at the moment.