https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92030

            Bug ID: 92030
           Summary: Wrong asm code for aliases on MIPS.
           Product: gcc
           Version: 8.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: anikulin at dlink dot ru
  Target Milestone: ---

Created attachment 47006
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=47006&action=edit
preprocessed file for the tested source

GCC 8.2.0 and 5.5.0 were tried.

The bug was raised while building and running FRR software.
It appears on MIPS(el), whereas x86_64 and aarch are ok.
FRR uses a [may be] tricky way to define aliases in C code:
https://github.com/FRRouting/frr/blob/master/lib/memory.h#L148

The extracted, adapted and tested snippet looks like:

struct memtype {
        const char *name;
        struct memtype *next;
};

static struct memtype abc1 __attribute__((section(".data.mtypes"))) = {
        .name = "OSPF",
        .next = NULL,
};

extern struct memtype abc2[1];
__asm__(".equiv abc2, abc1\n"); //abc2 is an alias symbol for abc1

printf("@abc1 = %p, abc2 = %p, @abc2 = %p\n", &abc1, abc2, &abc2);

Getting values generates the following asm:

# for the format string ($4 ~ a0): GOT + LO:
lw      $2,%got($LC1)($28)
addiu   $4,$2,%lo($LC1)

# for abs1 (a1), GOT + LO:
lw      $2,%got(abc1)($28)
addiu   $5,$2,%lo(abc1)

# for abs2 and &abs2 (a2 and a3): GOT only(!) w/o LO:
lw      $7,%got(abc2)($28)
lw      $6,%got(abc2)($28)

so the live result is:
> @abc1 = 0x411010, abc2 = 0x410000, @abc2 = 0x410000
The alias'es address is not adjusted, it causes SIGSEGV.

Meanwhile the data were linked correctly:

00411010 d abc1
00411010 d abc2


The same snippet works fine on x86_64 printing equal values for all.
Also I tried gcc-5.5.0 for aarh64 and saw GOT+LO for all variables including
the alias symbol.
Looks like this is the MIPS-related issue.

ospf.i is attached

invoking: mipsel-dlink-linux-uclibc-cc -Os -fPIC -g -save-temps   -c -o ospf.o
ospf.c

gcc:
Using built-in specs.
COLLECT_GCC=/opt/toolchains/mipsel-gcc8/bin/mipsel-dlink-linux-uclibc-cc.br_real
COLLECT_LTO_WRAPPER=/opt/toolchains/mipsel-gcc8/bin/../libexec/gcc/mipsel-dlink-linux-uclibc/8.2.0/lto-wrapper
Target: mipsel-dlink-linux-uclibc
Configured with: ./configure --prefix=/home/sanya/repos/buildroot/output/host
--sysconfdir=/home/sanya/repos/buildroot/output/host/etc --enable-static
--target=mipsel-dlink-linux-uclibc
--with-sysroot=/home/sanya/repos/buildroot/output/host/mipsel-dlink-linux-uclibc/sysroot
--enable-__cxa_atexit --with-gnu-ld --disable-libssp --disable-multilib
--disable-decimal-float --with-gmp=/home/sanya/repos/buildroot/output/host
--with-mpc=/home/sanya/repos/buildroot/output/host
--with-mpfr=/home/sanya/repos/buildroot/output/host
--with-pkgversion='Buildroot 2019.02-git-00493-g3dd8dd8a31'
--with-bugurl=http://bugs.buildroot.net/ --disable-libquadmath --enable-tls
--enable-plugins --enable-lto --disable-libmudflap --enable-threads
--with-isl=/home/sanya/repos/buildroot/output/host --with-float=soft
--with-arch=mips32r2 --with-abi=32 --with-nan=legacy --enable-languages=c,c++
--with-build-time-tools=/home/sanya/repos/buildroot/output/host/mipsel-dlink-linux-uclibc/bin
--enable-shared --enable-libgomp
Thread model: posix
gcc version 8.2.0 (Buildroot 2019.02-git-00493-g3dd8dd8a31) 
COMPILER_PATH=/opt/toolchains/mipsel-gcc8/bin/../libexec/gcc/mipsel-dlink-linux-uclibc/8.2.0/:/opt/toolchains/mipsel-gcc8/bin/../libexec/gcc/:/opt/toolchains/mipsel-gcc8/bin/../lib/gcc/mipsel-dlink-linux-uclibc/8.2.0/../../../../mipsel-dlink-linux-uclibc/bin/
LIBRARY_PATH=/opt/toolchains/mipsel-gcc8/bin/../lib/gcc/mipsel-dlink-linux-uclibc/8.2.0/:/opt/toolchains/mipsel-gcc8/bin/../lib/gcc/:/opt/toolchains/mipsel-gcc8/bin/../lib/gcc/mipsel-dlink-linux-uclibc/8.2.0/../../../../mipsel-dlink-linux-uclibc/lib/:/opt/toolchains/mipsel-gcc8/mipsel-dlink-linux-uclibc/sysroot/lib/:/opt/toolchains/mipsel-gcc8/mipsel-dlink-linux-uclibc/sysroot/usr/lib/
COLLECT_GCC_OPTIONS='-fstack-protector' '-v' '-march=mips32r2' '-mabi=32'
'-msoft-float' '-mnan=legacy' '-mllsc' '-mips32r2' '-mno-shared' '-EL'

Reply via email to