From 11ec9d5d14058cfac706da7c9de3e432894e718b Mon Sep 17 00:00:00 2001 From: ManDude <7569514+ManDude@users.noreply.github.com> Date: Thu, 29 Sep 2022 19:10:58 +0100 Subject: [PATCH 01/10] write a function that outputs a `dot` graph of the jak 2 tasks (#1932) --- goal_src/jak2/examples/debug-jak2.gc | 82 +++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 1 deletion(-) diff --git a/goal_src/jak2/examples/debug-jak2.gc b/goal_src/jak2/examples/debug-jak2.gc index 46481b56ba..1361979a98 100644 --- a/goal_src/jak2/examples/debug-jak2.gc +++ b/goal_src/jak2/examples/debug-jak2.gc @@ -244,4 +244,84 @@ ) ) proc) - ) \ No newline at end of file + ) + +(defun levelname->x11-color ((name symbol)) + (case name + (('city) "khaki") + (('fortress) "salmon") + (('stadium) "yellow") + (('palace) "hotpink") + (('castle) "gray") + (('ruins) "darkkhaki") + (('atoll) "gold") + (('sewer) "turquoise") + (('strip) "white") + (('mountain) "tan") + (('forest) "limegreen") + (('drill) "seagreen") + (('tomb) "chartreuse") + (('dig) "orange") + (('canyon) "#008B8B") + (('consite) "#90EE90") + (('under) "dodgerblue") + (('nest) "violet") + (('default) "white") + (('test) "purple") + (else "magenta") + ) + ) + +(defun print-task-node-tree-graphviz () + + (format #t "digraph G {~%") + (format #t " node [style=filled shape=ellipse]~%~%") + (let ((game-tasks (-> *game-info* play-list))) + (dotimes (t (-> game-tasks length)) + (let ((task (-> game-tasks t))) + (format #t " subgraph cluster_task_~D {~%" t) + (format #t " label = ~A;~%" (-> task name)) + (format #t " style = filled;~%") + (format #t " fontsize = \"25pt\";~%") + (cond + ((and (>= t (game-task fortress-escape)) + (<= t (game-task nest-boss)) + (!= t (game-task city-blue-gun-training)) + (!= t (game-task city-dark-gun-training))) + (format #t " fillcolor = lightgray;~%") + ) + ((and (>= t (game-task city-burning-bush-ring-1)) + (<= t (game-task stadium-burning-bush-race-class1-r))) + (format #t " fillcolor = pink;~%") + ) + (else + (format #t " fillcolor = lightyellow;~%") + ) + ) + (let ((game-nodes (-> *game-info* sub-task-list))) + (dotimes (i (-> game-nodes length)) + (let ((node (-> game-nodes i))) + (when (= t (-> node task)) + ;; iterate through parents + (dotimes (ii 4) + (when (!= (game-task-node none) (-> node parent-node ii)) + (format #t " ~A -> ~A;~%" (game-task-node->string (-> node parent-node ii)) (-> node name)) + ) + ) + (format #t " ~A [fillcolor=~A shape=~S];~%" (-> node name) (levelname->x11-color (-> node level)) + (cond + ((logtest? (-> node flags) (game-task-node-flag close-task)) + "oval") + (else + "box"))) + ) + ) + ) + (format #t " }~%") + ) + ) + ) + ) + (format #t "}~%") + 0) + From 4e48ba21c1a0ee97492708120cc2e824764dbc94 Mon Sep 17 00:00:00 2001 From: ManDude <7569514+ManDude@users.noreply.github.com> Date: Fri, 30 Sep 2022 23:26:52 +0100 Subject: [PATCH 02/10] [decompiler] make `(not (logtest?` work (#1934) --- decompiler/IR2/FormExpressionAnalysis.cpp | 124 +++++++++--------- .../jak1/engine/ambient/ambient_REF.gc | 2 +- .../reference/jak1/engine/anim/aligner_REF.gc | 4 +- .../reference/jak1/engine/anim/joint_REF.gc | 4 +- .../jak1/engine/camera/cam-combiner_REF.gc | 2 +- .../jak1/engine/camera/cam-layout_REF.gc | 8 +- .../jak1/engine/camera/cam-master_REF.gc | 6 +- .../jak1/engine/camera/cam-states-dbg_REF.gc | 4 +- .../jak1/engine/camera/cam-states_REF.gc | 26 ++-- .../jak1/engine/camera/camera_REF.gc | 2 +- .../collide/collide-reaction-target_REF.gc | 6 +- .../jak1/engine/debug/anim-tester_REF.gc | 22 ++-- .../reference/jak1/engine/debug/menu_REF.gc | 2 +- .../jak1/engine/draw/drawable-tree_REF.gc | 2 +- .../jak1/engine/draw/drawable_REF.gc | 10 +- .../jak1/engine/draw/process-drawable_REF.gc | 6 +- .../jak1/engine/entity/entity_REF.gc | 8 +- .../jak1/engine/game/collectables-part_REF.gc | 6 +- .../jak1/engine/game/collectables_REF.gc | 8 +- .../jak1/engine/game/game-info_REF.gc | 2 +- .../jak1/engine/game/generic-obs_REF.gc | 8 +- .../jak1/engine/game/powerups_REF.gc | 4 +- .../jak1/engine/game/projectiles_REF.gc | 6 +- .../jak1/engine/game/settings_REF.gc | 2 +- .../engine/game/task/process-taskable_REF.gc | 2 +- .../jak1/engine/game/voicebox_REF.gc | 2 +- .../engine/gfx/generic/generic-merc_REF.gc | 2 +- .../jak1/engine/gfx/hw/display_REF.gc | 2 +- .../jak1/engine/gfx/merc/merc_REF.gc | 2 +- .../reference/jak1/engine/gfx/ripple_REF.gc | 2 +- .../jak1/engine/gfx/water/water_REF.gc | 24 ++-- .../jak1/engine/level/load-boundary_REF.gc | 4 +- .../reference/jak1/engine/load/decomp_REF.gc | 2 +- .../reference/jak1/engine/load/loader_REF.gc | 2 +- .../reference/jak1/engine/nav/navigate_REF.gc | 14 +- .../reference/jak1/engine/nav/path_REF.gc | 4 +- .../reference/jak1/engine/ps2/pad_REF.gc | 2 +- .../sparticle/sparticle-launcher_REF.gc | 10 +- .../jak1/engine/target/logic-target_REF.gc | 32 ++--- .../jak1/engine/target/target-death_REF.gc | 16 +-- .../jak1/engine/target/target-handler_REF.gc | 14 +- .../jak1/engine/target/target-util_REF.gc | 37 +++--- .../jak1/engine/target/target2_REF.gc | 43 +++--- .../jak1/engine/target/target_REF.gc | 35 +++-- .../jak1/engine/ui/hud-classes_REF.gc | 2 +- .../reference/jak1/kernel/gcommon_REF.gc | 4 +- .../reference/jak1/kernel/gkernel_REF.gc | 4 +- .../jak1/levels/beach/beach-obs_REF.gc | 12 +- .../jak1/levels/beach/lurkercrab_REF.gc | 2 +- .../jak1/levels/beach/seagull_REF.gc | 8 +- .../levels/common/battlecontroller_REF.gc | 2 +- .../jak1/levels/common/nav-enemy_REF.gc | 14 +- .../jak1/levels/common/ropebridge_REF.gc | 2 +- .../jak1/levels/common/sharkey_REF.gc | 4 +- .../jak1/levels/finalboss/final-door_REF.gc | 2 +- .../jak1/levels/finalboss/light-eco_REF.gc | 2 +- .../levels/finalboss/robotboss-misc_REF.gc | 2 +- .../jak1/levels/finalboss/robotboss_REF.gc | 4 +- .../levels/flut_common/target-flut_REF.gc | 30 ++--- .../jak1/levels/jungle/darkvine_REF.gc | 2 +- .../jak1/levels/jungle/hopper_REF.gc | 4 +- .../jak1/levels/jungle/jungle-mirrors_REF.gc | 4 +- .../jak1/levels/lavatube/lavatube-obs_REF.gc | 4 +- .../levels/maincave/driller-lurker_REF.gc | 4 +- .../jak1/levels/maincave/gnawer_REF.gc | 2 +- .../jak1/levels/maincave/mother-spider_REF.gc | 6 +- .../jak1/levels/misty/bonelurker_REF.gc | 2 +- .../jak1/levels/misty/mistycannon_REF.gc | 10 +- .../collide-reaction-racer_REF.gc | 4 +- .../levels/racer_common/racer-part_REF.gc | 2 +- .../levels/racer_common/racer-states_REF.gc | 5 +- .../levels/racer_common/target-racer_REF.gc | 9 +- .../rolling/rolling-lightning-mole_REF.gc | 2 +- .../jak1/levels/snow/snow-bunny_REF.gc | 2 +- .../jak1/levels/snow/snow-flutflut-obs_REF.gc | 2 +- .../jak1/levels/snow/snow-ram-boss_REF.gc | 8 +- .../reference/jak1/levels/sunken/bully_REF.gc | 4 +- .../jak1/levels/sunken/helix-water_REF.gc | 2 +- .../jak1/levels/sunken/orbit-plat_REF.gc | 2 +- .../jak1/levels/sunken/puffer_REF.gc | 8 +- .../jak1/levels/sunken/qbert-plat_REF.gc | 2 +- .../jak1/levels/sunken/sunken-pipegame_REF.gc | 2 +- .../jak1/levels/sunken/target-tube_REF.gc | 4 +- .../jak1/levels/village1/village-obs_REF.gc | 2 +- .../levels/village_common/villagep-obs_REF.gc | 4 +- .../reference/jak2/engine/anim/aligner_REF.gc | 8 +- .../jak2/engine/anim/joint-mod_REF.gc | 18 +-- .../reference/jak2/engine/anim/joint_REF.gc | 4 +- .../jak2/engine/camera/cam-combiner_REF.gc | 2 +- .../jak2/engine/camera/cam-layout_REF.gc | 8 +- .../jak2/engine/camera/cam-states-dbg_REF.gc | 4 +- .../jak2/engine/camera/cam-states_REF.gc | 30 ++--- .../jak2/engine/camera/camera_REF.gc | 2 +- .../jak2/engine/debug/editable-player_REF.gc | 2 +- .../jak2/engine/debug/editable_REF.gc | 4 +- .../reference/jak2/engine/debug/menu_REF.gc | 2 +- .../engine/debug/nav/mysql-nav-graph_REF.gc | 8 +- .../jak2/engine/draw/drawable-tree_REF.gc | 2 +- .../jak2/engine/entity/entity_REF.gc | 26 ++-- .../jak2/engine/game/game-info_REF.gc | 2 +- .../jak2/engine/game/settings_REF.gc | 4 +- .../jak2/engine/game/task/task-control_REF.gc | 24 ++-- .../jak2/engine/geometry/path_REF.gc | 6 +- .../particles/sparticle-launcher_REF.gc | 6 +- .../gfx/sprite/particles/sparticle_REF.gc | 2 +- .../reference/jak2/engine/load/loader_REF.gc | 2 +- .../reference/jak2/engine/math/math_REF.gc | 2 +- .../reference/jak2/engine/ps2/pad_REF.gc | 2 +- .../reference/jak2/engine/ps2/timer_REF.gc | 2 +- .../jak2/engine/target/board/board-h_REF.gc | 10 +- .../engine/target/board/board-states_REF.gc | 22 ++-- .../engine/target/board/board-util_REF.gc | 8 +- .../engine/target/board/target-board_REF.gc | 17 +-- .../jak2/engine/target/gun/gun-h_REF.gc | 12 +- .../jak2/engine/target/logic-target_REF.gc | 26 ++-- .../jak2/engine/target/target_REF.gc | 49 ++++--- .../reference/jak2/kernel/gcommon_REF.gc | 6 +- .../reference/jak2/kernel/gkernel_REF.gc | 4 +- test/decompiler/test_FormExpressionBuild.cpp | 2 +- .../test_FormExpressionBuildLong.cpp | 2 +- 120 files changed, 510 insertions(+), 541 deletions(-) diff --git a/decompiler/IR2/FormExpressionAnalysis.cpp b/decompiler/IR2/FormExpressionAnalysis.cpp index f437ca6240..d57b651fb9 100644 --- a/decompiler/IR2/FormExpressionAnalysis.cpp +++ b/decompiler/IR2/FormExpressionAnalysis.cpp @@ -4431,66 +4431,6 @@ FormElement* try_make_nonzero_logtest(Form* in, FormPool& pool) { } return nullptr; } -} // namespace - -FormElement* ConditionElement::make_zero_check_generic(const Env& env, - FormPool& pool, - const std::vector