escape: Add escape notes to export data.
authorIan Lance Taylor <ian@gcc.gnu.org>
Tue, 12 Jul 2016 20:29:15 +0000 (20:29 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Tue, 12 Jul 2016 20:29:15 +0000 (20:29 +0000)
    Reviewed-on: https://go-review.googlesource.com/22375

From-SVN: r238266

gcc/go/gofrontend/MERGE
gcc/go/gofrontend/export.cc
gcc/go/gofrontend/export.h
gcc/go/gofrontend/gogo.cc
gcc/go/gofrontend/import.cc
gcc/go/gofrontend/import.h

index 49976238de94e109f208ef9af4a982f2fcb565fb..7798423e8332bd1f4123469ff485bad5de3c92bc 100644 (file)
@@ -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.
index 5c0094d8795a210e5d915f1850de25799fa40483..e07246e7799341ca661629e9028647a3ce99e68f 100644 (file)
@@ -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
index 0526e9a3f6defe86d4b8060b1f7f8e9374abf176..c3972d802321bcc04185d804be4d4b694cc6d1dc 100644 (file)
@@ -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&);
index e373d8b17b7e9cad0cbc72cbf10c724ebcbe158c..37760a75e6cde02417a7846a7a9168dd59cecfa8 100644 (file)
@@ -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(", ");
index 8a6dd78607541251894f6c711716331eaa6b0519..b90ea83d41a84c56e7df6b97d58e12233a57291f 100644 (file)
@@ -762,6 +762,42 @@ Import::read_type()
   return type;
 }
 
+// Read an escape note.
+
+std::string
+Import::read_escape()
+{
+  if (this->match_c_string(" <esc:"))
+    {
+      Stream* stream = this->stream_;
+      this->require_c_string(" <esc:");
+
+      std::string escape = "esc:";
+      int c;
+      while (true)
+       {
+         c = stream->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
index 2a9ac80e7e227fc74ff7660310bbe885412e0c11..9dbdaf77b8851562e706d8a55a0bb4de2fdbbb60 100644 (file)
@@ -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);