Commit b0147ac2 by Ian Lance Taylor

re PR go/79037 (gccgo: Binaries crash with parforsetup: pos is not aligned on m68k)

	PR go/79037
    compiler, runtime: align gc data for m68k
    
    The current GC requires that the gc data be aligned to at least a 4
    byte boundary, because it uses the lower two bits of the address for
    flags (see LOOP and PRECISE in runtime/mgc0.c).  As the gc data is
    stored as a [...]uintptr, that is normally always true.  However, on
    m68k, that only guarantees 2 byte alignment.  Fix it by forcing the
    alignment.
    
    The parfor code used by the current GC requires that the parfor data
    be aligned to at least an 8 byte boundary.  The code in parfor.c
    verifies this.  This is normally true, as the data uses uint64_t
    values, but, again, this must be enforced explicitly on m68k.
    
    Fixes GCC PR 79037.
    
    Reviewed-on: https://go-review.googlesource.com/35478

From-SVN: r244824
parent a0488df4
6d8ef03e760ff737ff2c613642142290b0f02e0e 0655e25d8e4acfac50c6b1422dc32eca3e30803a
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -2468,13 +2468,28 @@ Type::make_gc_symbol_var(Gogo* gogo) ...@@ -2468,13 +2468,28 @@ Type::make_gc_symbol_var(Gogo* gogo)
is_common = true; 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 // Since we are building the GC symbol in this package, we must create the
// variable before converting the initializer to its backend representation // variable before converting the initializer to its backend representation
// because the initializer may refer to the GC symbol for this type. // because the initializer may refer to the GC symbol for this type.
std::string asm_name(go_selectively_encode_id(sym_name)); std::string asm_name(go_selectively_encode_id(sym_name));
this->gc_symbol_var_ = this->gc_symbol_var_ =
gogo->backend()->implicit_variable(sym_name, asm_name, 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) if (phash != NULL)
*phash = this->gc_symbol_var_; *phash = this->gc_symbol_var_;
......
...@@ -36,7 +36,8 @@ static const String reflection_string = ...@@ -36,7 +36,8 @@ static const String reflection_string =
sizeof REFLECTION - 1 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 extern const FuncVal runtime_pointerhash_descriptor
__asm__ (GOSYM_PREFIX "runtime.pointerhash$descriptor"); __asm__ (GOSYM_PREFIX "runtime.pointerhash$descriptor");
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
struct ParForThread struct ParForThread
{ {
// the thread's iteration space [32lsb, 32msb) // the thread's iteration space [32lsb, 32msb)
uint64 pos; uint64 pos __attribute__((aligned(8)));
// stats // stats
uint64 nsteal; uint64 nsteal;
uint64 nstealcnt; uint64 nstealcnt;
......
...@@ -191,7 +191,7 @@ struct ParFor ...@@ -191,7 +191,7 @@ struct ParFor
// otherwise parfor may return while other threads are still working // otherwise parfor may return while other threads are still working
ParForThread *thr; // array of thread descriptors ParForThread *thr; // array of thread descriptors
// stats // stats
uint64 nsteal; uint64 nsteal __attribute__((aligned(8))); // force alignment for m68k
uint64 nstealcnt; uint64 nstealcnt;
uint64 nprocyield; uint64 nprocyield;
uint64 nosyield; uint64 nosyield;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment