diff mbox

Go patch committed: Fixes for m68k

Message ID CAOyqgcUkKYNvfgDkyKtKHcr3QOMjk=PmrtNR90nTo2Gx9YHgQg@mail.gmail.com
State New
Headers show

Commit Message

Ian Lance Taylor Jan. 23, 2017, 6:15 p.m. UTC
I committed a patch to the Go frontend and libgo to fix alignment
issues on m68k.  This fixes PR 79037.  Bootstrapped and ran Go tests
on x86_64-pc-linux-gnu.  Tested by John Paul Adrian Glaubitz on
m68k-linux-gnu.  Committed to mainline.

Ian
diff mbox

Patch

Index: gcc/go/gofrontend/MERGE
===================================================================
--- gcc/go/gofrontend/MERGE	(revision 244823)
+++ gcc/go/gofrontend/MERGE	(working copy)
@@ -1,4 +1,4 @@ 
-6d8ef03e760ff737ff2c613642142290b0f02e0e
+0655e25d8e4acfac50c6b1422dc32eca3e30803a
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
Index: gcc/go/gofrontend/types.cc
===================================================================
--- gcc/go/gofrontend/types.cc	(revision 244460)
+++ gcc/go/gofrontend/types.cc	(working copy)
@@ -2468,13 +2468,28 @@  Type::make_gc_symbol_var(Gogo* gogo)
       is_common = true;
     }
 
+  // The current garbage collector requires that the GC symbol be
+  // aligned to at least a four byte boundary.  See the use of PRECISE
+  // and LOOP in libgo/runtime/mgc0.c.
+  int64_t align;
+  if (!sym_init->type()->backend_type_align(gogo, &align))
+    go_assert(saw_errors());
+  if (align < 4)
+    align = 4;
+  else
+    {
+      // Use default alignment.
+      align = 0;
+    }
+
   // Since we are building the GC symbol in this package, we must create the
   // variable before converting the initializer to its backend representation
   // because the initializer may refer to the GC symbol for this type.
   std::string asm_name(go_selectively_encode_id(sym_name));
   this->gc_symbol_var_ =
       gogo->backend()->implicit_variable(sym_name, asm_name,
-                                         sym_btype, false, true, is_common, 0);
+					 sym_btype, false, true, is_common,
+					 align);
   if (phash != NULL)
     *phash = this->gc_symbol_var_;
 
Index: libgo/runtime/go-unsafe-pointer.c
===================================================================
--- libgo/runtime/go-unsafe-pointer.c	(revision 244256)
+++ libgo/runtime/go-unsafe-pointer.c	(working copy)
@@ -36,7 +36,8 @@  static const String reflection_string =
   sizeof REFLECTION - 1
 };
 
-const uintptr unsafe_Pointer_gc[] = {sizeof(void*), GC_APTR, 0, GC_END};
+const uintptr unsafe_Pointer_gc[] __attribute__((aligned(4))) =
+  {sizeof(void*), GC_APTR, 0, GC_END};
 
 extern const FuncVal runtime_pointerhash_descriptor
   __asm__ (GOSYM_PREFIX "runtime.pointerhash$descriptor");
Index: libgo/runtime/parfor.c
===================================================================
--- libgo/runtime/parfor.c	(revision 244456)
+++ libgo/runtime/parfor.c	(working copy)
@@ -11,7 +11,7 @@ 
 struct ParForThread
 {
 	// the thread's iteration space [32lsb, 32msb)
-	uint64 pos;
+	uint64 pos __attribute__((aligned(8)));
 	// stats
 	uint64 nsteal;
 	uint64 nstealcnt;
Index: libgo/runtime/runtime.h
===================================================================
--- libgo/runtime/runtime.h	(revision 244456)
+++ libgo/runtime/runtime.h	(working copy)
@@ -191,7 +191,7 @@  struct ParFor
 					// otherwise parfor may return while other threads are still working
 	ParForThread *thr;		// array of thread descriptors
 	// stats
-	uint64 nsteal;
+	uint64 nsteal __attribute__((aligned(8))); // force alignment for m68k
 	uint64 nstealcnt;
 	uint64 nprocyield;
 	uint64 nosyield;