sammine-lang
Loading...
Searching...
No Matches
LLVMRes.h
Go to the documentation of this file.
1#pragma once
2
4#include "iostream"
5#include "util/Utilities.h"
6#include "llvm/ADT/APFloat.h"
7#include "llvm/ADT/STLExtras.h"
8#include "llvm/Analysis/CGSCCPassManager.h"
9#include "llvm/Analysis/LoopAnalysisManager.h"
10#include "llvm/IR/BasicBlock.h"
11#include "llvm/IR/Constants.h"
12#include "llvm/IR/DerivedTypes.h"
13#include "llvm/IR/Function.h"
14#include "llvm/IR/IRBuilder.h"
15#include "llvm/IR/Instructions.h"
16#include "llvm/IR/LLVMContext.h"
17#include "llvm/IR/LegacyPassManager.h"
18#include "llvm/IR/Module.h"
19#include "llvm/IR/Type.h"
20#include "llvm/IR/Verifier.h"
21#include "llvm/MC/TargetRegistry.h"
22#include "llvm/Passes/PassBuilder.h"
23#include "llvm/Passes/StandardInstrumentations.h"
24#include "llvm/Support/CodeGen.h"
25#include "llvm/Support/FileSystem.h"
26#include "llvm/Support/TargetSelect.h"
27#include "llvm/Support/raw_ostream.h"
28#include "llvm/Target/TargetMachine.h"
29#include "llvm/Target/TargetOptions.h"
30#include "llvm/TargetParser/Host.h"
31#include "llvm/Transforms/Scalar/GVN.h"
32#include "llvm/Transforms/Scalar/Reassociate.h"
33#include <map>
38namespace sammine_lang {
39class LLVMRes {
40public:
41 llvm::ExitOnError ExitOnErr;
42 std::unique_ptr<llvm::LLVMContext> Context;
43 std::unique_ptr<llvm::IRBuilder<>> Builder;
44 std::unique_ptr<llvm::Module> Module;
45
46 std::unique_ptr<llvm::FunctionPassManager> FnPass;
47 std::unique_ptr<llvm::LoopAnalysisManager> LpAnalysis;
48 std::unique_ptr<llvm::FunctionAnalysisManager> FnAnalysis;
49 std::unique_ptr<llvm::CGSCCAnalysisManager> CgAnalysis;
50 std::unique_ptr<llvm::ModuleAnalysisManager> ModuleAnalysis;
51 std::unique_ptr<llvm::PassInstrumentationCallbacks> PassCallbacks;
52 std::unique_ptr<llvm::StandardInstrumentations> StdIns;
53 std::unique_ptr<SammineJIT> sammineJIT;
54
55 llvm::PassBuilder PB;
56 std::unique_ptr<llvm::TargetMachine> target_machine;
57 llvm::legacy::PassManager pass;
58 std::error_code EC;
59 LLVMRes() {
60 llvm::InitializeAllTargetInfos();
61 llvm::InitializeAllTargets();
62 llvm::InitializeAllTargetMCs();
63 llvm::InitializeNativeTargetAsmParser();
64 llvm::InitializeNativeTargetAsmPrinter();
65
66 sammineJIT = ExitOnErr(SammineJIT::Create());
67 InitializeModuleAndManagers();
68 }
69 void InitializeModuleAndManagers() {
70 InitializeEssentials();
71
72 // InitializeManagers();
73 //
74 // InitializeInstrs();
75
76 // Add transform passes.
77 // Do simple "peephole" optimizations and bit-twiddling optzns.
78 // FnPass->addPass(llvm::InstCombinePass());
79 // // Reassociate expressions.
80 // FnPass->addPass(llvm::ReassociatePass());
81 // // Eliminate Common SubExpressions.
82 // FnPass->addPass(llvm::GVNPass());
83 // // Simplify the control flow graph (deleting unreachable blocks, etc).
84 // FnPass->addPass(llvm::SimplifyCFGPass());
85
86 // InitializePassBuilder();
87 }
88 void InitializeEssentials() {
89 // Open a new context and module.
90
91 Context = std::make_unique<llvm::LLVMContext>();
92 assert(Context);
93
94 Module = std::make_unique<llvm::Module>("KaleidoscopeJIT", *Context);
95 assert(Module);
96 auto TargetTriple = LLVMGetDefaultTargetTriple();
97 std::string Error;
98 auto Target = llvm::TargetRegistry::lookupTarget(TargetTriple, Error);
99
100 auto CPU = "generic";
101 auto Features = "";
102 llvm::TargetOptions opt;
103 target_machine =
104 std::unique_ptr<llvm::TargetMachine>(Target->createTargetMachine(
105 TargetTriple, CPU, Features, opt, llvm::Reloc::PIC_));
106
107 // Create a new builder for the module.
108 Builder = std::make_unique<llvm::IRBuilder<>>(*Context);
109 assert(Builder);
110
111 Module->setDataLayout(target_machine->createDataLayout());
112 }
113 void InitializeManagers() {
114 // Create new pass and analysis managers.
115 FnPass = std::make_unique<llvm::FunctionPassManager>();
116 LpAnalysis = std::make_unique<llvm::LoopAnalysisManager>();
117 FnAnalysis = std::make_unique<llvm::FunctionAnalysisManager>();
118 CgAnalysis = std::make_unique<llvm::CGSCCAnalysisManager>();
119 ModuleAnalysis = std::make_unique<llvm::ModuleAnalysisManager>();
120 }
121
122 void InitializeInstrs() {
123 PassCallbacks = std::make_unique<llvm::PassInstrumentationCallbacks>();
124
125 StdIns =
126 std::make_unique<llvm::StandardInstrumentations>(*Context,
127 /*DebugLogging*/ true);
128 StdIns->registerCallbacks(*PassCallbacks, ModuleAnalysis.get());
129 }
130 void InitializePassBuilder() {
131 // Register analysis passes used in these transform passes.
132 PB.registerModuleAnalyses(*ModuleAnalysis);
133 PB.registerFunctionAnalyses(*FnAnalysis);
134 PB.crossRegisterProxies(*LpAnalysis, *FnAnalysis, *CgAnalysis,
135 *ModuleAnalysis);
136 }
137};
138} // namespace sammine_lang
JIT Compiler based on Kaleidoscope.
Holds classes and functionalities for dealing with Error handling, source locations caching & indexin...