V-Gears 0
Free Final Fantasy VII engine.
CodeGenerator.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2022 The V-Gears Team
3 *
4 * This file is part of V-Gears
5 *
6 * V-Gears is free software: you can redistribute it and/or modify it under
7 * terms of the GNU General Public License as published by the Free Software
8 * Foundation, version 3.0 (GPLv3) of the License.
9 *
10 * V-Gears is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 */
15
16#pragma once
17
18#include <ostream>
19#include <utility>
20#include <memory>
21#include <boost/intrusive_ptr.hpp>
22
23#include "DecompilerException.h"
24#include "Graph.h"
25#include "LuaLanguage.h"
26#include "Value.h"
27
28
29class Engine;
30
31class Function;
32
33const int INDENT_SPACES = 4;
34
39
44
49};
50
51
52
59
60 public:
61
71 Engine *engine, std::ostream &output, ARGUMENT_ORDER bin_order, ARGUMENT_ORDER call_order
72 );
73
79 virtual ~CodeGenerator();
80
85
96 std::string function_name, std::string param_format, const std::vector<ValuePtr>& params
97 );
98
105 virtual void Generate(InstVec& insts, const Graph &graph);
106
116 virtual void AddOutputLine(
117 std::string line, bool unindent_before = false, bool indent_after = false
118 );
119
126 void WriteTodo(std::string class_name, std::string instruction);
127
134 void WriteAssignment(ValuePtr dst, ValuePtr src);
135
141 void AddArg(ValuePtr arg);
142
152 virtual void ProcessSpecialMetadata(const InstPtr inst, char c, int pos);
153
159 virtual ValueList GetArgList();
160
167
168 protected:
169
180 void ProcessInst(Function& function, InstVec& insts, const InstPtr inst);
181
192 void ProcessUncondJumpInst(Function& function, InstVec& insts, const InstPtr inst);
193
202 void ProcessCondJumpInst(const InstPtr inst);
203
210 std::string IndentString(std::string s);
211
219 virtual std::string ConstructFuncSignature(const Function& function);
220
229 virtual void OnBeforeStartFunction(const Function& function);
230
239 virtual void OnEndFunction(const Function& function);
240
249 virtual void OnStartFunction(const Function& function);
250
256 virtual bool OutputOnlyRequiredLabels() const;
257
265 void GeneratePass(InstVec& insts, const Graph& graph);
266
270 bool is_label_pass_ = true;
271
276
281
285 std::ostream &output_;
286
291
296
301
305 std::unique_ptr<LuaLanguage> target_lang_;
306
307 private:
308
316 void Process(Function& function, InstVec& insts, GraphVertex vertex);
317
322
327
332
337
338};
ARGUMENT_ORDER
Different argument/operand orderings.
Definition: CodeGenerator.h:38
@ LIFO_ARGUMENT_ORDER
First argument is pushed to stack last.
Definition: CodeGenerator.h:48
@ FIFO_ARGUMENT_ORDER
First argument is pushed to stack first.
Definition: CodeGenerator.h:43
const int INDENT_SPACES
How many spaces to use for each indent.
Definition: CodeGenerator.h:33
boost::intrusive_ptr< Group > GroupPtr
Definition: Graph.h:76
Graph::vertex_descriptor GraphVertex
Definition: Graph.h:171
boost::adjacency_list< boost::setS, boost::listS, boost::bidirectionalS, GraphProperty, EdgeProperty > Graph
Definition: Graph.h:169
boost::intrusive_ptr< Instruction > InstPtr
Pointer to an Instruction.
Definition: Instruction.h:43
std::vector< InstPtr > InstVec
Type representing a vector of InstPtrs.
Definition: Instruction.h:382
std::deque< ValuePtr > ValueList
Type representing a list of values, e.g.
Definition: Value.h:98
boost::intrusive_ptr< Value > ValuePtr
Pointer to a Value.
Definition: Value.h:93
Base class for code generators.
Definition: CodeGenerator.h:58
bool is_label_pass_
Indicates if a label is being processed.
Definition: CodeGenerator.h:270
virtual void OnEndFunction(const Function &function)
Adds lines to the script at the end a function.
Definition: CodeGenerator.cpp:250
CodeGenerator(Engine *engine, std::ostream &output, ARGUMENT_ORDER bin_order, ARGUMENT_ORDER call_order)
Constructor.
Definition: CodeGenerator.cpp:28
std::ostream & output_
The stream to output the code to.
Definition: CodeGenerator.h:285
void Process(Function &function, InstVec &insts, GraphVertex vertex)
Processes a GraphVertex.
Definition: CodeGenerator.cpp:325
virtual void AddOutputLine(std::string line, bool unindent_before=false, bool indent_after=false)
Adds a line of code to the current group.
Definition: CodeGenerator.cpp:85
void GeneratePass(InstVec &insts, const Graph &graph)
Generates a pass.
Definition: CodeGenerator.cpp:258
std::unique_ptr< LuaLanguage > target_lang_
The target language.
Definition: CodeGenerator.h:305
virtual void OnStartFunction(const Function &function)
Adds lines to the script before a function instructions.
Definition: CodeGenerator.cpp:252
void AddArg(ValuePtr arg)
Add an argument to the argument list.
Definition: CodeGenerator.cpp:101
Graph graph_
The annotated graph of the script.
Definition: CodeGenerator.h:321
ValueStack stack_
The stack currently being processed.
Definition: CodeGenerator.h:290
GraphVertex cur_vertex_
Graph vertex currently being processed.
Definition: CodeGenerator.h:300
virtual void ProcessSpecialMetadata(const InstPtr inst, char c, int pos)
Process a single character of metadata.
Definition: CodeGenerator.cpp:106
void WriteTodo(std::string class_name, std::string instruction)
Writes a comment line indicating an unimplemented opcode.
Definition: CodeGenerator.cpp:91
virtual ARGUMENT_ORDER GetBinaryOrder()
Retrieves the order of operands for binary operations.
Definition: CodeGenerator.cpp:117
std::string IndentString(std::string s)
Indents a string according to the current indentation level.
Definition: CodeGenerator.cpp:240
Engine * engine_
The engine used for teh script.
Definition: CodeGenerator.h:280
uint indent_level_
Current indentation level.
Definition: CodeGenerator.h:295
void WriteAssignment(ValuePtr dst, ValuePtr src)
Generate an assignment statement.
Definition: CodeGenerator.cpp:95
void WriteFunctionCall(std::string function_name, std::string param_format, const std::vector< ValuePtr > &params)
Writes a function call.
Definition: CodeGenerator.cpp:44
const ARGUMENT_ORDER bin_order_
Order of operands for binary operations.
Definition: CodeGenerator.h:326
virtual void OnBeforeStartFunction(const Function &function)
Adds lines to the script before a function.
Definition: CodeGenerator.cpp:248
virtual void Generate(InstVec &insts, const Graph &graph)
Generates code from the provided graph and outputs it to stdout.
Definition: CodeGenerator.cpp:74
GroupPtr cur_group_
The group currently being processed.
Definition: CodeGenerator.h:275
virtual std::string ConstructFuncSignature(const Function &function)
Construct the signature for a function.
Definition: CodeGenerator.cpp:246
void ProcessCondJumpInst(const InstPtr inst)
Processes a conditional jump instruction.
Definition: CodeGenerator.cpp:197
const ARGUMENT_ORDER call_order_
Order of operands for call arguments.
Definition: CodeGenerator.h:331
void ProcessInst(Function &function, InstVec &insts, const InstPtr inst)
Processes an instruction.
Definition: CodeGenerator.cpp:119
virtual ValueList GetArgList()
Retrieves the argument list.
Definition: CodeGenerator.cpp:115
void ProcessUncondJumpInst(Function &function, InstVec &insts, const InstPtr inst)
Processes an unconditional jump instruction.
Definition: CodeGenerator.cpp:125
virtual ~CodeGenerator()
Destructor.
Definition: CodeGenerator.cpp:37
virtual bool OutputOnlyRequiredLabels() const
Checks if only required labels are to be written.
Definition: CodeGenerator.cpp:254
LuaLanguage & GetLanguage()
Retrieves the target language.
Definition: CodeGenerator.cpp:39
ValueList arg_list_
Lists of arguments to be built when processing function calls.
Definition: CodeGenerator.h:336
Base class for engines.
Definition: Engine.h:34
Provides formatters and keywords for the LUA language.
Definition: LuaLanguage.h:23
unsigned int uint
Definition: scummsys.h:437
Structure representing a function.
Definition: Function.h:26