From: Ian Lance Taylor <iant@golang.org>
To: gcc-patches <gcc-patches@gcc.gnu.org>,
"gofrontend-dev@googlegroups.com"
<gofrontend-dev@googlegroups.com>
Subject: Go patch committed: add escape analysis notes to export data
Date: Tue, 12 Jul 2016 20:29:00 -0000 [thread overview]
Message-ID: <CAOyqgcV9ffTPWfiy0ehA64WkyStS8642xaRYRHq=YoWCqKycLQ@mail.gmail.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 285 bytes --]
This patch by Chris Manghane changes the Go frontend to add escape
analysis notes to the export data, and to read them in when importing
a package. Escape analysis is still not enabled by default.
Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu. Committed
to mainline.
Ian
[-- Attachment #2: patch.txt --]
[-- Type: text/plain, Size: 5848 bytes --]
Index: gcc/go/gofrontend/MERGE
===================================================================
--- gcc/go/gofrontend/MERGE (revision 238057)
+++ gcc/go/gofrontend/MERGE (working copy)
@@ -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: gcc/go/gofrontend/export.cc
===================================================================
--- gcc/go/gofrontend/export.cc (revision 236804)
+++ gcc/go/gofrontend/export.cc (working copy)
@@ -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: gcc/go/gofrontend/export.h
===================================================================
--- gcc/go/gofrontend/export.h (revision 236804)
+++ gcc/go/gofrontend/export.h (working copy)
@@ -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: gcc/go/gofrontend/gogo.cc
===================================================================
--- gcc/go/gofrontend/gogo.cc (revision 236804)
+++ gcc/go/gofrontend/gogo.cc (working copy)
@@ -4794,6 +4794,7 @@ Function::export_func_with_type(Export*
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*
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*
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::
{
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::
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::
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::
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: gcc/go/gofrontend/import.cc
===================================================================
--- gcc/go/gofrontend/import.cc (revision 236804)
+++ gcc/go/gofrontend/import.cc (working copy)
@@ -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: gcc/go/gofrontend/import.h
===================================================================
--- gcc/go/gofrontend/import.h (revision 236804)
+++ gcc/go/gofrontend/import.h (working copy)
@@ -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);
reply other threads:[~2016-07-12 20:29 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAOyqgcV9ffTPWfiy0ehA64WkyStS8642xaRYRHq=YoWCqKycLQ@mail.gmail.com' \
--to=iant@golang.org \
--cc=gcc-patches@gcc.gnu.org \
--cc=gofrontend-dev@googlegroups.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).