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;
39 class FreezeOperation;
41 class LoadNonVolatileOperation;
42 class LoadVolatileOperation;
43 class StoreVolatileOperation;
44 class ConstantDataArray;
45 class ConstantArrayOperation;
46 class ConstantAggregateZeroOperation;
48 class ConstantPointerNullOperation;
49 class ShuffleVectorOperation;
50 class VectorSelectOperation;
51 class MallocOperation;
53 class MemCpyNonVolatileOperation;
54 class MemCpyVolatileOperation;
55 class MemSetNonVolatileOperation;
56 class MemoryStateMergeOperation;
57 class MemoryStateSplitOperation;
58 class LambdaEntryMemoryStateSplitOperation;
59 class CallEntryMemoryStateMergeOperation;
60 class CallExitMemoryStateSplitOperation;
61 class ControlFlowGraphNode;
62 class ExtractValueOperation;
64 class InsertValueOperation;
65 class InterProceduralGraphModule;
66 class LambdaExitMemoryStateMergeOperation;
67 class PointerToFunctionOperation;
68 class ThreeAddressCode;
92 std::unique_ptr<::
llvm::Module>
98 static std::unique_ptr<::
llvm::Module>
174 const rvsdg::SimpleOperation & op,
175 const rvsdg::SimpleOperation & originalOp,
176 const std::vector<const
Variable *> & arguments,
177 ::
llvm::IRBuilder<> & builder);
182 const rvsdg::SimpleOperation & op,
184 ::
llvm::IRBuilder<> & builder);
190 ::
llvm::IRBuilder<> &);
196 ::
llvm::IRBuilder<> &);
201 const std::vector<const
Variable *> &,
202 ::
llvm::IRBuilder<> &);
207 const std::vector<const
Variable *> &,
208 ::
llvm::IRBuilder<> &);
213 const std::vector<const
Variable *> &,
214 ::
llvm::IRBuilder<> &);
219 const std::vector<const
Variable *> &,
220 ::
llvm::IRBuilder<> &);
225 const std::vector<const
Variable *> &,
226 ::
llvm::IRBuilder<> &);
231 const std::vector<const
Variable *> &,
232 ::
llvm::IRBuilder<> &);
238 ::
llvm::IRBuilder<> & builder);
244 ::
llvm::IRBuilder<> & builder);
248 const rvsdg::SimpleOperation &,
249 const std::vector<const
Variable *> &,
250 ::
llvm::IRBuilder<> &);
255 const std::vector<const
Variable *> & args,
256 ::
llvm::IRBuilder<> & builder);
261 const std::vector<const
Variable *> & args,
262 ::
llvm::IRBuilder<> & builder);
268 ::
llvm::IRBuilder<> & builder);
274 ::
llvm::IRBuilder<> & builder) const;
276 template<::
llvm::Instruction::CastOps OPCODE>
279 const rvsdg::SimpleOperation & op,
280 const rvsdg::SimpleOperation & originalOp,
282 ::
llvm::IRBuilder<> & builder);
288 ::
llvm::IRBuilder<> & builder);
292 const rvsdg::SimpleOperation & op,
293 const rvsdg::SimpleOperation & originalOp,
295 ::
llvm::IRBuilder<> & builder);
299 const rvsdg::SimpleOperation & op,
300 const rvsdg::SimpleOperation & originalOp,
302 ::
llvm::IRBuilder<> & builder);
306 const rvsdg::SimpleOperation & op,
308 ::
llvm::IRBuilder<> & builder);
314 ::
llvm::IRBuilder<> & builder);
318 const rvsdg::SimpleOperation & op,
319 const std::vector<const
Variable *> & args,
320 ::
llvm::IRBuilder<> & builder);
324 const rvsdg::SimpleOperation & op,
326 ::
llvm::IRBuilder<> & builder);
330 const rvsdg::SimpleOperation & op,
332 ::
llvm::IRBuilder<> &);
336 const rvsdg::SimpleOperation & op,
337 const std::vector<const
Variable *> & args,
338 ::
llvm::IRBuilder<> &);
342 const rvsdg::SimpleOperation & op,
344 ::
llvm::IRBuilder<> & builder);
349 const std::vector<const
Variable *> &,
350 ::
llvm::IRBuilder<> &);
355 const std::vector<const
Variable *> & args,
356 ::
llvm::IRBuilder<> &);
360 const rvsdg::SimpleOperation & op,
361 const std::vector<const
Variable *> &,
362 ::
llvm::IRBuilder<> &);
366 const rvsdg::SimpleOperation & op,
367 const std::vector<const
Variable *> & args,
368 ::
llvm::IRBuilder<> & builder);
372 const rvsdg::SimpleOperation & op,
373 const std::vector<const
Variable *> & args,
374 ::
llvm::IRBuilder<> & builder);
378 const rvsdg::SimpleOperation & op,
379 const std::vector<const
Variable *> & args,
380 ::
llvm::IRBuilder<> & builder);
384 const rvsdg::SimpleOperation & op,
385 const std::vector<const
Variable *> & args,
386 ::
llvm::IRBuilder<> & builder);
391 const std::vector<const
Variable *> &,
392 ::
llvm::IRBuilder<> &);
398 ::
llvm::IRBuilder<> &);
404 ::
llvm::IRBuilder<> & builder);
416 const rvsdg::SimpleOperation & op,
417 const std::vector<const
Variable *> & args,
418 ::
llvm::IRBuilder<> & builder);
422 const rvsdg::SimpleOperation & op,
423 const std::vector<const
Variable *> & args,
424 ::
llvm::IRBuilder<> & builder);
430 ::
llvm::IRBuilder<> & builder);
434 const rvsdg::SimpleOperation & operation,
436 ::
llvm::IRBuilder<> & builder);
444 ::
llvm::IRBuilder<> & builder);
450 ::
llvm::IRBuilder<> & builder);
456 ::
llvm::IRBuilder<> & builder);
460 const rvsdg::Type & loadedType,
464 ::
llvm::IRBuilder<> & builder);
468 const rvsdg::SimpleOperation & op,
469 const std::vector<const
Variable *> &,
470 ::
llvm::IRBuilder<> & builder);
474 const rvsdg::SimpleOperation & op,
475 const std::vector<const
Variable *> &,
476 ::
llvm::IRBuilder<> &);
480 const rvsdg::SimpleOperation & op,
481 const std::vector<const
Variable *> & args,
482 ::
llvm::IRBuilder<> & builder);
487 const std::vector<const
Variable *> & args,
488 ::
llvm::IRBuilder<> & builder);
493 const std::vector<const
Variable *> &,
494 ::
llvm::IRBuilder<> &);
499 const std::vector<const
Variable *> &,
500 ::
llvm::IRBuilder<> &);
504 const rvsdg::SimpleOperation & op,
505 const std::vector<const
Variable *> &,
506 ::
llvm::IRBuilder<> &);
511 const std::vector<const
Variable *> &,
512 ::
llvm::IRBuilder<> & builder);
516 const rvsdg::SimpleOperation & op,
517 const std::vector<const
Variable *> &,
518 ::
llvm::IRBuilder<> & builder);
522 const rvsdg::SimpleOperation & op,
523 const std::vector<const
Variable *> &,
524 ::
llvm::IRBuilder<> & builder);
528 const ::
llvm::CmpInst::Predicate predicate,
529 const std::vector<const
Variable *> & args,
530 ::
llvm::IRBuilder<> & builder);
534 const ::
llvm::Instruction::BinaryOps opcode,
535 const std::vector<const
Variable *> & args,
536 ::
llvm::IRBuilder<> & builder);
540 const rvsdg::SimpleOperation & op,
541 const std::vector<const
Variable *> & args,
542 ::
llvm::IRBuilder<> &);
ConstantPointerNullOperation class.
Get address of compiled function object.
::llvm::AttributeList convertAttributeList(const AttributeList &attributeList)
::llvm::Value * convertInsertValueOperation(const InsertValueOperation &operation, const std::vector< const Variable * > &operands, ::llvm::IRBuilder<> &builder) const
::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 * convertMemsetNonVolatileOperation(const rvsdg::SimpleOperation &, const std::vector< const Variable * > &, ::llvm::IRBuilder<> &)
::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_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_constantvector(const rvsdg::SimpleOperation &op, const std::vector< const Variable * > &operands, ::llvm::IRBuilder<> &)
::llvm::Value * convert_vectorunary(const rvsdg::SimpleOperation &op, const rvsdg::SimpleOperation &originalOp, const std::vector< const Variable * > &operands, ::llvm::IRBuilder<> &builder)
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_cast(const rvsdg::SimpleOperation &op, const rvsdg::SimpleOperation &originalOp, const std::vector< const Variable * > &operands, ::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<> &)
::llvm::Value * convert_operation(const rvsdg::SimpleOperation &op, const rvsdg::SimpleOperation &originalOp, const std::vector< const Variable * > &arguments, ::llvm::IRBuilder<> &builder)
std::unique_ptr<::llvm::Module > ConvertModule(InterProceduralGraphModule &ipGraphModule, ::llvm::LLVMContext &llvmContext)
void create_return(const ControlFlowGraphNode *node)
::llvm::Value * convert_phi(const rvsdg::SimpleOperation &op, const std::vector< const Variable * > &, ::llvm::IRBuilder<> &builder)
::llvm::Value * convert_vectorbinary(const rvsdg::SimpleOperation &op, const rvsdg::SimpleOperation &originalOp, 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)