Bug 24938 - gcj -C miscompiles gnu/CORBA/DynAn/gnuDynValue.java
Summary: gcj -C miscompiles gnu/CORBA/DynAn/gnuDynValue.java
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: java (show other bugs)
Version: 4.1.0
: P3 normal
Target Milestone: 4.3.0
Assignee: Tom Tromey
URL:
Keywords: wrong-code
: 24184 (view as bug list)
Depends on: 28067
Blocks:
  Show dependency treegraph
 
Reported: 2005-11-18 23:18 UTC by Mark Wielaard
Modified: 2007-01-09 20:48 UTC (History)
3 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2006-12-06 17:39:53


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Mark Wielaard 2005-11-18 23:18:39 UTC
There are two pieces of code in gnuDynValue that generate unverifiable (and wrong!) code.

The following method in this file:

  public int component_count()
  {
    return isNull ? 0 : super.component_count();
  }

Generates the following byte code:

Method name:"component_count" public Signature: ()int
Attribute "Code", length:38, max_stack:2, max_locals:1, code_length:14
  0: aload_0
  1: getfield <Field gnu.CORBA.DynAn.gnuDynValue.isNull boolean>
  4: ifeq 9
  7: iconst_0
  8: ireturn
  9: aload_0
 10: invokespecial <InterfaceMethod org.omg.DynamicAny.DynAny.component_count ()int>
 13: ireturn
Attribute "LineNumberTable", length:6, count: 1
  line: 369 at pc: 0

PC 10 is wrong. And the verifier actually catches that:

gnu/CORBA/DynAn/gnuDynValue.java: In class 'gnu.CORBA.DynAn.gnuDynValue':
gnu/CORBA/DynAn/gnuDynValue.java: In method 'gnu.CORBA.DynAn.gnuDynValue.component_count()':
gnu/CORBA/DynAn/gnuDynValue.java:369: error: verification failed at PC=10: didn't see expected constant

Another method in this file that exhibits this is:

  public boolean equal(DynAny other)
  {
    if (other instanceof DynValueOperations)
      {
        DynValueCommon o = (DynValueCommon) other;
        if (isNull)
          return o.is_null() && o.type().equal(official_type);
        else
          return !o.is_null() && super.equal(other);
      }
    else
      return false;
  }

That last super.equal() call generates the same wrong code.

This might be an existing bug, but I couldn't quickly find it.
I have a workaround for this issue that I want to get in before reducing this.
Comment 1 Andrew Pinski 2005-11-18 23:51:59 UTC
*** Bug 24184 has been marked as a duplicate of this bug. ***
Comment 2 Andrew Pinski 2005-11-18 23:52:34 UTC
By the way it was PR 24184 which I closed as a dup of this one since this has more information.
Comment 3 Mark Wielaard 2005-11-25 21:16:27 UTC
http://gcc.gnu.org/ml/java-patches/2005-q4/msg00218.html
contains a workaround for this issue.

The override files can be removed when this bug is closed.
Comment 4 Mark Wielaard 2005-11-25 22:31:00 UTC
Subject: Bug 24938

Author: mark
Date: Fri Nov 25 22:30:53 2005
New Revision: 107522

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=107522
Log:
       * standard.omit.in: Remove javax/rmi, org/omg, gnu/CORBA and
       gnu/javax/rmi.
       * scripts/makemake.tcl: Set javax/rmi, org/omg, gnu/CORBA and
       gnu/javax/rmi to bc.
       * gnu/CORBA/ObjectCreator.java: New override file for missing
       VMStackWalker issue.
       * gnu/CORBA/DynAn/gnuDynValue.java: New override file for bug #24938
       * gnu/CORBA/DynAn/RecordAny.java: Likewise
       * sources.am: Regenerated.
       * Makefile.in: Regenerated

Added:
    trunk/libjava/gnu/CORBA/
    trunk/libjava/gnu/CORBA/DynAn/
    trunk/libjava/gnu/CORBA/DynAn/RecordAny.java
    trunk/libjava/gnu/CORBA/DynAn/gnuDynValue.java
    trunk/libjava/gnu/CORBA/ObjectCreator.java
Modified:
    trunk/libjava/ChangeLog
    trunk/libjava/Makefile.in
    trunk/libjava/scripts/makemake.tcl
    trunk/libjava/sources.am
    trunk/libjava/standard.omit.in

Comment 5 Mark Wielaard 2005-11-26 00:48:37 UTC
Subject: Bug 24938

Author: mark
Date: Sat Nov 26 00:48:29 2005
New Revision: 107534

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=107534
Log:
       * standard.omit.in: Remove javax/rmi, org/omg, gnu/CORBA and
       gnu/javax/rmi.
       * scripts/makemake.tcl: Set javax/rmi, org/omg, gnu/CORBA and
       gnu/javax/rmi to bc.
       * gnu/CORBA/ObjectCreator.java: New override file for missing
       VMStackWalker issue.
       * gnu/CORBA/DynAn/gnuDynValue.java: New override file for bug #24938
       * gnu/CORBA/DynAn/RecordAny.java: Likewise
       * sources.am: Regenerated.
       * Makefile.in: Regenerated

Added:
    branches/gcc-4_1-branch/libjava/gnu/CORBA/
      - copied from r107522, trunk/libjava/gnu/CORBA/
Modified:
    branches/gcc-4_1-branch/libjava/ChangeLog
    branches/gcc-4_1-branch/libjava/Makefile.in
    branches/gcc-4_1-branch/libjava/scripts/makemake.tcl
    branches/gcc-4_1-branch/libjava/sources.am
    branches/gcc-4_1-branch/libjava/standard.omit.in

Comment 6 Tom Tromey 2006-12-06 19:35:31 UTC
Subject: Bug 24938

Author: tromey
Date: Wed Dec  6 19:35:05 2006
New Revision: 119593

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=119593
Log:
	PR java/24938:
	* sources.am, Makefile.in: Rebuilt.
	* gnu/CORBA/DynAn/gnuDynValue.java: Removed.
	* gnu/CORBA/DynAn/RecordAny.java: Removed.
	* gnu/CORBA/DynAn/RecordAny.h: Rebuilt.

Removed:
    branches/gcj/gcj-eclipse-merge-branch/libjava/gnu/CORBA/DynAn/RecordAny.java
    branches/gcj/gcj-eclipse-merge-branch/libjava/gnu/CORBA/DynAn/gnuDynValue.java
Modified:
    branches/gcj/gcj-eclipse-merge-branch/libjava/ChangeLog
    branches/gcj/gcj-eclipse-merge-branch/libjava/Makefile.in
    branches/gcj/gcj-eclipse-merge-branch/libjava/gnu/CORBA/DynAn/RecordAny.h
    branches/gcj/gcj-eclipse-merge-branch/libjava/sources.am

Comment 7 gary@gcc.gnu.org 2006-12-07 12:31:15 UTC
Subject: Bug 24938

Author: gary
Date: Thu Dec  7 12:30:56 2006
New Revision: 119617

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=119617
Log:
2006-12-06  Tom Tromey  <tromey@redhat.com>

	PR java/24938:
	* sources.am, Makefile.in: Rebuilt.
	* gnu/CORBA/DynAn/gnuDynValue.java: Removed.
	* gnu/CORBA/DynAn/RecordAny.java: Removed.
	* gnu/CORBA/DynAn/RecordAny.h: Rebuilt.


Modified:
    branches/gcj/gcj-eclipse-merge-branch/libjava/classpath/lib/gnu/CORBA/DynAn/RecordAny.class
    branches/gcj/gcj-eclipse-merge-branch/libjava/classpath/lib/gnu/CORBA/DynAn/gnuDynValue.class

Comment 8 Tom Tromey 2007-01-09 20:48:14 UTC
All gcj front end bugs have been fixed by the gcj-eclipse branch merge.
I'm mass-closing the affected PRs.
If you believe one of these was closed in error, please reopen it
with a note explaining why.
Thanks.