Patrick Kelley 8fd444092b initial
2025-05-07 15:35:15 -04:00

43 lines
1.0 KiB
C++

// Copyright (c) 2020-now by the Zeek Project. See LICENSE for details.
#pragma once
#include <map>
#include <memory>
#include <optional>
#include <set>
#include <string>
#include <utility>
#include <vector>
#include <hilti/base/result.h>
#include <hilti/compiler/detail/codegen/codegen.h>
#include <hilti/compiler/detail/cxx/unit.h>
namespace hilti::detail::cxx {
/**
* HILTI's linker.
*
* It's not *really* a linker, it's a component that adds additional C++ code
* requires knowledge across all compilation units.
*/
class Linker {
public:
Linker(CodeGen* cg) : _codegen(cg) {}
void add(const linker::MetaData& md);
void finalize();
Result<std::shared_ptr<cxx::Unit>> linkerUnit(); // only after finalize and at least one module
private:
CodeGen* _codegen;
std::shared_ptr<cxx::Unit> _linker_unit;
std::set<std::pair<std::string, std::string>> _modules;
std::map<std::string, std::vector<cxx::linker::Join>> _joins;
std::set<cxx::declaration::Constant> _globals;
};
} // namespace hilti::detail::cxx