Spicy
unit.h
1 // Copyright (c) 2020-now by the Zeek Project. See LICENSE for details.
2 
3 #pragma once
4 
5 #include <unistd.h>
6 
7 #include <memory>
8 #include <set>
9 #include <string>
10 #include <utility>
11 #include <vector>
12 
13 #include <hilti/rt/filesystem.h>
14 
15 #include <hilti/ast/declarations/module.h>
16 #include <hilti/ast/id.h>
17 #include <hilti/base/logger.h>
18 #include <hilti/base/result.h>
19 #include <hilti/base/util.h>
20 #include <hilti/compiler/context.h>
21 #include <hilti/compiler/detail/cxx/unit.h>
22 #include <hilti/compiler/jit.h>
23 
24 namespace hilti {
25 
26 struct Plugin;
27 
28 namespace linker {
37 using MetaData = detail::cxx::linker::MetaData;
38 } // namespace linker
39 
47 class Unit {
48 public:
50  ~Unit();
51 
56  declaration::Module* module() const;
57 
59  const auto& uid() const { return _uid; }
60 
62  void setUID(const declaration::module::UID& uid) { _uid = uid; }
63 
70 
79  Result<Nothing> print(std::ostream& out) const;
80 
89  Result<Nothing> createPrototypes(std::ostream& out);
90 
97  Result<CxxCode> cxxCode() const;
98 
105  if ( _cxx_unit )
106  return _cxx_unit->linkerMetaData();
107 
108  return result::Error("no C++ code compiled");
109  }
110 
116  bool isCompiledHILTI() const;
117 
123  bool requiresCompilation();
124 
129  void setRequiresCompilation() { _requires_compilation = true; }
130 
132  std::shared_ptr<Context> context() const { return _context.lock(); }
133 
135  const Options& options() const { return context()->options(); }
136 
145  static Result<std::shared_ptr<Unit>> fromSource(const std::shared_ptr<Context>& context, Builder* builder,
146  const hilti::rt::filesystem::path& path);
147 
156  static Result<std::shared_ptr<Unit>> fromCXX(const std::shared_ptr<Context>& context,
157  std::shared_ptr<detail::cxx::Unit> cxx,
158  const hilti::rt::filesystem::path& path = "");
159 
160  // Must already be part of AST.
161  static std::shared_ptr<Unit> fromExistingUID(const std::shared_ptr<Context>& context, declaration::module::UID uid);
162 
163 
174  static Result<std::shared_ptr<Unit>> link(const std::shared_ptr<Context>& context,
175  const std::vector<linker::MetaData>& mds);
176 
177 private:
178  // Private constructor initializing the unit's meta data. Use the public
179  // `from*()` factory functions instead to instantiate a unit.
180  Unit(const std::shared_ptr<Context>& context, declaration::module::UID uid)
181  : _context(context), _uid(std::move(uid)) {}
182  Unit(const std::shared_ptr<Context>& context, declaration::module::UID uid,
183  std::shared_ptr<detail::cxx::Unit> cxx_unit)
184  : _context(context), _uid(std::move(uid)), _cxx_unit(std::move(cxx_unit)) {}
185 
186  Result<std::shared_ptr<detail::cxx::Unit>> _codegenModule(const declaration::module::UID& uid);
187 
188  std::weak_ptr<Context> _context; // global context
189  declaration::module::UID _uid; // module's globally unique ID
190  std::shared_ptr<detail::cxx::Unit> _cxx_unit; // compiled C++ code for this unit, once available
191  bool _requires_compilation = false; // mark explicitly as requiring compilation to C++
192 };
193 
194 } // namespace hilti
Definition: builder.h:36
Definition: unit.h:47
const Options & options() const
Definition: unit.h:135
declaration::Module * module() const
Definition: unit.cc:48
void setRequiresCompilation()
Definition: unit.h:129
std::shared_ptr< Context > context() const
Definition: unit.h:132
Result< CxxCode > cxxCode() const
Definition: unit.cc:107
const auto & uid() const
Definition: unit.h:59
Result< Nothing > print(std::ostream &out) const
Definition: unit.cc:58
static Result< std::shared_ptr< Unit > > link(const std::shared_ptr< Context > &context, const std::vector< linker::MetaData > &mds)
Definition: unit.cc:143
static Result< std::shared_ptr< Unit > > fromSource(const std::shared_ptr< Context > &context, Builder *builder, const hilti::rt::filesystem::path &path)
Definition: unit.cc:25
~Unit()
Definition: unit.cc:46
Result< Nothing > createPrototypes(std::ostream &out)
Definition: unit.cc:65
void setUID(const declaration::module::UID &uid)
Definition: unit.h:62
Result< linker::MetaData > linkerMetaData() const
Definition: unit.h:104
bool requiresCompilation()
Definition: unit.cc:120
static Result< std::shared_ptr< Unit > > fromCXX(const std::shared_ptr< Context > &context, std::shared_ptr< detail::cxx::Unit > cxx, const hilti::rt::filesystem::path &path="")
Definition: unit.cc:34
bool isCompiledHILTI() const
Definition: unit.cc:50
Result< Nothing > codegen()
Definition: unit.cc:88
Definition: module.h:29
Definition: result.h:71
Definition: result.h:18
Definition: context.h:33
Definition: module-uid.h:20