[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#733975: gcc-4.8: -Os optimization bug (address of label)



Package: gcc-4.8
Version: 4.8.2-11
Severity: normal

Attached is a small C program.
It just takes the address of a label, and subtracts the address of the
function, to get the "size".

The problem is not directly related with that, though - the printf() output is
wrong.


When compiled with "-g -Wall" the output is as expected:

    $1 = 0x40
    Continuing.
    64

But with "-g -Wall -Os" I get

    $1 = 0x22
    Continuing.
    -317

so the information returned from the function is ok (gets smaller with -Os),
but the value used for printf() is wrong.



-- System Information:
Debian Release: jessie/sid
  APT prefers testing
  APT policy: (990, 'testing'), (500, 'unstable'), (500, 'stable'), (1,
'experimental')
Architecture: amd64 (x86_64)

Kernel: Linux 3.11-2-amd64 (SMP w/4 CPU cores)
Locale: LANG=de_AT.UTF-8, LC_CTYPE=de_AT.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages gcc-4.8 depends on:
ii  binutils        2.24-2
ii  cpp-4.8         4.8.2-11
ii  gcc-4.8-base    4.8.2-11
ii  libc6           2.17-97
ii  libcloog-isl4   0.18.1-3
ii  libgcc-4.8-dev  4.8.2-11
ii  libgmp10        2:5.1.3+dfsg-1
ii  libisl10        0.12.1-2
ii  libmpc3         1.0.1-1
ii  libmpfr4        3.1.2-1
ii  zlib1g          1:1.2.8.dfsg-1

Versions of packages gcc-4.8 recommends:
ii  libc6-dev  2.17-97

Versions of packages gcc-4.8 suggests:
ii  binutils [binutils-gold]  2.24-2
ii  gcc-4.8-doc               4.8.2-2
pn  gcc-4.8-locales           <none>
ii  gcc-4.8-multilib          4.8.2-11
pn  libasan0-dbg              <none>
pn  libatomic1-dbg            <none>
pn  libbacktrace1-dbg         <none>
pn  libgcc1-dbg               <none>
pn  libgomp1-dbg              <none>
pn  libitm1-dbg               <none>
pn  libquadmath0-dbg          <none>
pn  libtsan0-dbg              <none>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>


int f(int a)
{
	int i;

	if (!a)
		return (long)&&j - (long)f;

	for(i=0; i<100; i++)
		if (i * i < a)
			break;

j:
	return i;
}


int main(void)
{
	{
		char stg[256];
		sprintf(stg, "gdb -q -p %d -ex 'print f(0)' -ex c &", getpid());
		system(stg);
	}

	sleep(2);

	printf("%d\n", f(0));

	return f(1);
}

Reply to: