On Sep 5, 2005, at 6:39 PM, Richard Henderson wrote:

On Mon, Sep 05, 2005 at 02:27:54PM +0200, Andreas Krebbel wrote:
(insn 31 29 49 5 (set (mem/s/j:SI (plus:SI (reg/v/f:SI 47 [ env ])
                (const_int 4 [0x4])) [0 <variable>.ex+0 S4 A32])
        (mem/f:SI (plus:SI (plus:SI (reg:SI 55)
                    (reg:SI 56))
                (const_int 4092 [0xffc])) [0 S4 A32]))

Guh.

Actually it looks like the tree EH lowering is not marking something
right as we get one BBs.
The reduced testcase is:
extern "Java" {
  namespace java   {
    namespace lang     {
      class Class;
      class Throwable;
    }
  }
}
typedef class java::lang::Class* jclass;
typedef class java::lang::Throwable* jthrowable;
typedef struct _Jv_JNIEnv JNIEnv;
struct _Jv_JNIEnv {
  jthrowable ex;
};
class java::lang::Throwable {

  static ::java::lang::Class class$;
};
void f(void);
void g (JNIEnv *env)
{
  try     {
    f();
  }
  catch (jthrowable t)     {
    env->ex = t;
  }
}

but we only get one BB containing the env->ex = t:
<L0>:;
  D.1724 = (struct Throwable * *) <<<exception object>>>;
  env->ex = *(D.1724 - 4B);

Which is just wrong.

-- Pinski

Reply via email to