From: Ian Lance Taylor Date: Tue, 12 Jul 2016 20:29:15 +0000 (+0000) Subject: escape: Add escape notes to export data. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=221b3e6c32a61f4491afc87ab5d926e1f6bcf464;p=gcc.git escape: Add escape notes to export data. Reviewed-on: https://go-review.googlesource.com/22375 From-SVN: r238266 --- diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index 49976238de9..7798423e833 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -c8fdad389ce6f439a02fb654d231053b47ff4e02 +5ea5c078829ae83bccb598772fff7c1a04e23e65 The first line of this file holds the git revision number of the last merge done from the gofrontend repository. diff --git a/gcc/go/gofrontend/export.cc b/gcc/go/gofrontend/export.cc index 5c0094d8795..e07246e7799 100644 --- a/gcc/go/gofrontend/export.cc +++ b/gcc/go/gofrontend/export.cc @@ -436,6 +436,21 @@ Export::write_type(const Type* type) this->type_refs_[type] = index; } +// Export escape note. + +void +Export::write_escape(std::string* note) +{ + if (note != NULL && *note != "esc:0x0") + { + this->write_c_string(" "); + char buf[50]; + go_assert(note->find("esc:") != std::string::npos); + snprintf(buf, sizeof buf, "<%s>", note->c_str()); + this->write_c_string(buf); + } +} + // Add the builtin types to the export table. void diff --git a/gcc/go/gofrontend/export.h b/gcc/go/gofrontend/export.h index 0526e9a3f6d..c3972d80232 100644 --- a/gcc/go/gofrontend/export.h +++ b/gcc/go/gofrontend/export.h @@ -161,6 +161,11 @@ class Export : public String_dump void write_type(const Type*); + // Write the escape note to the export stream. If NOTE is NULL, write + // nothing. + void + write_escape(std::string* note); + private: Export(const Export&); Export& operator=(const Export&); diff --git a/gcc/go/gofrontend/gogo.cc b/gcc/go/gofrontend/gogo.cc index e373d8b17b7..37760a75e6c 100644 --- a/gcc/go/gofrontend/gogo.cc +++ b/gcc/go/gofrontend/gogo.cc @@ -4794,6 +4794,7 @@ Function::export_func_with_type(Export* exp, const std::string& name, exp->write_c_string("("); const Typed_identifier* receiver = fntype->receiver(); exp->write_name(receiver->name()); + exp->write_escape(receiver->note()); exp->write_c_string(" "); exp->write_type(receiver->type()); exp->write_c_string(") "); @@ -4817,6 +4818,7 @@ Function::export_func_with_type(Export* exp, const std::string& name, else exp->write_c_string(", "); exp->write_name(p->name()); + exp->write_escape(p->note()); exp->write_c_string(" "); if (!is_varargs || p + 1 != parameters->end()) exp->write_type(p->type()); @@ -4850,6 +4852,7 @@ Function::export_func_with_type(Export* exp, const std::string& name, else exp->write_c_string(", "); exp->write_name(p->name()); + exp->write_escape(p->note()); exp->write_c_string(" "); exp->write_type(p->type()); } @@ -4875,9 +4878,11 @@ Function::import_func(Import* imp, std::string* pname, { imp->require_c_string("("); std::string name = imp->read_name(); + std::string escape_note = imp->read_escape(); imp->require_c_string(" "); Type* rtype = imp->read_type(); *preceiver = new Typed_identifier(name, rtype, imp->location()); + (*preceiver)->set_note(escape_note); imp->require_c_string(") "); } @@ -4894,6 +4899,7 @@ Function::import_func(Import* imp, std::string* pname, while (true) { std::string name = imp->read_name(); + std::string escape_note = imp->read_escape(); imp->require_c_string(" "); if (imp->match_c_string("...")) @@ -4905,8 +4911,9 @@ Function::import_func(Import* imp, std::string* pname, Type* ptype = imp->read_type(); if (*is_varargs) ptype = Type::make_array_type(ptype, NULL); - parameters->push_back(Typed_identifier(name, ptype, - imp->location())); + Typed_identifier t = Typed_identifier(name, ptype, imp->location()); + t.set_note(escape_note); + parameters->push_back(t); if (imp->peek_char() != ',') break; go_assert(!*is_varargs); @@ -4934,10 +4941,13 @@ Function::import_func(Import* imp, std::string* pname, while (true) { std::string name = imp->read_name(); + std::string note = imp->read_escape(); imp->require_c_string(" "); Type* rtype = imp->read_type(); - results->push_back(Typed_identifier(name, rtype, - imp->location())); + Typed_identifier t = Typed_identifier(name, rtype, + imp->location()); + t.set_note(note); + results->push_back(t); if (imp->peek_char() != ',') break; imp->require_c_string(", "); diff --git a/gcc/go/gofrontend/import.cc b/gcc/go/gofrontend/import.cc index 8a6dd786075..b90ea83d41a 100644 --- a/gcc/go/gofrontend/import.cc +++ b/gcc/go/gofrontend/import.cc @@ -762,6 +762,42 @@ Import::read_type() return type; } +// Read an escape note. + +std::string +Import::read_escape() +{ + if (this->match_c_string(" stream_; + this->require_c_string(" get_char(); + if (c != 'x' && !ISXDIGIT(c)) + break; + escape += c; + } + + if (c != '>') + { + error_at(this->location(), + "error in import data at %d: expect %< %> or %<>%>, got %c", + stream->pos(), c); + stream->set_saw_error(); + stream->advance(1); + escape = Escape_note::make_tag(Node::ESCAPE_UNKNOWN); + } + return escape; + } + else + return Escape_note::make_tag(Node::ESCAPE_UNKNOWN); +} + + // Register the builtin types. void diff --git a/gcc/go/gofrontend/import.h b/gcc/go/gofrontend/import.h index 2a9ac80e7e2..9dbdaf77b88 100644 --- a/gcc/go/gofrontend/import.h +++ b/gcc/go/gofrontend/import.h @@ -197,6 +197,10 @@ class Import Type* read_type(); + // Read an escape note. + std::string + read_escape(); + private: static Stream* try_package_in_directory(const std::string&, Location);