Bug 15717 - [3.4/4.0 Regression] Error: can't resolve `L0' {*ABS* section} - `xx' {*UND* section}
Summary: [3.4/4.0 Regression] Error: can't resolve `L0' {*ABS* section} - `xx' {*UND* ...
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: rtl-optimization (show other bugs)
Version: 4.0.0
: P2 normal
Target Milestone: 3.4.1
Assignee: Not yet assigned to anyone
URL:
Keywords: patch, wrong-code
Depends on:
Blocks:
 
Reported: 2004-05-28 21:02 UTC by Zdenek Dvorak
Modified: 2004-10-30 21:11 UTC (History)
1 user (show)

See Also:
Host: i686-pc-linux-gnu
Target: i686-pc-linux-gnu
Build:
Known to work: 3.3.3
Known to fail: 3.4.0 4.0.0
Last reconfirmed: 2004-05-28 21:34:50


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Zdenek Dvorak 2004-05-28 21:02:22 UTC
The following testcase

struct x
{
  int a[100];
  int b[100];
};

extern struct x xx;

void xxx(void)
{
  unsigned long a = (unsigned long) &xx.b[0];

  printf ("%ld", -a);
}

Fails to compile with

/xgcc -B. -O1 -c yyy.c
/tmp/ccBFXfe3.s: Assembler messages:
/tmp/ccBFXfe3.s:13: Error: can't resolve `L0' {*ABS* section} - `xx' {*UND* section}

The problem is that cse produces the following rtl:

(const:SI (minus:SI (const_int -400 [0xfffffe70])
                (symbol_ref:SI ("xx") [flags 0x40] <var_decl 0x402ec000 xx>)))

Which translates to assembler like

movl    $-400-xx, 4(%esp)

Which as does not like.
Comment 1 Andrew Pinski 2004-05-28 21:34:49 UTC
I do not know if this is really a bug at all because it is really undefined.
Note with an earlier version of as I get:
temp.s: Assembler messages:
temp.s:12: Error: negative of non-absolute symbol `xx'

The only thing we can do I can think of is reject (minus xxx Symbol_Ref) as a valid constant.

I should note that i686-darwin's as also rejects it (it is a much older GNU as).
Comment 2 Zdenek Dvorak 2004-05-29 07:47:09 UTC
Subject: Re:  [3.4/3.5 Regression] Error: can't resolve `L0' {*ABS* section} - `xx' {*UND* section}

> 
> ------- Additional Comments From pinskia at gcc dot gnu dot org  2004-05-28 21:34 -------
> I do not know if this is really a bug at all because it is really undefined.

I believe it is defined:

"Any pointer type may be converted to an  integer  type;
the  result is implementation-defined" (c99 standard draft)

Or is there something else you have objections against?

Zdenek

> Note with an earlier version of as I get:
> temp.s: Assembler messages:
> temp.s:12: Error: negative of non-absolute symbol `xx'
> 
> The only thing we can do I can think of is reject (minus xxx Symbol_Ref) as a valid constant.
> 
> I should note that i686-darwin's as also rejects it (it is a much older GNU as).
> 
> -- 
>            What    |Removed                     |Added
> ----------------------------------------------------------------------------
>              Status|UNCONFIRMED                 |NEW
>      Ever Confirmed|                            |1
>            Keywords|                            |wrong-code
>       Known to fail|                            |3.4.0 3.5.0
>       Known to work|                            |3.3.3
>    Last reconfirmed|0000-00-00 00:00:00         |2004-05-28 21:34:50
>                date|                            |
>             Summary|Error: can't resolve `L0'   |[3.4/3.5 Regression] Error:
>                    |{*ABS* section} - `xx'      |can't resolve `L0' {*ABS*
>                    |{*UND* section}             |section} - `xx' {*UND*
>                    |                            |section}
>    Target Milestone|---                         |3.4.1
> 
> 
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15717
> 
> ------- You are receiving this mail because: -------
> You reported the bug, or are watching the reporter.
Comment 3 Zdenek Dvorak 2004-05-30 11:35:59 UTC
Patch:

http://gcc.gnu.org/ml/gcc-patches/2004-05/msg01980.html
Comment 4 Mark Mitchell 2004-05-31 22:17:42 UTC
This patch is OK for 3.4.1, assuming it passes the regression tests; please
apply it to 3.4.1 and mainline.
Comment 5 GCC Commits 2004-06-08 13:26:15 UTC
Subject: Bug 15717

CVSROOT:	/cvs/gcc
Module name:	gcc
Changes by:	rakdver@gcc.gnu.org	2004-06-08 13:26:05

Modified files:
	gcc            : ChangeLog 
	gcc/config/i386: i386.c 

Log message:
	PR rtl-optimization/15717
	* config/i386/i386.c (legitimate_constant_p): Do not allow
	x - symbol_ref.

Patches:
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&r1=2.3872&r2=2.3873
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/i386/i386.c.diff?cvsroot=gcc&r1=1.670&r2=1.671

Comment 6 GCC Commits 2004-06-08 15:19:32 UTC
Subject: Bug 15717

CVSROOT:	/cvs/gcc
Module name:	gcc
Branch: 	gcc-3_4-branch
Changes by:	rakdver@gcc.gnu.org	2004-06-08 15:19:17

Modified files:
	gcc            : ChangeLog 
	gcc/config/i386: i386.c 

Log message:
	PR rtl-optimization/15717
	* config/i386/i386.c (legitimate_constant_p): Do not allow
	x - symbol_ref.

Patches:
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=2.2326.2.479&r2=2.2326.2.480
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/i386/i386.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.635.2.11&r2=1.635.2.12

Comment 7 Andrew Pinski 2004-06-08 17:57:24 UTC
Fixed.