6 #ifndef JLM_LLVM_IR_IPGRAPH_HPP
7 #define JLM_LLVM_IR_IPGRAPH_HPP
15 #include <unordered_map>
16 #include <unordered_set>
21 class InterProceduralGraphNode;
57 add_node(std::unique_ptr<InterProceduralGraphNode> node);
65 [[nodiscard]] std::vector<std::unordered_set<const InterProceduralGraphNode *>>
69 find(
const std::string & name)
const noexcept;
90 std::vector<std::unique_ptr<InterProceduralGraphNode>>
nodes_;
97 typedef std::unordered_set<const InterProceduralGraphNode *>::const_iterator
const_iterator;
141 virtual const std::string &
144 virtual const
jlm::rvsdg::
Type &
147 virtual std::shared_ptr<const
jlm::rvsdg::
Type>
175 const std::
string &
name,
176 std::shared_ptr<const rvsdg::FunctionType>
type,
196 type() const noexcept override;
198 std::shared_ptr<const
jlm::rvsdg::
Type>
199 Type() const override;
201 const rvsdg::FunctionType &
207 const std::shared_ptr<const rvsdg::FunctionType> &
214 linkage() const noexcept override;
216 [[nodiscard]] const std::
string &
217 name() const noexcept override;
220 hasBody() const noexcept override;
239 add_cfg(std::unique_ptr<ControlFlowGraph>
cfg);
244 const std::string &
name,
245 std::shared_ptr<const rvsdg::FunctionType>
type,
250 std::unique_ptr<FunctionNode> node(
252 auto tmp = node.get();
263 const std::string &
name,
264 std::shared_ptr<const rvsdg::FunctionType>
type,
276 std::unique_ptr<ControlFlowGraph>
cfg_;
290 function()
const noexcept
310 throw util::Error(
"Initialization cannot be empty.");
312 auto & tac =
tacs_.back();
313 if (tac->nresults() != 1)
314 throw util::Error(
"Last TAC of initialization needs exactly one result.");
322 :
tacs_(std::move(other.tacs_)),
357 const std::
string &
name,
358 std::shared_ptr<const
jlm::rvsdg::
Type> valueType,
362 const
size_t alignment)
374 type() const noexcept override;
376 std::shared_ptr<const
jlm::rvsdg::
Type>
377 Type() const override;
379 [[nodiscard]] const std::shared_ptr<const
jlm::rvsdg::
Type> &
385 [[nodiscard]]
const std::string &
386 name() const noexcept override;
389 linkage() const noexcept override;
392 hasBody() const noexcept override;
427 init_ = std::move(init);
433 const std::string &
name,
434 std::shared_ptr<const jlm::rvsdg::Type> valueType,
438 const size_t alignment)
440 std::unique_ptr<DataNode> node(
new DataNode(
443 std::move(valueType),
448 const auto ptr = node.get();
459 std::unique_ptr<DataNodeInit>
init_;
const Variable * value() const noexcept
DataNodeInit(tacsvector_t tacs)
DataNodeInit(DataNodeInit &&other) noexcept
const tacsvector_t & tacs() const noexcept
DataNodeInit & operator=(DataNodeInit &&)=delete
DataNodeInit & operator=(const DataNodeInit &)=delete
DataNodeInit(const Variable *value)
DataNodeInit(const DataNodeInit &)=delete
const std::shared_ptr< const jlm::rvsdg::Type > & GetValueType() const noexcept
const std::string & name() const noexcept override
const std::string & Section() const noexcept
static DataNode * Create(InterProceduralGraph &clg, const std::string &name, std::shared_ptr< const jlm::rvsdg::Type > valueType, const llvm::Linkage &linkage, std::string section, const bool constant, const size_t alignment)
void set_initialization(std::unique_ptr< DataNodeInit > init)
std::shared_ptr< const jlm::rvsdg::Type > ValueType_
std::shared_ptr< const jlm::rvsdg::Type > Type() const override
size_t getAlignment() const noexcept
const llvm::Linkage & linkage() const noexcept override
DataNode(InterProceduralGraph &clg, const std::string &name, std::shared_ptr< const jlm::rvsdg::Type > valueType, const llvm::Linkage &linkage, std::string section, const bool constant, const size_t alignment)
const DataNodeInit * initialization() const noexcept
std::unique_ptr< DataNodeInit > init_
~DataNode() noexcept override
const PointerType & type() const noexcept override
bool constant() const noexcept
bool hasBody() const noexcept override
const AttributeSet & attributes() const noexcept
const jlm::rvsdg::Type & type() const noexcept override
static FunctionNode * create(InterProceduralGraph &ipg, const std::string &name, std::shared_ptr< const rvsdg::FunctionType > type, const llvm::Linkage &linkage, const CallingConvention &callingConvention, const AttributeSet &attributes)
const rvsdg::FunctionType & fcttype() const noexcept
std::shared_ptr< const rvsdg::FunctionType > FunctionType_
void add_cfg(std::unique_ptr< ControlFlowGraph > cfg)
Adds cfg to the function node. If the function node already has a CFG, then it is replaced with cfg.
const std::shared_ptr< const rvsdg::FunctionType > & GetFunctionType() const noexcept
llvm::CallingConvention callingConvention_
static FunctionNode * create(InterProceduralGraph &ipg, const std::string &name, std::shared_ptr< const rvsdg::FunctionType > type, const llvm::Linkage &linkage)
FunctionNode(InterProceduralGraph &clg, const std::string &name, std::shared_ptr< const rvsdg::FunctionType > type, const llvm::Linkage &linkage, const llvm::CallingConvention &callingConvention, const AttributeSet &attributes)
const std::string & name() const noexcept override
std::unique_ptr< ControlFlowGraph > cfg_
const CallingConvention & callingConvention() const noexcept
bool hasBody() const noexcept override
const llvm::Linkage & linkage() const noexcept override
~FunctionNode() noexcept override
llvm::ControlFlowGraph * cfg() const noexcept
std::shared_ptr< const jlm::rvsdg::Type > Type() const override
~FunctionVariable() noexcept override
virtual std::shared_ptr< const jlm::rvsdg::Type > Type() const =0
InterProceduralGraph & clg_
virtual ~InterProceduralGraphNode() noexcept
virtual const jlm::rvsdg::Type & type() const noexcept=0
size_t numDependencies() const noexcept
const_iterator end() const
virtual const llvm::Linkage & linkage() const noexcept=0
virtual const std::string & name() const noexcept=0
const_iterator begin() const
std::unordered_set< const InterProceduralGraphNode * >::const_iterator const_iterator
InterProceduralGraph & clg() const noexcept
virtual bool hasBody() const noexcept=0
void add_dependency(const InterProceduralGraphNode *dep)
bool is_selfrecursive() const noexcept
std::unordered_set< const InterProceduralGraphNode * > dependencies_
std::vector< std::unordered_set< const InterProceduralGraphNode * > > find_sccs() const
const InterProceduralGraphNode * find(const std::string &name) const noexcept
std::vector< std::unique_ptr< InterProceduralGraphNode > > nodes_
void add_node(std::unique_ptr< InterProceduralGraphNode > node)
const_iterator begin() const noexcept
~InterProceduralGraph() noexcept=default
util::PtrIterator< const InterProceduralGraphNode, std::vector< std::unique_ptr< InterProceduralGraphNode > >::const_iterator > const_iterator
size_t nnodes() const noexcept
static util::graph::Graph & toDot(util::graph::Writer &writer, const InterProceduralGraph &interProceduralGraph)
const_iterator end() const noexcept
const std::string & name() const noexcept
const std::shared_ptr< const jlm::rvsdg::Type > Type() const noexcept
Global memory state passed between functions.
std::vector< std::unique_ptr< llvm::ThreeAddressCode > > tacsvector_t