Jlm
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 
10 #include <jlm/llvm/ir/Linkage.hpp>
11 #include <jlm/llvm/ir/types.hpp>
13 #include <jlm/util/file.hpp>
14 
15 namespace jlm::llvm
16 {
17 
22 class LlvmGraphImport final : public rvsdg::GraphImport
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 
42 public:
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),
126  isConstant,
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
159  isConstant,
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 
190 private:
191  std::shared_ptr<const rvsdg::Type> ValueType_;
192  std::shared_ptr<const rvsdg::Type> ImportedType_;
196  size_t alignment_;
197 };
198 
203 {
204 public:
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 
223  LlvmRvsdgModule(const LlvmRvsdgModule &) = delete;
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 
263 private:
264  std::string DataLayout_;
265  std::string TargetTriple_;
266 };
267 
268 }
269 
270 #endif
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)
const std::shared_ptr< const jlm::rvsdg::Type > & ImportedType() const noexcept
Definition: RvsdgModule.hpp:94
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)
Definition: RvsdgModule.hpp:24
const std::shared_ptr< const jlm::rvsdg::Type > & ValueType() const noexcept
Definition: RvsdgModule.hpp:80
bool isConstant() const noexcept
Definition: RvsdgModule.hpp:67
static LlvmGraphImport & createFunctionImport(rvsdg::Graph &graph, std::shared_ptr< const rvsdg::FunctionType > functionType, std::string name, Linkage linkage, CallingConvention callingConvention)
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
Definition: RvsdgModule.hpp:50
const CallingConvention & callingConvention() const noexcept
Definition: RvsdgModule.hpp:61
std::shared_ptr< const rvsdg::Type > ImportedType_
size_t getAlignment() const noexcept
Definition: RvsdgModule.hpp:44
LlvmGraphImport & Copy(rvsdg::Region &region, rvsdg::StructuralInput *input) const override
Definition: RvsdgModule.cpp:13
const util::FilePath & SourceFileName() const noexcept
const std::string & TargetTriple() const noexcept
~LlvmRvsdgModule() noexcept override=default
LlvmRvsdgModule & operator=(const LlvmRvsdgModule &)=delete
static std::unique_ptr< LlvmRvsdgModule > Create(const util::FilePath &sourceFileName, const std::string &targetTriple, const std::string &dataLayout)
LlvmRvsdgModule(LlvmRvsdgModule &&)=delete
LlvmRvsdgModule & operator=(LlvmRvsdgModule &&)=delete
LlvmRvsdgModule(const LlvmRvsdgModule &)=delete
std::unique_ptr< RvsdgModule > copy() const override
Definition: RvsdgModule.cpp:31
const std::string & DataLayout() const noexcept
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:176
const std::optional< util::FilePath > & SourceFilePath() const noexcept
Definition: RvsdgModule.hpp:73
Global memory state passed between functions.