2015-01-30 Ed Schonberg <schonberg@adacore.com>
[official-gcc.git] / gcc / go / gofrontend / export.h
blobc010a14686c115f608c539a7488e29f2327aa751
1 // export.h -- Export declarations in Go frontend. -*- C++ -*-
3 // Copyright 2009 The Go Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file.
7 #ifndef GO_EXPORT_H
8 #define GO_EXPORT_H
10 #include "string-dump.h"
12 struct sha1_ctx;
13 class Gogo;
14 class Import_init;
15 class Bindings;
16 class Type;
17 class Package;
19 // Codes used for the builtin types. These are all negative to make
20 // them easily distinct from the codes assigned by Export::write_type.
21 // Note that these codes may not be changed! Changing them would
22 // break existing export data.
24 enum Builtin_code
26 BUILTIN_INT8 = -1,
27 BUILTIN_INT16 = -2,
28 BUILTIN_INT32 = -3,
29 BUILTIN_INT64 = -4,
30 BUILTIN_UINT8 = -5,
31 BUILTIN_UINT16 = -6,
32 BUILTIN_UINT32 = -7,
33 BUILTIN_UINT64 = -8,
34 BUILTIN_FLOAT32 = -9,
35 BUILTIN_FLOAT64 = -10,
36 BUILTIN_INT = -11,
37 BUILTIN_UINT = -12,
38 BUILTIN_UINTPTR = -13,
39 BUILTIN_BOOL = -15,
40 BUILTIN_STRING = -16,
41 BUILTIN_COMPLEX64 = -17,
42 BUILTIN_COMPLEX128 = -18,
43 BUILTIN_ERROR = -19,
44 BUILTIN_BYTE = -20,
45 BUILTIN_RUNE = -21,
47 SMALLEST_BUILTIN_CODE = -21
50 // This class manages exporting Go declarations. It handles the main
51 // loop of exporting. A pointer to this class is also passed to the
52 // various specific export implementations.
54 class Export : public String_dump
56 public:
57 // The Stream class is an interface used to output the exported
58 // information. The caller should instantiate a child of this
59 // class.
60 class Stream
62 public:
63 Stream();
64 virtual ~Stream();
66 // Write a string. Implements the String_dump interface.
67 void
68 write_string(const std::string& s)
69 { this->write_and_sum_bytes(s.data(), s.length()); }
71 // Write a nul terminated string. Implements the String_dump interface.
72 void
73 write_c_string(const char* s)
74 { this->write_and_sum_bytes(s, strlen(s)); }
76 // Write some bytes.
77 void
78 write_bytes(const char* bytes, size_t length)
79 { this->write_and_sum_bytes(bytes, length); }
81 // Return the raw bytes of the checksum data.
82 std::string
83 checksum();
85 // Write a checksum string to the stream. This will be called at
86 // the end of the other output.
87 void
88 write_checksum(const std::string&);
90 protected:
91 // This function is called with data to export. This data must be
92 // made available as a contiguous stream for the importer.
93 virtual void
94 do_write(const char* bytes, size_t length) = 0;
96 private:
97 void
98 write_and_sum_bytes(const char*, size_t);
100 // The checksum.
101 sha1_ctx* checksum_;
104 Export(Stream*);
106 // The magic code for version 1 export data.
107 static const int v1_magic_len = 4;
108 static const char v1_magic[v1_magic_len];
110 // The length of the v1 checksum string.
111 static const int v1_checksum_len = 20;
113 // Register the builtin types.
114 void
115 register_builtin_types(Gogo*);
117 // Export the identifiers in BINDINGS which are marked for export.
118 // The exporting is done via a series of calls to THIS->STREAM_. If
119 // is nothing to export, this->stream_->write will not be called.
120 // PREFIX is the package prefix. PKGPATH is the package path.
121 // Only one of PREFIX and PKGPATH will be non-empty.
122 // PACKAGE_PRIORITY is the priority to use for this package.
123 // IMPORTS is the explicitly imported packages.
124 // IMPORT_INIT_FN is the name of the import initialization function
125 // for this package; it will be empty if none is needed.
126 // IMPORTED_INIT_FNS is the list of initialization functions for
127 // imported packages.
128 void
129 export_globals(const std::string& package_name,
130 const std::string& prefix,
131 const std::string& pkgpath,
132 int package_priority,
133 const std::map<std::string, Package*>& imports,
134 const std::string& import_init_fn,
135 const std::set<Import_init>& imported_init_fns,
136 const Bindings* bindings);
138 // Write a string to the export stream.
139 void
140 write_string(const std::string& s)
141 { this->stream_->write_string(s); }
143 // Write a nul terminated string to the export stream.
144 void
145 write_c_string(const char* s)
146 { this->stream_->write_c_string(s); }
148 // Write some bytes to the export stream.
149 void
150 write_bytes(const char* bytes, size_t length)
151 { this->stream_->write_bytes(bytes, length); }
153 // Write a name to the export stream. If NAME is empty, write "?".
154 void
155 write_name(const std::string& name);
157 // Write out a type. This handles references back to previous
158 // definitions.
159 void
160 write_type(const Type*);
162 private:
163 Export(const Export&);
164 Export& operator=(const Export&);
166 // Write out the imported packages.
167 void
168 write_imports(const std::map<std::string, Package*>& imports);
170 // Write out the imported initialization functions.
171 void
172 write_imported_init_fns(const std::string& package_name, int priority,
173 const std::string&, const std::set<Import_init>&);
175 // Register one builtin type.
176 void
177 register_builtin_type(Gogo*, const char* name, Builtin_code);
179 // Mapping from Type objects to a constant index.
180 typedef Unordered_map(const Type*, int) Type_refs;
182 // The stream to which we are writing data.
183 Stream* stream_;
184 // Type mappings.
185 Type_refs type_refs_;
186 // Index number of next type.
187 int type_index_;
188 // Packages we have written out.
189 Unordered_set(const Package*) packages_;
192 // An export streamer which puts the export stream in a named section.
194 class Stream_to_section : public Export::Stream
196 public:
197 Stream_to_section();
199 protected:
200 void
201 do_write(const char*, size_t);
204 #endif // !defined(GO_EXPORT_H)