Jlm
Loading...
Searching...
No Matches
RvsdgModule.hpp
Go to the documentation of this file.
1/*
2 * Copyright 2017 Nico Reißmann <nico.reissmann@gmail.com>
3 * See COPYING for terms of redistribution.
4 */
5
6#ifndef JLM_LLVM_IR_RVSDGMODULE_HPP
7#define JLM_LLVM_IR_RVSDGMODULE_HPP
8
11#include <jlm/llvm/ir/types.hpp>
13#include <jlm/util/file.hpp>
14
15namespace jlm::llvm
16{
17
23{
25 rvsdg::Graph & graph,
26 std::shared_ptr<const rvsdg::Type> valueType,
27 std::shared_ptr<const rvsdg::Type> importedType,
28 std::string name,
31 const bool isConstant,
32 const size_t alignment)
33 : GraphImport(graph, importedType, std::move(name)),
34 ValueType_(std::move(valueType)),
35 ImportedType_(std::move(importedType)),
36 Linkage_(std::move(linkage)),
39 alignment_(alignment)
40 {}
41
42public:
43 [[nodiscard]] size_t
44 getAlignment() const noexcept
45 {
46 return alignment_;
47 }
48
49 [[nodiscard]] const Linkage &
50 linkage() const noexcept
51 {
52 return Linkage_;
53 }
54
60 [[nodiscard]] const CallingConvention &
61 callingConvention() const noexcept
62 {
63 return callingConvention_;
64 }
65
66 [[nodiscard]] bool
67 isConstant() const noexcept
68 {
69 return isConstant_;
70 }
71
79 [[nodiscard]] const std::shared_ptr<const jlm::rvsdg::Type> &
80 ValueType() const noexcept
81 {
82 return ValueType_;
83 }
84
93 [[nodiscard]] const std::shared_ptr<const jlm::rvsdg::Type> &
94 ImportedType() const noexcept
95 {
96 return ImportedType_;
97 }
98
107
108 [[nodiscard]] static LlvmGraphImport &
110 rvsdg::Graph & graph,
111 std::shared_ptr<const rvsdg::Type> valueType,
112 std::shared_ptr<const rvsdg::Type> importedType,
113 std::string name,
116 const bool isConstant,
117 const size_t alignment)
118 {
119 auto graphImport = new LlvmGraphImport(
120 graph,
121 std::move(valueType),
122 std::move(importedType),
123 std::move(name),
124 std::move(linkage),
127 alignment);
128 graph.GetRootRegion().addArgument(std::unique_ptr<RegionArgument>(graphImport));
129 return *graphImport;
130 }
131
142 [[nodiscard]] static LlvmGraphImport &
144 rvsdg::Graph & graph,
145 std::shared_ptr<const rvsdg::Type> valueType,
146 std::shared_ptr<const rvsdg::Type> importedType,
147 std::string name,
149 const bool isConstant,
150 const size_t alignment)
151 {
152 return create(
153 graph,
154 std::move(valueType),
155 std::move(importedType),
156 std::move(name),
157 std::move(linkage),
158 CallingConvention::Default, // Global variables do not have a calling convention
160 alignment);
161 }
162
171 [[nodiscard]] static LlvmGraphImport &
173 rvsdg::Graph & graph,
174 std::shared_ptr<const rvsdg::FunctionType> functionType,
175 std::string name,
178 {
179 return create(
180 graph,
181 functionType,
182 functionType,
183 std::move(name),
184 std::move(linkage),
186 true, // Functions are always considered constants
187 1); // We are not responsible for function alignment
188 }
189
190private:
191 std::shared_ptr<const rvsdg::Type> ValueType_;
192 std::shared_ptr<const rvsdg::Type> ImportedType_;
197};
198
203{
204public:
205 ~LlvmRvsdgModule() noexcept override = default;
206
207 LlvmRvsdgModule(util::FilePath sourceFileName, std::string targetTriple, std::string dataLayout)
208 : RvsdgModule(std::move(sourceFileName)),
209 DataLayout_(std::move(dataLayout)),
210 TargetTriple_(std::move(targetTriple))
211 {}
212
214 util::FilePath sourceFileName,
215 std::string targetTriple,
216 std::string dataLayout,
217 std::unique_ptr<rvsdg::Graph> rvsdg)
218 : RvsdgModule(std::move(sourceFileName), std::move(rvsdg)),
219 DataLayout_(std::move(dataLayout)),
220 TargetTriple_(std::move(targetTriple))
221 {}
222
224
226
228 operator=(const LlvmRvsdgModule &) = delete;
229
232
233 std::unique_ptr<RvsdgModule>
234 copy() const override;
235
236 [[nodiscard]] const util::FilePath &
237 SourceFileName() const noexcept
238 {
239 return SourceFilePath().value();
240 }
241
242 [[nodiscard]] const std::string &
243 TargetTriple() const noexcept
244 {
245 return TargetTriple_;
246 }
247
248 [[nodiscard]] const std::string &
249 DataLayout() const noexcept
250 {
251 return DataLayout_;
252 }
253
254 static std::unique_ptr<LlvmRvsdgModule>
256 const util::FilePath & sourceFileName,
257 const std::string & targetTriple,
258 const std::string & dataLayout)
259 {
260 return std::make_unique<LlvmRvsdgModule>(sourceFileName, targetTriple, dataLayout);
261 }
262
263private:
264 std::string DataLayout_;
265 std::string TargetTriple_;
266};
267
268}
269
270#endif
LlvmGraphImport(rvsdg::Graph &graph, std::shared_ptr< const rvsdg::Type > valueType, std::shared_ptr< const rvsdg::Type > importedType, std::string name, Linkage linkage, CallingConvention callingConvention, const bool isConstant, const size_t alignment)
bool isConstant() const noexcept
CallingConvention callingConvention_
static LlvmGraphImport & create(rvsdg::Graph &graph, std::shared_ptr< const rvsdg::Type > valueType, std::shared_ptr< const rvsdg::Type > importedType, std::string name, Linkage linkage, CallingConvention callingConvention, const bool isConstant, const size_t alignment)
std::shared_ptr< const rvsdg::Type > ValueType_
const Linkage & linkage() const noexcept
const CallingConvention & callingConvention() const noexcept
std::shared_ptr< const rvsdg::Type > ImportedType_
static LlvmGraphImport & createGlobalImport(rvsdg::Graph &graph, std::shared_ptr< const rvsdg::Type > valueType, std::shared_ptr< const rvsdg::Type > importedType, std::string name, Linkage linkage, const bool isConstant, const size_t alignment)
size_t getAlignment() const noexcept
LlvmGraphImport & Copy(rvsdg::Region &region, rvsdg::StructuralInput *input) const override
const std::shared_ptr< const jlm::rvsdg::Type > & ImportedType() const noexcept
static LlvmGraphImport & createFunctionImport(rvsdg::Graph &graph, std::shared_ptr< const rvsdg::FunctionType > functionType, std::string name, Linkage linkage, CallingConvention callingConvention)
const std::shared_ptr< const jlm::rvsdg::Type > & ValueType() const noexcept
const util::FilePath & SourceFileName() const noexcept
~LlvmRvsdgModule() noexcept override=default
LlvmRvsdgModule & operator=(const LlvmRvsdgModule &)=delete
const std::string & DataLayout() const noexcept
LlvmRvsdgModule(LlvmRvsdgModule &&)=delete
static std::unique_ptr< LlvmRvsdgModule > Create(const util::FilePath &sourceFileName, const std::string &targetTriple, const std::string &dataLayout)
LlvmRvsdgModule(const LlvmRvsdgModule &)=delete
std::unique_ptr< RvsdgModule > copy() const override
const std::string & TargetTriple() const noexcept
LlvmRvsdgModule & operator=(LlvmRvsdgModule &&)=delete
LlvmRvsdgModule(util::FilePath sourceFileName, std::string targetTriple, std::string dataLayout, std::unique_ptr< rvsdg::Graph > rvsdg)
GraphImport(Graph &graph, std::shared_ptr< const rvsdg::Type > type, std::string name)
Definition graph.cpp:16
Region & GetRootRegion() const noexcept
Definition graph.hpp:99
rvsdg::Region * region() const noexcept
Definition node.cpp:151
StructuralInput * input() const noexcept
Definition region.hpp:69
Represent acyclic RVSDG subgraphs.
Definition region.hpp:213
RegionArgument & addArgument(std::unique_ptr< RegionArgument > argument)
Definition region.cpp:179
const std::optional< util::FilePath > & SourceFilePath() const noexcept
Global memory state passed between functions.