<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Have you checked to make sure that the pre-gcc IR makes sense?  Does it see these values as 32-bit or 64-bit?  The reason I ask is that there may be something wrong in your m3middle target specs that cause bad IR.  Once we know the IR looks right then we can try and fix the problem.<div><br><div> <span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><div style="word-wrap: break-word; -khtml-nbsp-mode: space; -khtml-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><div><font class="Apple-style-span" color="#0000FF"><font class="Apple-style-span" face="Gill Sans"><span class="Apple-style-span" style="color: rgb(0, 0, 255); font-family: Gill Sans; "><span class="Apple-style-span" style="color: rgb(0, 0, 255); font-family: Gill Sans; ">Antony Hosking</span></span></font></font><font class="Apple-style-span" face="Gill Sans"><span class="Apple-style-span" style="font-family: Gill Sans; "><span class="Apple-style-span" style="font-family: Gill Sans; "> | </span></span><span class="Apple-style-span" style="font-family: Gill Sans; "><span class="Apple-style-span" style="font-family: Gill Sans; ">Associate Professor</span></span><span class="Apple-style-span" style="font-family: Gill Sans; "><span class="Apple-style-span" style="font-family: Gill Sans; "> | Computer Science | Purdue University</span></span></font></div><div><font class="Apple-style-span" face="GillSans-Light"><span class="Apple-style-span" style="font-family: GillSans-Light; ">305 N. University Street | West Lafayette | IN 47907 | USA</span></font></div><div><font class="Apple-style-span" color="#0000FF" face="Gill Sans"><span class="Apple-style-span" style="color: rgb(0, 0, 255); font-family: Gill Sans; "><span class="Apple-style-span" style="color: rgb(0, 0, 255); font-family: Gill Sans; ">Office</span></span></font><font class="Apple-style-span" face="GillSans-Light"><span class="Apple-style-span" style="font-family: GillSans-Light; "><span class="Apple-style-span" style="font-family: GillSans-Light; "> +1 765 494 6001 | </span></span></font><font class="Apple-style-span" color="#0000FF" face="Gill Sans"><span class="Apple-style-span" style="color: rgb(0, 0, 255); font-family: Gill Sans; "><span class="Apple-style-span" style="color: rgb(0, 0, 255); font-family: Gill Sans; ">Mobile</span></span></font><font class="Apple-style-span" face="GillSans-Light"><span class="Apple-style-span" style="font-family: GillSans-Light; "><span class="Apple-style-span" style="font-family: GillSans-Light; "> +1 765 427 5484</span></span></font></div><div><font class="Apple-style-span" face="GillSans-Light"><br class="khtml-block-placeholder"></font></div></span></span></span></span></span></span></span><br class="Apple-interchange-newline"></span></div></span> </div><br><div><div>On 8 Nov 2008, at 15:45, Jay wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div><br>truncated as usual...along with losing a lot of whitespace..<br>Let's see...<br><br><br>Tony, how about switching these #if's?<br>I explain some of why below.<br><br>static void<br>m3_store (tree v, int o, tree src_t, m3_type src_T, tree dst_t, m3_type dst_T)<br>{<br>  tree val;<br>#if 0<br>  if (o != 0 || TREE_TYPE (v) != dst_t) {<br>    v = m3_build3 (BIT_FIELD_REF, dst_t, v, TYPE_SIZE (dst_t),<br>     bitsize_int (o));<br>  }<br>#else<br>  /* failsafe, but inefficient */<br>  if (o != 0 || TREE_TYPE (v) != dst_t) {<br>    v = m3_build1 (ADDR_EXPR, t_addr, v);<br>    v = m3_build2 (PLUS_EXPR, t_addr, v, size_int (o / BITS_PER_UNIT));<br>    v = m3_build1 (INDIRECT_REF, dst_t,<br>     m3_cast (build_pointer_type (dst_t), v));<br>  }<br>#endif<br>  TREE_THIS_VOLATILE (v) = 1; /* force this to avoid aliasing problems */<br>  val = m3_cast (src_t, EXPR_REF (-1));<br>  if (src_T != dst_T) {<br>    val = m3_build1 (CONVERT_EXPR, dst_t, val);<br>  }<br>  add_stmt (build2 (MODIFY_EXPR, dst_t, v, val));<br>  EXPR_POP ();<br>}<br>m3_load (tree v, int o, tree src_t, m3_type src_T, tree dst_t, m3_type dst_T)<br>{<br>#if 0<br>  if (o != 0 || TREE_TYPE (v) != src_t) {<br>    v = m3_build3 (BIT_FIELD_REF, src_t, v, TYPE_SIZE (src_t),<br>     bitsize_int (o));<br>  }<br>#else<br>  /* failsafe, but inefficient */<br>  if (o != 0 || TREE_TYPE (v) != src_t) {<br>    v = m3_build1 (ADDR_EXPR, t_addr, v);<br>    v = m3_build2 (PLUS_EXPR, t_addr, v, size_int (o / BITS_PER_UNIT));<br>    v = m3_build1 (INDIRECT_REF, src_t,<br>     m3_cast (build_pointer_type (src_t), v));<br>  }<br>#endif<br>  TREE_THIS_VOLATILE (v) = 1; /* force this to avoid aliasing problems */<br>  if (src_T != dst_T) {<br>    v = m3_build1 (CONVERT_EXPR, dst_t, v);<br>  }<br>  EXPR_PUSH (v);<br>}<br><br>I'm working on MIPS64_OPENBSD (OpenBSD on an SGI O2).<br>In an early version it seems that many loads/stores of global variables is wrong.<br>The "first" code affected is RTLinker_ExpandModuleTable.<br><br>PROCEDURE ExpandModuleTable () =<br>  CONST InitialTableSize = 500;<br>  VAR new_mods: ADDRESS;  n_bytes: INTEGER;<br>  BEGIN<br>    IF (modules = NIL) THEN<br>      (* first time... *)<br>      max_modules := InitialTableSize;<br>      modules := Cstdlib.malloc (InitialTableSize * BYTESIZE (RT0.ModulePtr));<br>      IF (modules = NIL) THEN Cstdlib.abort (); END;<br>    ELSE<br>      n_bytes := max_modules * BYTESIZE (RT0.ModulePtr);<br>      new_mods := Cstdlib.malloc (n_bytes + n_bytes);<br>      IF (new_mods = NIL) THEN Cstdlib.abort (); END;<br>      EVAL Cstring.memcpy (new_mods, modules, n_bytes);<br>      Cstdlib.free (modules);<br>      modules := new_mods;<br>      INC (max_modules, max_modules);<br>    END;<br>  END ExpandModuleTable;<br><br>It should read back modules as NIL.<br>What happens is it reads back modules as not NIL,<br>and then max_modules should also be zero, but is "large", leading to malloc to fail,<br>and abort called.<br><br>The output of cm3cg -y is reasonable.<br>It indicates offset loads.<br><br>What is incorrect is that in many loads and stores, but not all, the<br>offsets are lost.<br><br>(923) begin_procedure<br>  procedure RTLinker__ExpandModuleTable<br> RTLinker__ExpandModuleTable(924) set_source_line<br>  source line  208<br>(925) load_nil<br>(926) store<br>  store (M3_AJWxb1_new_mods) offset 0x0 src_t 0xb dst_t 0xb<br>(927) set_source_line<br>  source line  207<br>(928) set_source_line<br>  source line  210<br>(929) load_nil<br>(930) load<br>  m3cg_load (MM_RTLinker): offset 0x440, convert 0xb -> 0xb<br><br>Here is the incorrect code:<br><br> .globl RTLinker__ExpandModuleTable<br> .stabd 46,0,0<br> .stabn 68,0,206,.LM108<br>.LM108:<br>.LFBB8:<br> .set nomips16<br> .ent RTLinker__ExpandModuleTable<br>RTLinker__ExpandModuleTable:<br> .frame $fp,64,$31  # vars= 32, regs= 3/0, args= 0, gp= 0<br> .mask 0xd0000000,-8<br> .fmask 0x00000000,0<br> daddiu $sp,$sp,-64<br> sd $31,56($sp)<br> sd $fp,48($sp)<br> sd $28,40($sp)<br> move $fp,$sp<br> lui $28,%hi(%neg(%gp_rel(RTLinker__ExpandModuleTable)))<br> daddu $28,$28,$25<br> daddiu $28,$28,%lo(%neg(%gp_rel(RTLinker__ExpandModuleTable)))<br>.LBB9:<br> .stabn 68,0,208,.LM109<br>.LM109:<br> sd $0,16($fp)<br> .stabn 68,0,210,.LM110<br>.LM110:<br> dla $2,MM_RTLinker<br> ld $2,0($2)      << WRONG<br> bne $2,$0,.L61<br> .stabn 68,0,212,.LM111<br>.LM111:<br> dla $3,MM_RTLinker<br> ld $2,128($3)<br> andi $2,$2,0x0<br> ori $2,$2,0x1f4<br> sd $2,128($3)<br> .stabn 68,0,213,.LM112<br>.LM112:<br> li $4,4000   # 0xfa0<br> jal malloc<br> sd $2,0($fp)<br> ld $4,0($fp)<br> dla $3,MM_RTLinker<br> ld $2,136($3)<br> andi $2,$2,0x0<br> or $2,$4,$2<br> sd $2,136($3)     << OK, offset seems low, but it agrees with elsewhere <br> .stabn 68,0,214,.LM113<br>.LM113:<br> dla $2,MM_RTLinker<br> ld $2,0($2)       << WRONG <br> bne $2,$0,.L65<br> jal abort<br> b .L65<br>.L61:<br> .stabn 68,0,216,.LM114<br>.LM114:<br> dla $2,MM_RTLinker<br> ld $2,0($2)        << WRONG <br> dsll $2,$2,3<br> sd $2,8($fp)<br> .stabn 68,0,217,.LM115<br>.LM115:<br> ld $3,8($fp)<br> ld $2,8($fp)<br> daddu $2,$3,$2<br> move $4,$2<br> jal malloc<br> sd $2,0($fp)<br> ld $2,0($fp)<br> sd $2,16($fp)<br> .stabn 68,0,218,.LM116<br>.LM116:<br> ld $2,16($fp)<br> bne $2,$0,.L64<br> jal abort<br>.L64:<br> .stabn 68,0,219,.LM117<br>.LM117:<br> ld $4,16($fp)<br> dla $2,MM_RTLinker<br> ld $2,0($2)          << WRONG<br> ld $3,8($fp)<br> move $5,$2<br> move $6,$3<br> jal memcpy<br> sd $2,0($fp)<br> .stabn 68,0,220,.LM118<br>.LM118:<br> dla $2,MM_RTLinker<br> ld $2,0($2)           << WRONG<br> move $4,$2<br> jal free<br> .stabn 68,0,221,.LM119<br>.LM119:<br> ld $4,16($fp)<br> dla $3,MM_RTLinker<br> ld $2,136($3)         << OK<br> andi $2,$2,0x0<br> or $2,$4,$2<br> sd $2,136($3)         << OK <br> .stabn 68,0,222,.LM120<br>.LM120:<br> dla $2,MM_RTLinker<br> ld $3,0($2)           << WRONG<br> dla $2,MM_RTLinker<br> ld $2,0($2)           << WRONG<br> daddu $4,$3,$2<br> dla $3,MM_RTLinker<br> ld $2,128($3)         << OK<br> andi $2,$2,0x0<br> or $2,$2,$4<br> sd $2,128($3)         << OK<br>.L65:<br>.LBE9:<br> .stabn 68,0,224,.LM121<br>.LM121:<br> move $sp,$fp<br> ld $31,56($sp)<br> ld $fp,48($sp)<br> ld $28,40($sp)<br> daddiu $sp,$sp,64<br> j $31<br> .end RTLinker__ExpandModuleTable<br><br>Here is corrected code:<br><br>RTLinker__ExpandModuleTable:<br> .frame $fp,64,$31  # vars= 32, regs= 3/0, args= 0, gp= 0<br> .mask 0xd0000000,-8<br> .fmask 0x00000000,0<br> daddiu $sp,$sp,-64<br> sd $31,56($sp)<br> sd $fp,48($sp)<br> sd $28,40($sp)<br> move $fp,$sp<br> lui $28,%hi(%neg(%gp_rel(RTLinker__ExpandModuleTable)))<br> daddu $28,$28,$25<br> daddiu $28,$28,%lo(%neg(%gp_rel(RTLinker__ExpandModuleTable)))<br>.LBB9:<br> .stabn 68,0,208,.LM109<br>.LM109:<br> sd $0,16($fp)<br> .stabn 68,0,210,.LM110<br>.LM110:<br> dla $2,MM_RTLinker<br> daddiu $2,$2,136     << CORRECT (offset seems low, but at least it isn't zero) <br> ld $2,0($2)<br> bne $2,$0,.L61<br> .stabn 68,0,212,.LM111<br>.LM111:<br> dla $2,MM_RTLinker<br> daddiu $3,$2,128     << CORRECT <br> li $2,500   # 0x1f4<br> sd $2,0($3)<br> .stabn 68,0,213,.LM112<br>.LM112:<br> li $4,4000   # 0xfa0<br> jal malloc<br> sd $2,0($fp)<br> dla $2,MM_RTLinker<br> daddiu $3,$2,136      << CORRECT <br> ld $2,0($fp)<br> sd $2,0($3)<br> .stabn 68,0,214,.LM113<br>.LM113:<br> dla $2,MM_RTLinker<br> daddiu $2,$2,136      << CORRECT <br> ld $2,0($2)<br> bne $2,$0,.L65<br> jal abort<br> b .L65<br>.L61:<br><br>I still dump core with this change, but I get much further.<br>I have not tested this change at all otherwise -- i.e. on working platforms.<br><br>I have not debugged through the gcc/m3cg code to see why<br>the offsets are only sometimes lost, or why other platforms<br>have no problem. Is MIPS's "global pointer" unusual these days?<br>I know SPARC has similar, and all the non-x86, non-AMD64 NT platforms<br>had similar, but that's essentially nothing now (I'm not counting IA64).<br>I know Linux has PLT (procedure linkage table) and GOT (global offset table).<br>Same thing?<br>I haven't looked much at other MIPS ports yet.<br><br><a href="http://modula3.elegosoft.com/cgi-bin/cvsweb.cgi/cm3/m3-sys/m3cc/gcc/gcc/m3cg/parse.c.diff?r1=1.7;r2=1.8">http://modula3.elegosoft.com/cgi-bin/cvsweb.cgi/cm3/m3-sys/m3cc/gcc/gcc/m3cg/parse.c.diff?r1=1.7;r2=1.8</a><br><br>is what made it look about like it does -- in particularing using BIT_FIELD_REF.<br><br>1.7:<br><br>static void m3_load (v, o, src_t, src_T, dest_t, dest_T) /* GCC32OK */<br>     tree v;<br>     int o;<br>     tree src_t, dest_t;<br>     m3_type src_T, dest_T;<br>{<br>  if (o == 0 && TREE_TYPE (v) == src_t) {<br>    EXPR_PUSH (v);<br>  } else {<br>    tree adr = m3_build1 (ADDR_EXPR, t_addr, v);<br>    if (o != 0) {<br>      adr = m3_build2 (PLUS_EXPR, t_addr, adr, size_int (o / BITS_PER_UNIT));<br>    }<br>    EXPR_PUSH (m3_build1 (INDIRECT_REF, src_t,<br>                          m3_cast (build_pointer_type (src_t), adr)));<br>  }<br>#if 1<br>  if (src_T != dest_T) {<br>    EXPR_REF (-1) = m3_build1 (CONVERT_EXPR, dest_t, EXPR_REF (-1));<br>  }<br>  if (debug_vars) {<br>    const char *name = "noname";<br>    if (v != 0 && DECL_NAME(v) != 0) {<br>      name = IDENTIFIER_POINTER(DECL_NAME(v));<br>    }<br>    fprintf(stderr, "  m3_load (%s): offset %d, convert %d -> %d\n", name,<br>            o, src_T, dest_T);<br>  }<br>#else<br>  if (src_T != dest_T) {<br>    if (IS_INTEGER_TYPE(dest_T) && dest_t != t_int) {<br>      EXPR_REF (-1) = m3_build1 (CONVERT_EXPR, t_int, EXPR_REF (-1));<br>    } else if (IS_WORD_TYPE(dest_T) && dest_t != t_word) {<br>      EXPR_REF (-1) = m3_build1 (CONVERT_EXPR, t_word, EXPR_REF (-1));<br>    } else if (IS_INTEGER_TYPE(dest_T) || IS_WORD_TYPE(dest_T)) {<br>      /* okay */<br>    } else {<br>      fatal_error("m3load: cannot convert types: src_t %d dest_t %d\n",<br>                  src_T, dest_T);<br>    }<br>  }<br>#endif<br>}<br>static void<br>m3_store (v, o, src_t, dest_t)  /* GCC32OK */<br>     tree v;<br>     int o;<br>     tree src_t, dest_t;<br>{<br>  tree lhs, rhs;<br>  if (TREE_TYPE (EXPR_REF (-1)) == src_t) {<br>    rhs = EXPR_REF (-1);<br>  } else {<br>    rhs = m3_cast (src_t, EXPR_REF (-1));<br>  }<br>  if (o == 0 && TREE_TYPE (v) == dest_t) {<br>    lhs = v;<br>  } else {<br>    tree f = make_node (FIELD_DECL);<br>    TREE_TYPE (f) = dest_t;<br>    DECL_ALIGN (f) = TYPE_ALIGN (dest_t);<br>    DECL_SIZE (f) = TYPE_SIZE (dest_t);<br>    DECL_MODE (f) = TYPE_MODE (dest_t);<br>    DECL_FIELD_OFFSET (f) = size_int (o / BITS_PER_UNIT);<br>    DECL_FIELD_BIT_OFFSET (f) = bitsize_int (o % BITS_PER_UNIT);<br>    DECL_FIELD_CONTEXT (f) = TREE_TYPE (v);<br>    lhs = m3_build2 (COMPONENT_REF, dest_t, v, f);<br>  }<br>#if 1<br>    expand_assignment (lhs, m3_build1 (CONVERT_EXPR, dest_t, rhs), 0, 0);<br>#else<br>  if (dest_t ==  NULL) {<br>    expand_assignment (lhs, rhs, 0, 0);<br>  } else {<br>    expand_assignment (lhs, m3_build1 (CONVERT_EXPR, dest_t, rhs), 0, 0);<br>  }<br>#endif<br>  EXPR_POP ();<br>}<br><br>1.8:<br>static void<br>m3_load (tree v, int o,<br>  tree src_t, m3_type src_T,<br>  tree dst_t, m3_type dst_T) /* GCC32OK */<br>{<br>  if (o == 0 && TREE_TYPE (v) == src_t) {<br>    EXPR_PUSH (v);<br>  } else {<br>    EXPR_PUSH (m3_build3 (BIT_FIELD_REF, src_t, v, TYPE_SIZE (src_t),<br>     bitsize_int (o)));<br>  }<br>  if (src_T != dst_T) {<br>    EXPR_REF (-1) = m3_build1 (CONVERT_EXPR, dst_t, EXPR_REF (-1));<br>  }<br>  if (option_vars_trace) {<br>    const char *name = "noname";<br>    if (v != 0 && DECL_NAME(v) != 0) {<br>      name = IDENTIFIER_POINTER(DECL_NAME(v));<br>    }<br>    fprintf(stderr, "  m3_load (%s): offset %d, convert %d -> %d\n", name,<br>     o, src_T, dst_T);<br>  }<br>}<br>static void<br>m3_store (tree v, int o, tree src_t, tree dst_t)  /* GCC32OK */<br>{<br>  tree lhs, rhs;<br>  if (TREE_TYPE (EXPR_REF (-1)) == src_t) {<br>    rhs = EXPR_REF (-1);<br>  } else {<br>    rhs = m3_cast (src_t, EXPR_REF (-1));<br>  }<br>  if (o == 0 && TREE_TYPE (v) == dst_t) {<br>    lhs = v;<br>  } else {<br>    lhs = m3_build3 (BIT_FIELD_REF, dst_t, v, TYPE_SIZE (dst_t),<br>       bitsize_int (o));<br>  }<br>  if (src_t != dst_t) {<br>    rhs = m3_build1 (CONVERT_EXPR, dst_t, rhs);<br>  }<br>  expand_assignment (lhs, rhs, 0, 0);<br>  EXPR_POP ();<br>}<br><br> - Jay<br></div></blockquote></div><br></div></body></html>