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>
33class FunctionToPointerOperation;
35class ControlFlowGraph;
38class PoisonValueOperation;
41class LoadNonVolatileOperation;
42class LoadVolatileOperation;
43class StoreVolatileOperation;
44class ConstantDataArrayOperation;
45class ConstantArrayOperation;
46class ConstantAggregateZeroOperation;
47class ConstantStructOperation;
48class ConstantPointerNullOperation;
49class ShuffleVectorOperation;
50class VectorSelectOperation;
53class MemCpyNonVolatileOperation;
54class MemCpyVolatileOperation;
55class MemSetNonVolatileOperation;
56class MemoryStateMergeOperation;
57class MemoryStateSplitOperation;
58class LambdaEntryMemoryStateSplitOperation;
59class CallEntryMemoryStateMergeOperation;
60class CallExitMemoryStateSplitOperation;
61class ControlFlowGraphNode;
62class ExtractValueOperation;
64class InsertValueOperation;
65class InterProceduralGraphModule;
66class LambdaExitMemoryStateMergeOperation;
67class PointerToFunctionOperation;
68class ThreeAddressCode;
92 std::unique_ptr<::
llvm::Module>
98 static std::unique_ptr<::
llvm::Module>
174 const rvsdg::SimpleOperation & op,
175 const rvsdg::SimpleOperation & originalOp,
177 ::
llvm::IRBuilder<> & builder);
182 const rvsdg::SimpleOperation & op,
183 const std::vector<const
Variable *> & operands,
184 ::
llvm::IRBuilder<> & builder);
189 const std::vector<const
Variable *> & operands,
190 ::
llvm::IRBuilder<> &);
195 const std::vector<const
Variable *> & operands,
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<> &);
237 const std::vector<const
Variable *> & operands,
238 ::
llvm::IRBuilder<> & builder);
243 const std::vector<const
Variable *> & operands,
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);
267 const std::vector<const
Variable *> & operands,
268 ::
llvm::IRBuilder<> & builder);
273 const std::vector<const
Variable *> & operands,
274 ::
llvm::IRBuilder<> & builder) const;
276 template<::
llvm::Instruction::CastOps OPCODE>
279 const rvsdg::SimpleOperation & op,
280 const rvsdg::SimpleOperation & originalOp,
281 const std::vector<const
Variable *> & operands,
282 ::
llvm::IRBuilder<> & builder);
287 const std::vector<const
Variable *> & operands,
288 ::
llvm::IRBuilder<> & builder);
292 const rvsdg::SimpleOperation & op,
293 const rvsdg::SimpleOperation & originalOp,
294 const std::vector<const
Variable *> & operands,
295 ::
llvm::IRBuilder<> & builder);
299 const rvsdg::SimpleOperation & op,
300 const rvsdg::SimpleOperation & originalOp,
301 const std::vector<const
Variable *> & operands,
302 ::
llvm::IRBuilder<> & builder);
306 const rvsdg::SimpleOperation & op,
307 const std::vector<const
Variable *> & operands,
308 ::
llvm::IRBuilder<> & builder);
313 const std::vector<const
Variable *> & operands,
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,
325 const std::vector<const
Variable *> & operands,
326 ::
llvm::IRBuilder<> & builder);
330 const rvsdg::SimpleOperation & op,
331 const std::vector<const
Variable *> & operands,
332 ::
llvm::IRBuilder<> &);
336 const rvsdg::SimpleOperation & op,
337 const std::vector<const
Variable *> & args,
338 ::
llvm::IRBuilder<> &);
342 const rvsdg::SimpleOperation & op,
343 const std::vector<const
Variable *> & operands,
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<> &);
397 const std::vector<const
Variable *> & operands,
398 ::
llvm::IRBuilder<> &);
403 const std::vector<const
Variable *> & operands,
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);
429 const std::vector<const
Variable *> & operands,
430 ::
llvm::IRBuilder<> & builder);
434 const rvsdg::SimpleOperation & operation,
435 const std::vector<const
Variable *> & operands,
436 ::
llvm::IRBuilder<> & builder);
444 ::
llvm::IRBuilder<> & builder);
449 const std::vector<const
Variable *> & operands,
450 ::
llvm::IRBuilder<> & builder);
455 const std::vector<const
Variable *> & operands,
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<> &);
util::HashSet< rvsdg::Output * > arguments
ConstantPointerNullOperation class.
Get address of compiled function object.
::llvm::AttributeList convertAttributeList(const AttributeList &attributeList)
::llvm::Value * convert(const rvsdg::SimpleOperation &op, const std::vector< const Variable * > &operands, ::llvm::IRBuilder<> &builder)
::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_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_cast(const rvsdg::SimpleOperation &op, const rvsdg::SimpleOperation &originalOp, const std::vector< const Variable * > &operands, ::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)
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