6 #ifndef JLM_LLVM_IR_IPGRAPH_HPP
7 #define JLM_LLVM_IR_IPGRAPH_HPP
14 #include <unordered_map>
15 #include <unordered_set>
20 class InterProceduralGraphNode;
56 add_node(std::unique_ptr<InterProceduralGraphNode> node);
64 [[nodiscard]] std::vector<std::unordered_set<const InterProceduralGraphNode *>>
68 find(
const std::string & name)
const noexcept;
71 std::vector<std::unique_ptr<InterProceduralGraphNode>>
nodes_;
78 typedef std::unordered_set<const InterProceduralGraphNode *>::const_iterator
const_iterator;
122 virtual const std::string &
125 virtual const
jlm::rvsdg::
Type &
128 virtual std::shared_ptr<const
jlm::rvsdg::
Type>
150 const std::
string &
name,
151 std::shared_ptr<const rvsdg::FunctionType>
type,
158 attributes_(attributes)
169 type() const noexcept override;
171 std::shared_ptr<const
jlm::rvsdg::
Type>
172 Type() const override;
174 const rvsdg::FunctionType &
175 fcttype() const noexcept
177 return *FunctionType_;
180 const std::shared_ptr<const rvsdg::FunctionType> &
183 return FunctionType_;
187 linkage() const noexcept override;
189 [[nodiscard]] const std::
string &
190 name() const noexcept override;
193 hasBody() const noexcept override;
196 attributes() const noexcept
206 add_cfg(std::unique_ptr<ControlFlowGraph> cfg);
211 const std::string &
name,
212 std::shared_ptr<const rvsdg::FunctionType>
type,
216 std::unique_ptr<FunctionNode> node(
218 auto tmp = node.get();
226 const std::string &
name,
227 std::shared_ptr<const rvsdg::FunctionType>
type,
238 std::unique_ptr<ControlFlowGraph>
cfg_;
252 function()
const noexcept
269 : tacs_(std::move(tacs))
272 throw util::Error(
"Initialization cannot be empty.");
274 auto & tac = tacs_.back();
275 if (tac->nresults() != 1)
276 throw util::Error(
"Last TAC of initialization needs exactly one result.");
278 value_ = tac->result(0);
284 : tacs_(std::move(other.tacs_)),
319 const std::
string &
name,
320 std::shared_ptr<const
jlm::rvsdg::
Type> valueType,
327 Section_(std::move(section)),
329 ValueType_(std::move(valueType))
334 type() const noexcept override;
336 std::shared_ptr<const
jlm::rvsdg::
Type>
337 Type() const override;
339 [[nodiscard]] const std::shared_ptr<const
jlm::rvsdg::
Type> &
340 GetValueType() const noexcept
345 [[nodiscard]]
const std::string &
346 name() const noexcept override;
349 linkage() const noexcept override;
352 hasBody() const noexcept override;
355 constant() const noexcept
378 if (init->value()->type() != *GetValueType())
381 init_ = std::move(init);
387 const std::string &
name,
388 std::shared_ptr<const jlm::rvsdg::Type> valueType,
393 std::unique_ptr<DataNode> node(
395 auto ptr = node.get();
406 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::string & Section() const noexcept
void set_initialization(std::unique_ptr< DataNodeInit > init)
std::shared_ptr< const jlm::rvsdg::Type > ValueType_
static DataNode * Create(InterProceduralGraph &clg, const std::string &name, std::shared_ptr< const jlm::rvsdg::Type > valueType, const llvm::Linkage &linkage, std::string section, bool constant)
const DataNodeInit * initialization() const noexcept
std::unique_ptr< DataNodeInit > init_
~DataNode() noexcept override
std::shared_ptr< const rvsdg::FunctionType > FunctionType_
const std::shared_ptr< const rvsdg::FunctionType > & GetFunctionType() const noexcept
static FunctionNode * create(InterProceduralGraph &ipg, const std::string &name, std::shared_ptr< const rvsdg::FunctionType > type, const llvm::Linkage &linkage)
std::unique_ptr< ControlFlowGraph > cfg_
~FunctionNode() noexcept override
llvm::ControlFlowGraph * cfg() const noexcept
static FunctionNode * create(InterProceduralGraph &ipg, const std::string &name, std::shared_ptr< const rvsdg::FunctionType > type, const llvm::Linkage &linkage, const AttributeSet &attributes)
~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
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
const_iterator end() const noexcept
Global memory state passed between functions.
std::vector< std::unique_ptr< llvm::ThreeAddressCode > > tacsvector_t