github.com/kidsbmilk/gofrontend_all@v0.0.0-20220701224323-6479d5976c5d/go/export.h (about) 1 // export.h -- Export declarations in Go frontend. -*- C++ -*- 2 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. 6 7 #ifndef GO_EXPORT_H 8 #define GO_EXPORT_H 9 10 #include "string-dump.h" 11 12 class Go_sha1_helper; 13 class Gogo; 14 class Named_object; 15 class Export_function_body; 16 class Import_init; 17 class Named_object; 18 class Bindings; 19 class Type; 20 class Package; 21 class Import_init_set; 22 class Backend; 23 class Temporary_statement; 24 class Unnamed_label; 25 struct Export_impl; 26 27 // Codes used for the builtin types. These are all negative to make 28 // them easily distinct from the codes assigned by Export::write_type. 29 // Note that these codes may not be changed! Changing them would 30 // break existing export data. 31 32 enum Builtin_code 33 { 34 BUILTIN_INT8 = -1, 35 BUILTIN_INT16 = -2, 36 BUILTIN_INT32 = -3, 37 BUILTIN_INT64 = -4, 38 BUILTIN_UINT8 = -5, 39 BUILTIN_UINT16 = -6, 40 BUILTIN_UINT32 = -7, 41 BUILTIN_UINT64 = -8, 42 BUILTIN_FLOAT32 = -9, 43 BUILTIN_FLOAT64 = -10, 44 BUILTIN_INT = -11, 45 BUILTIN_UINT = -12, 46 BUILTIN_UINTPTR = -13, 47 BUILTIN_BOOL = -15, 48 BUILTIN_STRING = -16, 49 BUILTIN_COMPLEX64 = -17, 50 BUILTIN_COMPLEX128 = -18, 51 BUILTIN_ERROR = -19, 52 BUILTIN_BYTE = -20, 53 BUILTIN_RUNE = -21, 54 55 SMALLEST_BUILTIN_CODE = -21 56 }; 57 58 // Export data version number. New export data is written with the 59 // "current" version, but there is support for reading files with 60 // older version export data (at least for now). 61 62 enum Export_data_version { 63 EXPORT_FORMAT_UNKNOWN = 0, 64 EXPORT_FORMAT_V1 = 1, 65 EXPORT_FORMAT_V2 = 2, 66 EXPORT_FORMAT_V3 = 3, 67 EXPORT_FORMAT_CURRENT = EXPORT_FORMAT_V3 68 }; 69 70 // This class manages exporting Go declarations. It handles the main 71 // loop of exporting. A pointer to this class is also passed to the 72 // various specific export implementations. 73 74 class Export : public String_dump 75 { 76 public: 77 // The Stream class is an interface used to output the exported 78 // information. The caller should instantiate a child of this 79 // class. 80 class Stream 81 { 82 public: 83 Stream(); 84 virtual ~Stream(); 85 86 // Write a string. Implements the String_dump interface. 87 void 88 write_string(const std::string& s) 89 { this->write_and_sum_bytes(s.data(), s.length()); } 90 91 // Write a nul terminated string. Implements the String_dump interface. 92 void 93 write_c_string(const char* s) 94 { this->write_and_sum_bytes(s, strlen(s)); } 95 96 // Write some bytes. 97 void 98 write_bytes(const char* bytes, size_t length) 99 { this->write_and_sum_bytes(bytes, length); } 100 101 // Return the raw bytes of the checksum data. 102 std::string 103 checksum(); 104 105 // Write a checksum string to the stream. This will be called at 106 // the end of the other output. 107 void 108 write_checksum(const std::string&); 109 110 protected: 111 // This function is called with data to export. This data must be 112 // made available as a contiguous stream for the importer. 113 virtual void 114 do_write(const char* bytes, size_t length) = 0; 115 116 private: 117 void 118 write_and_sum_bytes(const char*, size_t); 119 120 // The checksum helper. 121 Go_sha1_helper* sha1_helper_; 122 }; 123 124 Export(Stream*); 125 ~Export(); 126 127 // Size of export data magic string (which includes version number). 128 static const int magic_len = 4; 129 130 // Magic strings (current version and older versions). 131 static const char cur_magic[magic_len]; 132 static const char v1_magic[magic_len]; 133 static const char v2_magic[magic_len]; 134 135 // The length of the checksum string. 136 static const int checksum_len = 20; 137 138 // Register the builtin types. 139 void 140 register_builtin_types(Gogo*); 141 142 // Export the identifiers in BINDINGS which are marked for export. 143 // The exporting is done via a series of calls to THIS->STREAM_. If 144 // is nothing to export, this->stream_->write will not be called. 145 // PREFIX is the package prefix. PKGPATH is the package path. 146 // Only one of PREFIX and PKGPATH will be non-empty. 147 // PACKAGES is all the packages we have seen. 148 // IMPORTS is the explicitly imported packages. 149 // IMPORT_INIT_FN is the name of the import initialization function 150 // for this package; it will be empty if none is needed. 151 // IMPORTED_INIT_FNS is the list of initialization functions for 152 // imported packages. 153 void 154 export_globals(const std::string& package_name, 155 const std::string& prefix, 156 const std::string& pkgpath, 157 const std::map<std::string, Package*>& packages, 158 const std::map<std::string, Package*>& imports, 159 const std::string& import_init_fn, 160 const Import_init_set& imported_init_fns, 161 const Bindings* bindings, 162 Unordered_set(Named_object*)* marked_inline_functions); 163 164 // Record a type that is mentioned in export data. Return value is 165 // TRUE for newly visited types, FALSE for types that have been seen 166 // previously. 167 bool 168 record_type(Type*); 169 170 // Assign type indices to types mentioned in export data. 171 int 172 assign_type_indices(const std::vector<Named_object*>& sorted_exports); 173 174 // Write a string to the export stream. 175 void 176 write_string(const std::string& s) 177 { this->stream_->write_string(s); } 178 179 // Write a nul terminated string to the export stream. 180 void 181 write_c_string(const char* s) 182 { this->stream_->write_c_string(s); } 183 184 // Write some bytes to the export stream. 185 void 186 write_bytes(const char* bytes, size_t length) 187 { this->stream_->write_bytes(bytes, length); } 188 189 // Write a name to the export stream. If NAME is empty, write "?". 190 void 191 write_name(const std::string& name); 192 193 // Write out a type. This handles references back to previous 194 // definitions. 195 void 196 write_type(const Type*); 197 198 // Write a type to an exported function body. 199 void 200 write_type_to(const Type*, Export_function_body*); 201 202 // Write the escape note to the export stream. If NOTE is NULL, write 203 // nothing. 204 void 205 write_escape(std::string* note); 206 207 // Write an integer value. 208 void 209 write_int(int); 210 211 // Write an unsigned value. 212 void 213 write_unsigned(unsigned); 214 215 // Return the index of a package. 216 int 217 package_index(const Package* p) const; 218 219 // Return the index of the "unsafe" package, which must be one of 220 // the exported packages. 221 int 222 unsafe_package_index() const; 223 224 private: 225 Export(const Export&); 226 Export& operator=(const Export&); 227 228 // Write out all known packages. 229 void 230 write_packages(const std::map<std::string, Package*>& packages); 231 232 typedef std::map<unsigned, std::set<unsigned> > Init_graph; 233 234 static void 235 add_init_graph_edge(Init_graph* init_graph, unsigned src, unsigned sink); 236 237 static void 238 populate_init_graph(Init_graph* init_graph, 239 const Import_init_set& imported_init_fns, 240 const std::map<std::string, unsigned>& init_idx); 241 242 // Write out the imported packages. 243 void 244 write_imports(const std::map<std::string, Package*>& imports, 245 const Unordered_set(const Package*)& type_imports); 246 247 // Write out the imported initialization functions and init graph. 248 void 249 write_imported_init_fns(const std::string& package_name, 250 const std::string&, const Import_init_set&); 251 252 // Write out all types. 253 void 254 write_types(int unexported_type_index); 255 256 // Write out one type definition. 257 void 258 write_type_definition(const Type* type, int index); 259 260 // Register one builtin type. 261 void 262 register_builtin_type(Gogo*, const char* name, Builtin_code); 263 264 // Return the index of a type in the export data. 265 int 266 type_index(const Type*); 267 268 // Set the index of a type. 269 void 270 set_type_index(const Type*); 271 272 // The stream to which we are writing data. 273 Stream* stream_; 274 // Index number of next type. 275 int type_index_; 276 // Packages we have written out. 277 Unordered_map(const Package*, int) packages_; 278 // Hidden implementation-specific state. 279 Export_impl* impl_; 280 }; 281 282 // An export streamer that puts the export stream in a named section. 283 284 class Stream_to_section : public Export::Stream 285 { 286 public: 287 Stream_to_section(Backend*); 288 289 protected: 290 void 291 do_write(const char*, size_t); 292 293 private: 294 Backend* backend_; 295 }; 296 297 // An export streamer that puts the export stream in a string. 298 299 class Stream_to_string : public Export::Stream 300 { 301 public: 302 Stream_to_string() 303 : string_() 304 {} 305 306 const std::string& 307 string() const 308 { return this->string_; } 309 310 protected: 311 void 312 do_write(const char* s, size_t len) 313 { this->string_.append(s, len); } 314 315 private: 316 std::string string_; 317 }; 318 319 // Class to manage exporting a function body. This is passed around 320 // to Statements and Expressions. It builds up the export data for 321 // the function. 322 323 class Export_function_body : public String_dump 324 { 325 public: 326 Export_function_body(Export* exp, int indent) 327 : exp_(exp), body_(), type_context_(NULL), next_temporary_index_(0), 328 temporary_indexes_(), next_label_index_(0), label_indexes_(), 329 indent_(indent) 330 { } 331 332 // Write a character to the body. 333 void 334 write_char(char c) 335 { this->body_.append(1, c); } 336 337 // Write a NUL terminated string to the body. 338 void 339 write_c_string(const char* str) 340 { this->body_.append(str); } 341 342 // Write a string to the body. 343 void 344 write_string(const std::string& str) 345 { this->body_.append(str); } 346 347 // Write a type reference to the body. 348 void 349 write_type(const Type* type) 350 { this->exp_->write_type_to(type, this); } 351 352 // Return the current type context. 353 Type* 354 type_context() const 355 { return this->type_context_; } 356 357 // Set the current type context. 358 void 359 set_type_context(Type* type) 360 { this->type_context_ = type; } 361 362 // Append as many spaces as the current indentation level. 363 void 364 indent() 365 { 366 for (int i = this->indent_; i > 0; i--) 367 this->write_char(' '); 368 } 369 370 // Increment the indentation level. 371 void 372 increment_indent() 373 { ++this->indent_; } 374 375 // Decrement the indentation level. 376 void 377 decrement_indent() 378 { --this->indent_; } 379 380 // Return the index of a package. 381 int 382 package_index(const Package* p) const 383 { return this->exp_->package_index(p); } 384 385 // Return the index of the "unsafe" package. 386 int 387 unsafe_package_index() const 388 { return this->exp_->unsafe_package_index(); } 389 390 // Record a temporary statement and return its index. 391 unsigned int 392 record_temporary(const Temporary_statement*); 393 394 // Return the index of a temporary statement. 395 unsigned int 396 temporary_index(const Temporary_statement*); 397 398 // Return the index of an unnamed label. If it doesn't already have 399 // an index, give it one. 400 unsigned int 401 unnamed_label_index(const Unnamed_label*); 402 403 // Return a reference to the completed body. 404 const std::string& 405 body() const 406 { return this->body_; } 407 408 private: 409 // The overall export data. 410 Export* exp_; 411 // The body we are building. 412 std::string body_; 413 // Current type context. Used to avoid duplicate type conversions. 414 Type* type_context_; 415 // Index to give to next temporary statement. 416 unsigned int next_temporary_index_; 417 // Map temporary statements to indexes. 418 Unordered_map(const Temporary_statement*, unsigned int) temporary_indexes_; 419 // Index to give to the next unnamed label. 420 unsigned int next_label_index_; 421 // Map unnamed labels to indexes. 422 Unordered_map(const Unnamed_label*, unsigned int) label_indexes_; 423 // Current indentation level: the number of spaces before each statement. 424 int indent_; 425 }; 426 427 #endif // !defined(GO_EXPORT_H)