Line data Source code
1 : // Copyright (C) 2020-2026 Free Software Foundation, Inc.
2 :
3 : // This file is part of GCC.
4 :
5 : // GCC is free software; you can redistribute it and/or modify it under
6 : // the terms of the GNU General Public License as published by the Free
7 : // Software Foundation; either version 3, or (at your option) any later
8 : // version.
9 :
10 : // GCC is distributed in the hope that it will be useful, but WITHOUT ANY
11 : // WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 : // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 : // for more details.
14 :
15 : // You should have received a copy of the GNU General Public License
16 : // along with GCC; see the file COPYING3. If not see
17 : // <http://www.gnu.org/licenses/>.
18 :
19 : #ifndef RUST_EXPORT_METADATA_H
20 : #define RUST_EXPORT_METADATA_H
21 :
22 : #include "rust-system.h"
23 : #include "rust-hir-full-decls.h"
24 : #include "rust-hir-map.h"
25 :
26 : namespace Rust {
27 : namespace Metadata {
28 :
29 : static const char kMagicHeader[4] = {'G', 'R', 'S', 'T'};
30 : static const char kSzDelim[1] = {'$'};
31 :
32 : class ExportContext
33 : {
34 : public:
35 : ExportContext ();
36 :
37 : ~ExportContext ();
38 :
39 : void push_module_scope (const HIR::Module &module);
40 :
41 : const HIR::Module &pop_module_scope ();
42 :
43 : void emit_trait (const HIR::Trait &trait);
44 : void emit_function (const HIR::Function &fn);
45 :
46 : /**
47 : * Macros are a bit particular - they only live at the AST level, so we can
48 : * directly refer to them using their NodeId. There's no need to keep an HIR
49 : * node for them.
50 : */
51 : void emit_macro (AST::MacroRulesDefinition ¯o);
52 :
53 : const std::string &get_interface_buffer () const;
54 :
55 : private:
56 : Analysis::Mappings &mappings;
57 :
58 : std::vector<std::reference_wrapper<const HIR::Module>> module_stack;
59 : std::string public_interface_buffer;
60 : };
61 :
62 4028 : class PublicInterface
63 : {
64 : public:
65 : static void Export (HIR::Crate &crate);
66 :
67 : static void ExportTo (HIR::Crate &crate, const std::string &output_path);
68 :
69 : static bool is_crate_public (const HIR::VisItem &item);
70 :
71 : static std::string expected_metadata_filename ();
72 :
73 : protected:
74 : void gather_export_data ();
75 :
76 : void write_to_object_file () const;
77 :
78 : void write_to_path (const std::string &path) const;
79 :
80 : private:
81 : PublicInterface (HIR::Crate &crate);
82 :
83 : HIR::Crate &crate;
84 : Analysis::Mappings &mappings;
85 : ExportContext context;
86 : };
87 :
88 : } // namespace Metadata
89 : } // namespace Rust
90 :
91 : #endif // RUST_EXPORT_METADATA_H
|