Hi,

There's a line in array.c which confuses the Borland 5.5 compiler
optimizer into corrupting a pointer held in a register.

Use of -O2 flag with the 'free' compiler causes a SEGV in
miniruby during the bccwin32 build process.

I tried to produce a small test case for the Borland community to
comment on but without success, so I can't say if this is a known
problem or even what the problem is.
It doesn't occur anywhere else in the 183p1 source.

Fix has a much smaller impact than adding 'volatile' would have.

I don't like the code change, especially as it means the same thing
but it will be preferable to the SEGV if you can bear it.

---

* array.c (sort_2): work around SEGV caused by rare Borland 5.5
  compiler bug when using optimize -O2 flag [ruby-core:5152]

=======================================================================

--- array_1_137_2_23.c Fri May 13 03:38:18 2005
+++ array_patched.c  Mon Jun 06 17:35:30 2005
@@ -1584,7 +1584,7 @@ sort_2(ap, bp, data)
  if ((long)a < (long)b) return -1;
  return 0;
     }
-    if (TYPE(a) == T_STRING && TYPE(b) == T_STRING) {
+    if (TYPE(a) == T_STRING) if (TYPE(b) == T_STRING) {  /* OK: && */
  return rb_str_cmp(a, b);
     }

=======================================================================

In case you're interested, here's the offending part of the
assembler expansion:

     ;
     ; if (TYPE(a) == T_STRING && TYPE(b) == T_STRING) {
     ;
     ; EBX = a, ESI = b ; returns EDX

     ; <snip>

     ; [ TYPE(a) ] if (a == Qundef) return T_UNDEF;

     cmp  ebx,6
     jne  short @542
     mov  edx,60
     jmp  short @543
@542:
     ; [ TYPE(a) ] if (SYMBOL_P(a)) return T_SYMBOL;

     and  ebx,255   ; <---***  VALUE 'a' in EBX corrupted  ***
     cmp  ebx,14
     jne  short @544
     mov  edx,36
     jmp  short @545
@544:
     ; return BUILTIN_TYPE(a);
     mov  edx,dword ptr [ebx]  ; <---***  SEGV (ebx)
     and  edx,63

@543:
@545:
   ; <snip>  same for TYPE(b)   }



The bug sends its apologies :-o


daz



begin 666 array_bccO2.patch
M+2TM(&%R<F%Y7S%?,3,W7S)?,C,N8PE&<FD@36%Y(#$S(# S.C,X.C$X(#(P
M,#4**RLK(&%R<F%Y7W!A=&-H960N8PD)36]N($IU;B P-B Q-SHS-3HS," R
M,# U"D! ("TQ-3@T+#<@*S$U.#0L-R! 0"!S;W)T7S(H87 L(&)P+"!D871A
M*0H@"6EF("@H;&]N9REA(#P@*&QO;F<I8BD@<F5T=7)N("TQ.PH@"7)E='5R
M;B P.PH@(" @('T*+2 @("!I9B H5%E012AA*2 ]/2!47U-44DE.1R F)B!4
M65!%*&(I(#T](%1?4U1224Y'*2!["BL@(" @:68@*%194$4H82D@/3T@5%]3
M5%))3D<I(&EF("A465!%*&(I(#T](%1?4U1224Y'*2![(" O*B!/2SH@)B8@
E*B\*( ER971U<FX@<F)?<W1R7V-M<"AA+"!B*3L*(" @("!]"@``
`
end