-
Notifications
You must be signed in to change notification settings - Fork 0
/
ManageIR.hpp
86 lines (82 loc) · 3.68 KB
/
ManageIR.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#pragma once
#include <string>
#include <vector>
#include <map>
#include <iostream>
#include <bits/stdc++.h>
#include "SymbolsTable.hpp"
#include "bp.hpp"
#include "output.hpp"
using namespace std;
struct Reg {
int num;
string name;
Reg(int num, string name);
};
class ManageIR {
vector<Reg> regs;
map<string, int> str_map;
CodeBuffer& cbr = CodeBuffer::instance();
bool last_bpatch = true;
public:
Reg new_temp();
void def_func(const string& id, const string& ret_type, vector<string>& arg_types);
void end_func(const string& ret_type, Node* s);
void assign_reg(const string& type, long value, Node* pNode);
void store_local_var(int offset, const string& ltype, Node* left_pNode, const string& rtype, Node* exp);
void load_local_var(int offset, const string &type, Node *pNode);
void push_string_to_emitGlobal(const string &id);
void getelement_string(const string &id, const string ®_name);
void emit_print_functions();
int call_func(const string& id, const string& ret_type, stack<Node*> &args,
unordered_map<string, FuncTypes>& hash_funcs, Node* exp_list = nullptr);
string to_llvm_type(const string& type);
string str2name(const string& str1);
void binop(const string &op, Node* exp1, Node* exp2,
Node* p_res_node);
void zext_if_needed(Node* exp1, Node* exp2, const string &op_type);
Reg getelement_from_stack(int offset);
void bpatch_if_else_statement(Node* s,
Node* n,
BiNode* p_binode,
const string &true_label,
const string &false_label,
Node* s1,
Node* s2);
void bpatch_if_statement(Node* s,
BiNode* p_binode,
const string &true_label,
Node* s1);
void bpatch_while(Node* s,
const string &m1_label,
BiNode* b,
const string &m2_label,
Node* s1,
vector<pair<int,BranchLabelIndex>>& brk_list,
vector<pair<int,BranchLabelIndex>>& cont_list,
Node* n);
void relop(BiNode* p_binode,
const string& op,
Node* exp1,
Node* exp2);
void gen_label_and_goto_it(Node* s);
void return_exp(Node* exp, const string& ty, const string& ret_ty);
void icmp_bool_var(BiNode* p_binode, Node* exp);
int get_bool_into_reg(BiNode* p_binode, Node* exp_list = nullptr);
void emit_switch(Node* s, Node* exp, Node* n, Node* given_cl, Node* given_m,
vector<pair<int,BranchLabelIndex>>& brk_list);
void goto_next_of_s(Node* s);
void dbg_list(Node* n);
void goto_specific_list(vector<pair<int, BranchLabelIndex>>& next_list);
void cl_c_cl_rule(CL* , Node* , CL*);
void cl_c_rule(CL* , Node*);
int get_called_bool_exp(Node* exp, Node* exp_list = nullptr);
void explist_exp(Node* exp, stack<Node*>& called_exps,
stack<string>& called_arg_types, Node* exp_list);
void explist_exp_explist(Node* first_exp_list, Node* exp, Node* n, const string& m_label, Node* exp_list,
stack<Node *> &called_exps,
stack<string> &called_arg_types);
vector<Node*> cast_bytes_to_ints(const string &id, stack<Node*> &args, vector<string>& exp_func_args);
void check_zero_div(Node* exp2);
void handle_stupid_call(Node* call, Node* s);
};