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