-
Notifications
You must be signed in to change notification settings - Fork 0
/
llvmdriver.h
143 lines (137 loc) · 6.63 KB
/
llvmdriver.h
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
//===============================================================
// Объявление процедур, для компиляции с помощью LLVM
//===============================================================
#ifndef LLVMDRIVER_H
#define LLVMDRIVER_H
#include "llvm/ADT/APFloat.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/LegacyPassManager.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/Verifier.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Host.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/TargetRegistry.h"
#include "llvm/Support/TargetSelect.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetOptions.h"
#include "Type.h"
#include "Var.h"
#include "Stat.h"
#include <float.h>
using namespace llvm;
using namespace llvm::sys;
class LLVMDriver
{
public:
//генерация кода LLVM и запись в файл
int Init(CModule *m);
LLVMDriver(): Builder(TheContext){};
~LLVMDriver();
private:
LLVMContext TheContext;
IRBuilder<> Builder;
std::unique_ptr<Module> TheModule;
//Карта внутренних констант, переменных и аргументов функции
std::map<std::string, AllocaInst *> NamedValues;
//Карта глобальных констант и переменных
std::map<std::string, GlobalVariable *> GlobalValues;
//Карта функций
std::map<std::string, Function *> Functions;
//Карта связи имени элемента структуры с его порядковым номером
//для обращения к нему в IR LLVM
std::map<std::string, std::map<std::string,int>> Structures;
//Карта номеров специализаций, для формирования функций выбора
std::map<std::string, int> SpecTypes;
//Карта блоков, используется для выхода из бесконечного цикла
std::map<int, BasicBlock *> BasicBlocks;
//указание что загружать при загрузки значения указателя
enum load{value,pointer,pointerToPointer};
//Создание инструкции выделения памяти в начальном блоке функции. Используется для переменных и тд
AllocaInst *CreateEntryBlockAlloca(Function *TheFunction, std::string name,Type* type);
//Функция приведения типов
Value *CastToType(Value* v, Type* destType);
//загрузка значения указателя
Value *loadValue(Value* v,load i);
//Создание функции без аргументов
Function* createFunction(Type* retType,std::string name);
//Создание функции с аргументами
Function* createFunction(Type* retType,std::vector<Type*> typePars,StringVector namePars,std::string name);
//Функции получения типа LLVM
Type* GetLLVMType(EName_id name_id);
Type* GetLLVMType(CBaseVar* v);
Type* GetLLVMType(CBaseType* v);
//Поиск (если нет, создание) функции
Function* GetFunction(CProcedure* p);
//создание функции выбора специализированных функций
void CreateCommonFun(CCommonProc* p,Function* F);
void CreateCommonFun_loop(CCommonProc *p, Function *F,CBaseVarVector::const_iterator i,std::string funName,std::vector<Value*> values,std::vector<Type *> pars);
//генерация кода LLVM модуля
Value* WriteLLVM(CModule *m);
Value* WriteLLVM_var(CDeclSeq* ds);
Value* WriteLLVM_proc(CDeclSeq* ds);
Value* WriteLLVM(CStatementSeq* ss);
//генерация кода LLVM переменных
Value* WriteLLVM(CBaseVar* v);
Constant* WriteLLVM_ConstValue(CBaseVar* v);
//генерация кода LLVM процедуры
Function* WriteLLVM(CProcedure* p);
//получение списка типов формальных параметров
std::vector<Type *> WriteLLVM_pars(CFormalPars *fp);
void WriteLLVM_pars_array(CArrayVar* v,std::vector<Type*>& values);
//генерация кода LLVM операторов
Value* WriteLLVM(CIfStatement* s);
BasicBlock* WriteLLVM(CElsifPair* s,BasicBlock* bb);
Value* WriteLLVM(CCaseStatement* s);
Value* WriteLLVM(CCaseLabelsSeq* cls, CExpr* e,BasicBlock* exitBB);
Value* WriteLLVM(CCaseLabels* cls, CExpr* e);
Value* WriteLLVM(CWhileStatement* s);
Value* WriteLLVM(CRepeatStatement* s);
Value* WriteLLVM(CForStatement* s);
Value* WriteLLVM(CLoopStatement* s);
Value* WriteLLVM(CWithStatement* s){}; //не реализовано
Value* WriteLLVM(CExitStatement* s);
Value* WriteLLVM(CReturnStatement* s);
Value* WriteLLVM(CAssignStatement* s);
Value* WriteLLVM_array(CAssignStatement* s);
Value* WriteLLVM_COPY_Par(CBaseName* bn);
Value* WriteLLVM(CCallStatement* s); //частично реализовано
//получение списка фактических параметров
std::vector<Value *> WriteLLVM(CExprList* e,CFormalPars* fp);
//генерация кода LLVM выражений
Value* WriteLLVM(CExpr* e); //не реализовано rel_is,rel_IN
Value* WriteLLVM(CSimpleExpr* e);
Value* WriteLLVM(CTerm* t);
Value* WriteLLVM(CTermPair* t);
Value* WriteLLVM(CFactor* f);
Value* WriteLLVM(CDesignator* d);
Value* WriteLLVM_index(CExprList* e, Value* array);
Value* WriteLLVM_record_index(Value* record,char *ident,CDesignator *d);
//генерация кода LLVM стандартных процедур
Value* WriteLLVM(CAbsStdProcFunc* d);
Value* WriteLLVM(CAshStdProcFunc* d);
Value* WriteLLVM(CCapStdProcFunc* d);
Value* WriteLLVM(CChrStdProcFunc* d);
Value* WriteLLVM(CEntierStdProcFunc* d);
Value* WriteLLVM(CLenStdProcFunc* d);
Value* WriteLLVM(CLongStdProcFunc* d);
Value* WriteLLVM(CMaxStdProcFunc* d);
Value* WriteLLVM(CMinStdProcFunc* d);
Value* WriteLLVM(COddStdProcFunc* d);
Value* WriteLLVM(COrdStdProcFunc* d);
Value* WriteLLVM(CShortStdProcFunc* d);
Value* WriteLLVM(CSizeStdProcFunc* d);
Value* WriteLLVM(CDecStdProc* d);
Value* WriteLLVM(CIncStdProc* d);
Value* WriteLLVM(CNewStdProc* d);
Value* WriteLLVM(CAssertStdProc* d);
Value* WriteLLVM(CHaltStdProc* d);
Value* WriteLLVM(CCopyStdProc* d);
};
#endif // LLVMDRIVER_H