https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97594
--- Comment #3 from Kewen Lin <linkw at gcc dot gnu.org> ---
(In reply to Martin Liška from comment #2)
> (In reply to Martin Liška from comment #1)
> > Mine, I see a strange error:
> >
> > $ Program received signal SIGBUS, Bus error.
> > 0x00003fffb7ceddbc in __GI__IO_link_in () from /lib64/libc.so.6
> > Missing separate debuginfos, use: debuginfo-install
> > glibc-2.17-307.el7.1.ppc64le
> > (gdb) bt
> > #0 0x00003fffb7ceddbc in __GI__IO_link_in () from /lib64/libc.so.6
> > #1 0x00003fffb7cebe58 in _IO_new_file_init_internal () from
> > /lib64/libc.so.6
>
> All right, so the test-case overloads malloc and returns a memory that is a
> static buffer. For some reason, it leads to SEGBUS.
> Do Power people know what's causing that?
I was testing the patch for PR97705 and met this issue during regression
testing, happened to notice this PR and just realized this one is also a random
issue. (how lucky I am :-))
Checked the assembly insn causing the SEGBUS
0x00007ffff7cc6940 <+240>: beq 0x7ffff7cc6b30 <__GI__IO_link_in+736>
0x00007ffff7cc6944 <+244>: li r9,1
0x00007ffff7cc6948 <+248>: clrldi r10,r10,32
=> 0x00007ffff7cc694c <+252>: lwarx r8,0,r3
0x00007ffff7cc6950 <+256>: subf. r8,r10,r8
r3 0x100207e6 268568550
As Power ISA pointed out, the EA for lwarx must be a multiple of 4. "If it is
not, either the system alignment error handler is invoked or the results are
boundedly undefined."
So the code of function __GI__IO_link_in has already assumed the address there
would have one reasonable alignment.
By checking the manual of malloc/calloc, it says:
RETURN VALUE
The malloc() and calloc() functions return a pointer to the
allocated memory, which is suitably aligned for any built-in
type. On error, these functions return NULL. NULL may also be
returned by a successful call to malloc() with a size of zero,
or by a successful call to calloc() with nmemb or size equal to
zero.
I think the assumption there is reasonable, the addresses returned from
user-overloaded malloc/calloc should also take care of this alignment
requirement and adjust the return address respecting this.
The below small patch can get the case to pass.
$ diff ~/gcc/gcc-git/gcc/testsuite/gcc.dg/tree-prof/pr97461.c pr97461.c
20a21,26
> /* The malloc() and calloc() functions return a pointer to the allocated
> memory, which is suitably aligned for any built-in type. Use 16
> bytes here as the basic alignment requirement for user-defined malloc
> and calloc. See PR97594 for the details. */
> #define ROUND_UP_FOR_16B_ALIGNMENT(x) ((x + 15) & (-16))
>
23c29
< memory_p += size;
---
> memory_p += ROUND_UP_FOR_16B_ALIGNMENT (size);