Seregon/ShadPKG

A tool for deriving PKG packet encryption keys for ps4 written in c++

C++/47.3 KB/No license
core/decompiler/codegen/CppEmitter.h
ShadPKG / core / decompiler / codegen / CppEmitter.h
1#pragma once
2 
3#include "../ir/AST.h"
4#include <set>
5#include <sstream>
6#include <string>
7 
8namespace ShadPKG::Decompiler::Codegen {
9 
10// ╔═══════════════════════════════════════════════════════════════════════════╗
11// ║ CPP EMITTER ║
12// ║ ║
13// ║ AST Visitor that generates formatted C++ code strings. ║
14// ║ Handles indentation, comments, and syntax structure. ║
15// ╚═══════════════════════════════════════════════════════════════════════════╝
16 
17class CppEmitter : public AST::ASTVisitor {
18public:
19 CppEmitter() = default;
20 
21 enum class TokenType {
22 Text,
23 Keyword,
24 Identifier,
25 Function,
26 Global,
27 Number,
28 String,
29 Comment,
30 Type
31 };
32 
33 struct Token {
34 std::string text;
35 TokenType type;
36 uint64_t relatedAddress = 0; // if clickable
37 };
38 
39 // Generate code for a complete function
40 std::string generate(const std::shared_ptr<AST::FunctionAST> &func);
41 
42 const std::vector<Token> &getTokens() const { return tokens_; }
43 
44 // Visitor Methods
45 void visit(AST::ConstantExpr *node) override;
46 void visit(AST::VariableExpr *node) override;
47 void visit(AST::BinaryExpr *node) override;
48 void visit(AST::UnaryExpr *node) override;
49 void visit(AST::CallExpr *node) override;
50 void visit(AST::MemoryExpr *node) override;
51 void visit(AST::MemberAccessExpr *node) override;
52 void visit(AST::CastExpr *node) override;
53 
54 void visit(AST::CompoundStatement *node) override;
55 void visit(AST::ExpressionStatement *node) override;
56 void visit(AST::IfStatement *node) override;
57 void visit(AST::WhileStatement *node) override;
58 void visit(AST::DoWhileStatement *node) override;
59 void visit(AST::ForStatement *node) override;
60 void visit(AST::ReturnStatement *node) override;
61 void visit(AST::BreakStatement *node) override;
62 void visit(AST::ContinueStatement *node) override;
63 void visit(AST::GotoStatement *node) override;
64 void visit(AST::LabelStatement *node) override;
65 void visit(AST::CaseStmt *node) override;
66 void visit(AST::SwitchStmt *node) override;
67 
68private:
69 std::stringstream ss_; // Legacy/Build string
70 std::vector<Token> tokens_;
71 int indentLevel_ = 0;
72 std::shared_ptr<AST::FunctionAST> currentFunc_;
73 std::set<std::string> usedRegs_; // Track reg_ variables to declare
74 std::set<std::string> emittedLabels_; // Track labels that have been emitted
75 std::vector<std::pair<std::string, size_t>> pendingGotos_; // Gotos to validate
76 
77 void indent();
78 void emit(const std::string &str, TokenType type = TokenType::Text,
79 uint64_t addr = 0);
80 void emitLine(const std::string &str = "", TokenType type = TokenType::Text);
81 void collectUsedRegs(const std::shared_ptr<AST::Statement> &stmt);
82 void collectUsedRegsExpr(const std::shared_ptr<AST::Expression> &expr);
83 
84 std::string inferTypeFromInstruction(uint64_t address);
85};
86 
87} // namespace ShadPKG::Decompiler::Codegen
88