6 #ifndef JLM_LLVM_BACKEND_IPGRAPHTOLLVMCONVERTER_HPP
7 #define JLM_LLVM_BACKEND_IPGRAPHTOLLVMCONVERTER_HPP
12 #include <llvm/IR/Attributes.h>
13 #include <llvm/IR/InstrTypes.h>
14 #include <llvm/IR/IRBuilder.h>
28 class SimpleOperation;
33 class FunctionToPointerOperation;
35 class ControlFlowGraph;
38 class PoisonValueOperation;
40 class LoadNonVolatileOperation;
41 class LoadVolatileOperation;
42 class StoreVolatileOperation;
43 class ConstantDataArray;
44 class ConstantArrayOperation;
45 class ConstantAggregateZeroOperation;
47 class ConstantPointerNullOperation;
48 class ShuffleVectorOperation;
49 class VectorSelectOperation;
50 class MallocOperation;
52 class MemCpyNonVolatileOperation;
53 class MemCpyVolatileOperation;
54 class MemoryStateMergeOperation;
55 class MemoryStateSplitOperation;
56 class LambdaEntryMemoryStateSplitOperation;
57 class CallEntryMemoryStateMergeOperation;
58 class CallExitMemoryStateSplitOperation;
59 class ControlFlowGraphNode;
60 class ExtractValueOperation;
62 class InterProceduralGraphModule;
63 class LambdaExitMemoryStateMergeOperation;
64 class PointerToFunctionOperation;
65 class ThreeAddressCode;
89 std::unique_ptr<::
llvm::Module>
95 static std::unique_ptr<::
llvm::Module>
117 ::
llvm::AttributeList
158 const rvsdg::SimpleOperation & op,
159 const std::vector<const
Variable *> & arguments,
160 ::
llvm::IRBuilder<> & builder);
165 const rvsdg::SimpleOperation & op,
167 ::
llvm::IRBuilder<> & builder);
173 ::
llvm::IRBuilder<> &);
179 ::
llvm::IRBuilder<> &);
184 const std::vector<const
Variable *> &,
185 ::
llvm::IRBuilder<> &);
190 const std::vector<const
Variable *> &,
191 ::
llvm::IRBuilder<> &);
196 const std::vector<const
Variable *> &,
197 ::
llvm::IRBuilder<> &);
202 const std::vector<const
Variable *> &,
203 ::
llvm::IRBuilder<> &);
208 const std::vector<const
Variable *> &,
209 ::
llvm::IRBuilder<> &);
214 const std::vector<const
Variable *> &,
215 ::
llvm::IRBuilder<> &);
221 ::
llvm::IRBuilder<> & builder);
227 ::
llvm::IRBuilder<> & builder);
232 const std::vector<const
Variable *> & args,
233 ::
llvm::IRBuilder<> & builder);
238 const std::vector<const
Variable *> & args,
239 ::
llvm::IRBuilder<> & builder);
245 ::
llvm::IRBuilder<> & builder);
247 template<::
llvm::Instruction::CastOps OPCODE>
250 const rvsdg::SimpleOperation & op,
252 ::
llvm::IRBuilder<> & builder);
258 ::
llvm::IRBuilder<> & builder);
262 const rvsdg::SimpleOperation & op,
264 ::
llvm::IRBuilder<> & builder);
268 const rvsdg::SimpleOperation & op,
270 ::
llvm::IRBuilder<> & builder);
274 const rvsdg::SimpleOperation & op,
276 ::
llvm::IRBuilder<> & builder);
282 ::
llvm::IRBuilder<> & builder);
286 const rvsdg::SimpleOperation & op,
287 const std::vector<const
Variable *> & args,
288 ::
llvm::IRBuilder<> & builder);
292 const rvsdg::SimpleOperation & op,
294 ::
llvm::IRBuilder<> & builder);
298 const rvsdg::SimpleOperation & op,
300 ::
llvm::IRBuilder<> &);
304 const rvsdg::SimpleOperation & op,
305 const std::vector<const
Variable *> & args,
306 ::
llvm::IRBuilder<> &);
310 const rvsdg::SimpleOperation & op,
312 ::
llvm::IRBuilder<> & builder);
317 const std::vector<const
Variable *> &,
318 ::
llvm::IRBuilder<> &);
323 const std::vector<const
Variable *> & args,
324 ::
llvm::IRBuilder<> &);
328 const rvsdg::SimpleOperation & op,
329 const std::vector<const
Variable *> &,
330 ::
llvm::IRBuilder<> &);
334 const rvsdg::SimpleOperation & op,
335 const std::vector<const
Variable *> & args,
336 ::
llvm::IRBuilder<> & builder);
340 const rvsdg::SimpleOperation & op,
341 const std::vector<const
Variable *> & args,
342 ::
llvm::IRBuilder<> & builder);
346 const rvsdg::SimpleOperation & op,
347 const std::vector<const
Variable *> & args,
348 ::
llvm::IRBuilder<> & builder);
352 const rvsdg::SimpleOperation & op,
353 const std::vector<const
Variable *> & args,
354 ::
llvm::IRBuilder<> & builder);
359 const std::vector<const
Variable *> &,
360 ::
llvm::IRBuilder<> &);
366 ::
llvm::IRBuilder<> &);
372 ::
llvm::IRBuilder<> & builder);
384 const rvsdg::SimpleOperation & op,
385 const std::vector<const
Variable *> & args,
386 ::
llvm::IRBuilder<> & builder);
390 const rvsdg::SimpleOperation & op,
391 const std::vector<const
Variable *> & args,
392 ::
llvm::IRBuilder<> & builder);
398 ::
llvm::IRBuilder<> & builder);
402 const rvsdg::SimpleOperation & operation,
404 ::
llvm::IRBuilder<> & builder);
412 ::
llvm::IRBuilder<> & builder);
418 ::
llvm::IRBuilder<> & builder);
424 ::
llvm::IRBuilder<> & builder);
428 const rvsdg::Type & loadedType,
432 ::
llvm::IRBuilder<> & builder);
436 const rvsdg::SimpleOperation & op,
437 const std::vector<const
Variable *> &,
438 ::
llvm::IRBuilder<> & builder);
442 const rvsdg::SimpleOperation & op,
443 const std::vector<const
Variable *> &,
444 ::
llvm::IRBuilder<> &);
448 const rvsdg::SimpleOperation & op,
449 const std::vector<const
Variable *> & args,
450 ::
llvm::IRBuilder<> & builder);
455 const std::vector<const
Variable *> & args,
456 ::
llvm::IRBuilder<> & builder);
461 const std::vector<const
Variable *> &,
462 ::
llvm::IRBuilder<> &);
466 const rvsdg::SimpleOperation & op,
467 const std::vector<const
Variable *> &,
468 ::
llvm::IRBuilder<> &);
473 const std::vector<const
Variable *> &,
474 ::
llvm::IRBuilder<> & builder);
478 const rvsdg::SimpleOperation & op,
479 const std::vector<const
Variable *> &,
480 ::
llvm::IRBuilder<> & builder);
484 const rvsdg::SimpleOperation & op,
485 const std::vector<const
Variable *> &,
486 ::
llvm::IRBuilder<> & builder);
490 const ::
llvm::CmpInst::Predicate predicate,
491 const std::vector<const
Variable *> & args,
492 ::
llvm::IRBuilder<> & builder);
496 const ::
llvm::Instruction::BinaryOps opcode,
497 const std::vector<const
Variable *> & args,
498 ::
llvm::IRBuilder<> & builder);
502 const rvsdg::SimpleOperation & op,
503 const std::vector<const
Variable *> & args,
504 ::
llvm::IRBuilder<> &);
ConstantPointerNullOperation class.
Get address of compiled function object.
::llvm::Value * convert_select(const rvsdg::SimpleOperation &op, const std::vector< const Variable * > &operands, ::llvm::IRBuilder<> &builder)
::llvm::Value * convert_branch(const rvsdg::SimpleOperation &op, const std::vector< const Variable * > &, ::llvm::IRBuilder<> &)
void convert_instruction(const llvm::ThreeAddressCode &tac, const llvm::ControlFlowGraphNode *node)
::llvm::Value * convert_constantdatavector(const rvsdg::SimpleOperation &op, const std::vector< const Variable * > &operands, ::llvm::IRBuilder<> &builder)
::llvm::Value * convert_store(const rvsdg::SimpleOperation &operation, const std::vector< const Variable * > &operands, ::llvm::IRBuilder<> &builder)
::llvm::Value * convert_fpbin(const rvsdg::SimpleOperation &op, const std::vector< const Variable * > &args, ::llvm::IRBuilder<> &builder)
void convert_tacs(const tacsvector_t &tacs)
void create_switch(const ControlFlowGraphNode *node)
::llvm::Attribute::AttrKind ConvertAttributeKind(const Attribute::kind &kind)
const ::llvm::GlobalValue::LinkageTypes & convert_linkage(const llvm::Linkage &linkage)
::llvm::Value * CreateICmpInstruction(const ::llvm::CmpInst::Predicate predicate, const std::vector< const Variable * > &args, ::llvm::IRBuilder<> &builder)
::llvm::Attribute ConvertStringAttribute(const llvm::StringAttribute &attribute)
::llvm::Value * convert_operation(const rvsdg::SimpleOperation &op, const std::vector< const Variable * > &arguments, ::llvm::IRBuilder<> &builder)
::llvm::Value * convert_match(const rvsdg::SimpleOperation &op, const std::vector< const Variable * > &args, ::llvm::IRBuilder<> &builder)
::llvm::Value * convert_fpneg(const rvsdg::SimpleOperation &op, const std::vector< const Variable * > &args, ::llvm::IRBuilder<> &builder)
::llvm::Value * convert_valist(const rvsdg::SimpleOperation &op, const std::vector< const Variable * > &, ::llvm::IRBuilder<> &)
void CreateStoreInstruction(const Variable *address, const Variable *value, bool isVolatile, size_t alignment, ::llvm::IRBuilder<> &builder)
::llvm::Value * convert_insertelement(const rvsdg::SimpleOperation &op, const std::vector< const Variable * > &operands, ::llvm::IRBuilder<> &builder)
::llvm::Value * CreateBinOpInstruction(const ::llvm::Instruction::BinaryOps opcode, const std::vector< const Variable * > &args, ::llvm::IRBuilder<> &builder)
void create_terminator_instruction(const llvm::ControlFlowGraphNode *node)
~IpGraphToLlvmConverter() noexcept
::llvm::Value * convert_ptrcmp(const rvsdg::SimpleOperation &op, const std::vector< const Variable * > &args, ::llvm::IRBuilder<> &builder)
::llvm::Value * convert_alloca(const rvsdg::SimpleOperation &op, const std::vector< const Variable * > &args, ::llvm::IRBuilder<> &builder)
::llvm::Value * convert_vectorunary(const rvsdg::SimpleOperation &op, const std::vector< const Variable * > &operands, ::llvm::IRBuilder<> &builder)
::llvm::Value * convert_constantvector(const rvsdg::SimpleOperation &op, const std::vector< const Variable * > &operands, ::llvm::IRBuilder<> &)
std::vector< ControlFlowGraphNode * > ConvertBasicBlocks(const ControlFlowGraph &controlFlowGraph, ::llvm::Function &function)
::llvm::Value * CreateLoadInstruction(const rvsdg::Type &loadedType, const Variable *address, bool isVolatile, size_t alignment, ::llvm::IRBuilder<> &builder)
::llvm::Value * convert_ctl2bits(const rvsdg::SimpleOperation &op, const std::vector< const Variable * > &args, ::llvm::IRBuilder<> &)
::llvm::Value * convert_ctlconstant(const rvsdg::SimpleOperation &op, const std::vector< const Variable * > &, ::llvm::IRBuilder<> &builder)
::llvm::Value * convert_fpcmp(const rvsdg::SimpleOperation &op, const std::vector< const Variable * > &args, ::llvm::IRBuilder<> &builder)
::llvm::Value * ConverterIntegerConstant(const rvsdg::SimpleOperation &op, const std::vector< const Variable * > &, ::llvm::IRBuilder<> &builder)
void convert_function(const FunctionNode &node)
::llvm::Value * convert_extractelement(const rvsdg::SimpleOperation &op, const std::vector< const Variable * > &args, ::llvm::IRBuilder<> &builder)
::llvm::Value * convert_assignment(const rvsdg::SimpleOperation &op, const std::vector< const Variable * > &args, ::llvm::IRBuilder<> &)
std::unique_ptr<::llvm::Module > ConvertModule(InterProceduralGraphModule &ipGraphModule, ::llvm::LLVMContext &llvmContext)
void create_return(const ControlFlowGraphNode *node)
::llvm::Value * convert_vectorbinary(const rvsdg::SimpleOperation &op, const std::vector< const Variable * > &operands, ::llvm::IRBuilder<> &builder)
::llvm::Value * convert_phi(const rvsdg::SimpleOperation &op, const std::vector< const Variable * > &, ::llvm::IRBuilder<> &builder)
::llvm::Value * convert_cast(const rvsdg::SimpleOperation &op, const std::vector< const Variable * > &operands, ::llvm::IRBuilder<> &builder)
::llvm::Attribute ConvertTypeAttribute(const llvm::TypeAttribute &attribute)
void create_unconditional_branch(const ControlFlowGraphNode *node)
::llvm::Value * convert_getelementptr(const rvsdg::SimpleOperation &op, const std::vector< const Variable * > &args, ::llvm::IRBuilder<> &builder)
::llvm::Value * convert_undef(const rvsdg::SimpleOperation &op, const std::vector< const Variable * > &, ::llvm::IRBuilder<> &)
::llvm::AttributeList convert_attributes(const FunctionNode &f)
static std::unique_ptr<::llvm::Module > CreateAndConvertModule(InterProceduralGraphModule &ipGraphModule, ::llvm::LLVMContext &ctx)
void create_conditional_branch(const ControlFlowGraphNode *node)
::llvm::Attribute ConvertEnumAttribute(const llvm::EnumAttribute &attribute)
void convert_cfg(ControlFlowGraph &cfg, ::llvm::Function &f)
std::vector< T > get_fpdata(const std::vector< const Variable * > &args)
::llvm::Attribute ConvertIntAttribute(const llvm::IntAttribute &attribute)
void convert_data_node(const DataNode &node)
::llvm::Value * convert(const rvsdg::SimpleOperation &op, const std::vector< const Variable * > &operands, ::llvm::IRBuilder<> &builder)
std::unique_ptr< Context > Context_
std::vector< T > get_bitdata(const std::vector< const Variable * > &args)
Interpret pointer as callable function.
PoisonValueOperation class.
Global memory state passed between functions.
std::vector< std::unique_ptr< llvm::ThreeAddressCode > > tacsvector_t
static std::vector< jlm::rvsdg::Output * > operands(const Node *node)