12 #include "llvm/ADT/APInt.h"
13 #include "llvm/IR/Verifier.h"
14 #include "llvm/ExecutionEngine/ExecutionEngine.h"
15 #include "llvm/ExecutionEngine/GenericValue.h"
16 #include "llvm/ExecutionEngine/MCJIT.h"
17 #include "llvm/IR/Argument.h"
18 #include "llvm/IR/BasicBlock.h"
19 #include "llvm/IR/Constants.h"
20 #include "llvm/IR/DerivedTypes.h"
21 #include "llvm/IR/Function.h"
22 #include "llvm/IR/InstrTypes.h"
23 #include "llvm/IR/Instructions.h"
24 #include "llvm/IR/LLVMContext.h"
25 #include "llvm/IR/Module.h"
26 #include "llvm/IR/Type.h"
27 #include "llvm/IR/IRBuilder.h"
28 #include "llvm/Support/Casting.h"
29 #include "llvm/Support/TargetSelect.h"
30 #include "llvm/Support/raw_ostream.h"
31 #include "llvm/Bitcode/BitcodeWriter.h"
32 #include "llvm/Support/raw_os_ostream.h"
43 E operator()()
const {
return E(); }
53 template<
typename E,
typename DF = safe_default<E>>
58 safe_ptr(std::nullptr_t) : p_(
nullptr) {}
59 template<
typename E2,
typename DF2, std::enable_if_t<std::is_convertible_v<E2*,E*>,
bool> = true>
62 operator E* ()
const {
return p_; }
63 operator bool()
const {
return !!p_; }
64 E& operator*()
const {
return p_ ? *p_ : dummy(); }
65 E* operator->()
const {
return p_ ? p_ : &dummy(); }
66 friend bool operator==(
const safe_ptr& a,
const safe_ptr& b) {
return a.p_ == b.p_; }
67 friend bool operator!=(
const safe_ptr& a,
const safe_ptr& b) {
return a.p_ != b.p_; }
70 static E& dummy() {
static decltype(DF()()) d = DF()();
return d; }
71 template<
typename E2,
typename DF2>
110 inline std::size_t CKHashValue(
const CKIRAPInt& Arg)
112 return llvm::hash_value(Arg);
115 inline CKIRTypeObs CKGetVoidType(CKIRContextRef Context)
117 return llvm::Type::getVoidTy(Context);
120 inline CKIRTypeObs CKGetInt1Type(CKIRContextRef Context)
122 return llvm::Type::getInt1Ty(Context);
125 inline CKIRTypeObs CKGetInt8Type(CKIRContextRef Context)
127 return llvm::Type::getInt8Ty(Context);
130 inline CKIRTypeObs CKGetInt32Type(CKIRContextRef Context)
132 return llvm::Type::getInt32Ty(Context);
135 inline CKIRTypeObs CKGetInt8PtrType(CKIRContextRef Context)
137 return llvm::Type::getInt8PtrTy(Context);
142 CKIRTypeObs CKGetArrayType(CKIRTypeObs element, CKIRConstantIntObs size);
144 inline CKIRStructTypeObs CKCreateStructType(CKIRContextRef Context,
const std::string& name)
146 return llvm::StructType::create(Context, name);
149 inline CKIRFunctionTypeObs CKGetFunctionType(CKIRTypeObs rettype, CKIRTypeObsArrayRef argtypes,
bool variadic =
false)
151 return llvm::FunctionType::get(rettype, argtypes, variadic);
156 return llvm::ConstantInt::get(llvm::Type::getInt1Ty(Context), V);
159 inline CKIRConstantIntObs CKGetInt8Constant(CKIRContextRef Context, std::int_fast8_t V)
161 return llvm::ConstantInt::get(llvm::Type::getInt8Ty(Context), V);
164 inline CKIRConstantIntObs CKGetInt32Constant(CKIRContextRef Context, std::int_fast32_t V)
166 return llvm::ConstantInt::get(llvm::Type::getInt32Ty(Context), V);
169 inline CKIRFunctionObs CKCreateFunction(CKIRFunctionTypeObs FT,
const std::string& name, CKIRModuleObs M)
171 return llvm::Function::Create(FT, llvm::Function::ExternalLinkage, name, M);
175 inline CKIRBasicBlockObs CKCreateBasicBlock(
const std::string& name, CKIRFunctionObs F)
179 return llvm::BasicBlock::Create(F->getContext(), name, F);
188 if (!llvm::isa< llvm::ConstantInt>(v))
190 return llvm::cast<llvm::ConstantInt>(v);
196 return llvm::Constant::getNullValue(t);
200 CKIRConstantObs CKCreateGlobalVariable(CKIRTypeObs irtp,
const std::string& name, CKIRModuleObs M);
202 CKIRConstantObs CKCreateExternVariable(CKIRTypeObs irtp,
const std::string& name, CKIRModuleObs M);
204 using CKIRDataLayoutObs =
const llvm::DataLayout*;
206 inline std::int_fast64_t CKGetTypeSize(CKIRDataLayoutObs DataLayout, CKIRTypeObs Ty)
208 auto ts = DataLayout->getTypeAllocSize(Ty);
212 class CKIREnvironment {
216 void dump_module(std::ostream& os, CKIRModuleObs module)
const;
218 std::error_code write_bitcode_module(
const std::string& fname, CKIRModuleObs module)
const;
220 int run_main(CKIRFunctionObs fnc,
int argc,
char** argv, std::ostream& os);
224 return *ckircontextptr_;
229 return ckirmoduleobs_;
232 CKIRDataLayoutObs data_layout()
const
234 return &*ckirdatalayoutptr_;
238 std::unique_ptr< llvm::LLVMContext> ckircontextptr_;
239 std::unique_ptr< llvm::Module> ckirmoduleptr_;
241 std::unique_ptr< llvm::DataLayout> ckirdatalayoutptr_;
244 using CKIREnvironmentObs = CKIREnvironment*;
llvm::BasicBlock * CKIRBasicBlockObs
Definition: ckir.hpp:97
std::vector< llvm::Value * > CKIRValueObsArray
Definition: ckir.hpp:87
llvm::Type * CKIRTypeObs
Definition: ckir.hpp:80
llvm::ConstantInt * CKIRConstantIntObs
Definition: ckir.hpp:91
llvm::IRBuilder<> CKIRBuilder
Definition: ckir.hpp:101
llvm::ArrayRef< llvm::Type * > CKIRTypeObsArrayRef
Definition: ckir.hpp:84
llvm::AllocaInst * CKIRAllocaInstObs
Definition: ckir.hpp:99
llvm::Module * CKIRModuleObs
Definition: ckir.hpp:93
llvm::Twine CKIRName
Definition: ckir.hpp:106
llvm::LLVMContext & CKIRContextRef
Definition: ckir.hpp:78
llvm::Function * CKIRFunctionObs
Definition: ckir.hpp:95
CKIRConstantObs CKIRNullValue(CKIRTypeObs t)
Get null value for a llvm::Type.
Definition: ckir.hpp:194
llvm::Constant * CKIRConstantObs
Definition: ckir.hpp:90
llvm::FunctionType * CKIRFunctionTypeObs
Definition: ckir.hpp:82
std::vector< llvm::Type * > CKIRTypeObsArray
Definition: ckir.hpp:83
llvm::APInt CKIRAPInt
Definition: ckir.hpp:76
CKIRConstantIntObs CKTryGetConstantInt(CKIRValueObs v)
Get integral constant from a llvm::Value.
Definition: ckir.hpp:184
CKIRBuilder * CKIRBuilderObs
Definition: ckir.hpp:103
llvm::ArrayRef< llvm::Value * > CKIRValueObsArrayRef
Definition: ckir.hpp:88
llvm::StructType * CKIRStructTypeObs
Definition: ckir.hpp:81
llvm::Value * CKIRValueObs
Definition: ckir.hpp:86
CKIRBuilder & CKIRBuilderRef
Definition: ckir.hpp:102
Safe pointer to E.
Definition: ckir.hpp:55