From: Richard Henderson <rth@redhat.com>
To: gcc-patches@gcc.gnu.org
Cc: libffi-discuss@sourceware.org, gofrontend-dev@googlegroups.com
Subject: [PATCH 03/13] HACK! Allow the static chain to be set from C
Date: Fri, 10 Oct 2014 20:43:00 -0000 [thread overview]
Message-ID: <1412973773-3942-4-git-send-email-rth@redhat.com> (raw)
In-Reply-To: <1412973773-3942-1-git-send-email-rth@redhat.com>
This is awful syntax, and therefore contains no documentation.
But we'll need to be able to set the static chain on a few calls
within the Go runtime, so we need to expose this by some means.
It currently looks like
function(args...) __builtin_call_chain(pointer)
because that was easy to parse.
I've considered alternatives such as
__builtin_call_static_chain(function, pointer)(args...)
wherein the builtin returns function, and magically remembers
that a static chain should be applied.
Or
__builtin_call_go(function, pointer, args...)
which is a bit more specific.
Or
__builtin_call_go(descriptor, args...)
where descriptor must be a pointer to a structure type with a
function pointer field at offset zero. The builtin would automatically
perform the dereference, and apply the arguments to the function type
of that field. That seems way too overkill for exactly two uses within
libgo. We'd have to imagine the gccgo community writing all sorts of
C-to-Go style plugins and whatnot before that becomes worthwhile.
Other reasonable approaches solicited...
---
gcc/c-family/c-common.c | 1 +
gcc/c-family/c-common.h | 2 +-
gcc/c/c-parser.c | 29 +++++++++++++++++++++++++++++
gcc/testsuite/gcc.dg/static-chain.c | 31 +++++++++++++++++++++++++++++++
4 files changed, 62 insertions(+), 1 deletion(-)
create mode 100644 gcc/testsuite/gcc.dg/static-chain.c
diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
index e69d128..5d1bff7 100644
--- a/gcc/c-family/c-common.c
+++ b/gcc/c-family/c-common.c
@@ -442,6 +442,7 @@ const struct c_common_resword c_common_reswords[] =
{ "__attribute__", RID_ATTRIBUTE, 0 },
{ "__auto_type", RID_AUTO_TYPE, D_CONLY },
{ "__bases", RID_BASES, D_CXXONLY },
+ { "__builtin_call_chain", RID_BUILTIN_CALL_CHAIN, D_CONLY },
{ "__builtin_choose_expr", RID_CHOOSE_EXPR, D_CONLY },
{ "__builtin_complex", RID_BUILTIN_COMPLEX, D_CONLY },
{ "__builtin_shuffle", RID_BUILTIN_SHUFFLE, 0 },
diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h
index 1e3477f..6fe4748 100644
--- a/gcc/c-family/c-common.h
+++ b/gcc/c-family/c-common.h
@@ -102,7 +102,7 @@ enum rid
RID_EXTENSION, RID_IMAGPART, RID_REALPART, RID_LABEL, RID_CHOOSE_EXPR,
RID_TYPES_COMPATIBLE_P, RID_BUILTIN_COMPLEX, RID_BUILTIN_SHUFFLE,
RID_DFLOAT32, RID_DFLOAT64, RID_DFLOAT128,
- RID_FRACT, RID_ACCUM, RID_AUTO_TYPE,
+ RID_FRACT, RID_ACCUM, RID_AUTO_TYPE, RID_BUILTIN_CALL_CHAIN,
/* C11 */
RID_ALIGNAS, RID_GENERIC,
diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c
index 0d159fd..8ec6f48 100644
--- a/gcc/c/c-parser.c
+++ b/gcc/c/c-parser.c
@@ -7776,6 +7776,35 @@ c_parser_postfix_expression_after_primary (c_parser *parser,
release_tree_vector (origtypes);
}
arg_loc.release ();
+
+ if (c_parser_next_token_is_keyword (parser, RID_BUILTIN_CALL_CHAIN))
+ {
+ vec<c_expr_t, va_gc> *cexpr_list;
+ tree chain_value;
+
+ c_parser_consume_token (parser);
+ if (!c_parser_get_builtin_args (parser, "__builtin_call_chain",
+ &cexpr_list, true))
+ break;
+
+ if (vec_safe_length (cexpr_list) != 1)
+ {
+ error_at (expr_loc, "wrong number of arguments to "
+ "%<__builtin_call_chain%>");
+ break;
+ }
+ chain_value = (*cexpr_list)[0].value;
+ mark_exp_read (chain_value);
+
+ if (TREE_CODE (TREE_TYPE (chain_value)) != POINTER_TYPE)
+ {
+ error_at (expr_loc, "argument to %<__builtin_call_chain%> "
+ "must be pointer type");
+ break;
+ }
+
+ CALL_EXPR_STATIC_CHAIN (expr.value) = chain_value;
+ }
break;
case CPP_DOT:
/* Structure element reference. */
diff --git a/gcc/testsuite/gcc.dg/static-chain.c b/gcc/testsuite/gcc.dg/static-chain.c
new file mode 100644
index 0000000..ff99fdc
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/static-chain.c
@@ -0,0 +1,31 @@
+/* { dg-do run } */
+
+#if defined(__x86_64__)
+# define CHAIN "%r10"
+#elif defined(__i386__)
+# define CHAIN "%ecx"
+#elif defined(__aarch64__)
+# define CHAIN "x18"
+#endif
+
+#ifdef CHAIN
+void *__attribute__((noinline, noclone)) foo(void)
+{
+ register void *chain __asm__(CHAIN);
+ return chain;
+}
+
+void * (*ptr)(void) = foo;
+extern void abort(void);
+
+int main()
+{
+ char c;
+ void *x = ptr() __builtin_call_chain(&c);
+ if (x != &c)
+ abort();
+ return 0;
+}
+#else
+int main() { return 0; }
+#endif
--
1.9.3
next prev parent reply other threads:[~2014-10-10 20:43 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-10 20:43 [PATCH 00/13] Go closures, libffi, and the static chain Richard Henderson
2014-10-10 20:43 ` [PATCH 04/13] Use the static chain as the closure parameter from Go Richard Henderson
2014-10-10 20:43 ` [PATCH 11/13] libffi: Support go closures on aarch64 Richard Henderson
2014-10-10 20:43 ` [PATCH 05/13] libgo: Use the static chain for the closure Richard Henderson
2014-10-10 20:43 ` [PATCH 12/13] libffi: Rewrite i386 sysv Richard Henderson
2014-10-10 20:43 ` [PATCH 10/13] libffi: Rewrite aarch64 Richard Henderson
2014-10-10 20:43 ` [PATCH 13/13] libffi: Support go closures on i386 Richard Henderson
2014-10-10 20:43 ` Richard Henderson [this message]
2014-10-11 0:33 ` [PATCH 03/13] HACK! Allow the static chain to be set from C Ian Lance Taylor
[not found] ` <CAMn1gO7vJOcNi218p9m32de_rrnKBrUcGF-EKP3dJwaL+8BtUw@mail.gmail.com>
2014-10-11 1:42 ` [gofrontend-dev] " Peter Collingbourne
2014-10-11 4:24 ` Richard Henderson
2014-10-13 8:10 ` Richard Biener
2014-10-13 18:46 ` Peter Collingbourne
2014-10-14 18:44 ` [PATCH v2 03/13] " Richard Henderson
2014-10-10 20:43 ` [PATCH 06/13] libffi: Add entry points for interacting with Go Richard Henderson
2014-10-10 20:43 ` [PATCH 01/13] Make TARGET_STATIC_CHAIN allow a function type Richard Henderson
2014-10-10 20:43 ` [PATCH 09/13] libgo: Remove __go_get/set_closure Richard Henderson
2014-10-10 20:43 ` [PATCH 08/13] libgo: Use the new libffi interfaces for Go Richard Henderson
2014-10-10 20:43 ` [PATCH 02/13] Allow the front-end to create calls with a static chain Richard Henderson
2014-10-10 20:43 ` [PATCH 07/13] libffi: Support go closures on x86_64 Richard Henderson
2014-10-11 0:23 ` [PATCH 00/13] Go closures, libffi, and the static chain Ian Lance Taylor
2014-11-05 21:34 ` Lynn A. Boger
2014-11-06 6:59 ` Richard Henderson
2014-11-06 12:48 ` Alan Modra
2014-11-06 13:04 ` Richard Henderson
2014-11-06 17:45 ` [gofrontend-dev] " Ian Taylor
2014-11-07 7:39 ` Richard Henderson
2014-11-07 8:50 ` Jay
2014-11-07 16:06 ` Ian Taylor
2014-11-07 23:55 ` Alan Modra
2014-11-06 13:10 ` Lynn A. Boger
2014-11-06 13:17 ` Richard Henderson
2014-12-11 9:06 ` Dominik Vogt
2014-12-11 9:21 ` Alan Modra
2014-12-11 10:31 ` [gofrontend-dev] " Dominik Vogt
2014-12-11 12:25 ` Dominik Vogt
2014-12-11 19:56 ` Richard Henderson
2014-12-12 12:06 ` Dominik Vogt
2014-12-12 18:14 ` Richard Henderson
2014-12-15 9:42 ` Dominik Vogt
2014-12-15 20:11 ` Richard Henderson
2014-12-12 13:57 ` Dominik Vogt
2014-12-11 19:38 ` Richard Henderson
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=1412973773-3942-4-git-send-email-rth@redhat.com \
--to=rth@redhat.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=gofrontend-dev@googlegroups.com \
--cc=libffi-discuss@sourceware.org \
/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).