summaryrefslogtreecommitdiff
path: root/system/gcc/341-gccgo-libucontext-stack.patch
diff options
context:
space:
mode:
Diffstat (limited to 'system/gcc/341-gccgo-libucontext-stack.patch')
-rw-r--r--system/gcc/341-gccgo-libucontext-stack.patch38
1 files changed, 31 insertions, 7 deletions
diff --git a/system/gcc/341-gccgo-libucontext-stack.patch b/system/gcc/341-gccgo-libucontext-stack.patch
index 2befc5d32..cc88bda5a 100644
--- a/system/gcc/341-gccgo-libucontext-stack.patch
+++ b/system/gcc/341-gccgo-libucontext-stack.patch
@@ -4,15 +4,39 @@ This causes the Go frontend to sometimes go below the stack.
On 32-bit Arm systems, this resulted in #832. It is likely, though not known,
that this could have caused other issues we've seen in gccgo as well.
---- gcc-8.5.0/libgo/runtime/go-callers.c.old 2021-05-14 03:42:11.000000000 -0500
-+++ gcc-8.5.0/libgo/runtime/go-callers.c 2022-12-25 01:46:15.834110528 -0600
-@@ -117,7 +117,8 @@
- Solaris (http://gcc.gnu.org/PR52583 comment #21). */
+Additionally, since we strip libgo.so, filename is always NULL. This caused
+the unwinder to continue through runtime_mstart which caused the same issue.
+--- gcc-8.5.0/libgo/runtime/go-callers.c.old 2023-01-01 17:56:27.302982459 -0600
++++ gcc-8.5.0/libgo/runtime/go-callers.c 2023-01-01 17:58:00.612903483 -0600
+@@ -165,26 +165,11 @@
if (function != NULL)
{
- if (__builtin_strcmp (function, "makecontext") == 0)
+ if (__builtin_strcmp (function, "makecontext") == 0
-+ || __builtin_strcmp (function, "libucontext_makecontext") == 0)
++ || __builtin_strcmp (function, "libucontext_makecontext") == 0
++ || __builtin_strcmp (function, "runtime_mstart") == 0
++ || __builtin_strcmp (function, "runtime.kickoff") == 0
++ || __builtin_strcmp (function, "runtime.main") == 0)
return 1;
- if (filename != NULL)
- {
+- if (filename != NULL)
+- {
+- const char *p;
+-
+- p = strrchr (filename, '/');
+- if (p == NULL)
+- p = filename;
+- if (__builtin_strcmp (p, "/proc.c") == 0)
+- {
+- if (__builtin_strcmp (function, "runtime_mstart") == 0)
+- return 1;
+- }
+- else if (__builtin_strcmp (p, "/proc.go") == 0)
+- {
+- if (__builtin_strcmp (function, "runtime.kickoff") == 0
+- || __builtin_strcmp (function, "runtime.main") == 0)
+- return 1;
+- }
+- }
+ }
+
+ return arg->index >= arg->max;