[comp.os.minix] Turbo C 1.5 Revisited...

jca@pnet01.cts.com (John C. Archambeau) (04/24/89)

I have found the problem with it and it turns out to be a nasty bug in the
object code generator for switch statements.  If you compile with the -S
option, the assembly code looks perfectly legal (it probably is), but if you
take a debugger to the generated code for fsck.c, it turns out that the switch
code does not match that (operand wise) to the assembly code.
 
I have a sneaking suspicion that there are such beasts as Turbo C 1.51, 1.52,
etc. floating around out there with patches that Borland has put in.  It's the
only logical explanation as to my problem in building Minix with 1.5.
 
For you Turbo C 1.5 people who have successfully built Minix without this
problem, did you have to patch your compiler for it to work?  
 
For those of you trying to cross compile with 1.5 and for some strange
bizarre reason commands you get with the opening menu are illegal, try adding
this debugging code to default in main of fsck.c
 
 default:
  if (command == '=')
   printf ("\nEeek!  Time to yell at Borland.\n");
  printf ("Illegal command.\n");
  continue;
 
If the switch code was working properly, the first printf after the if in
default should NEVER be printed since there's a case '=' which is used to
start up the kernel.
 
(Oh, thanks to that person who sent me mail saying that it might be a bug with
TC, but I didn't want to believe it...now I believe it.)
 
 JCA

UUCP: {nosc ucsd hplabs!hp-sdd}!crash!pnet01!jca
ARPA: crash!pnet01!jca@nosc.mil
INET: jca@pnet01.cts.com

mjw@vaxine.UUCP (Mike Wilt) (04/28/89)

In article <4105@crash.cts.com> jca@pnet01.cts.com (John C. Archambeau) writes:
>I have found the problem with it and it turns out to be a nasty bug in the
>object code generator for switch statements.  If you compile with the -S
>option, the assembly code looks perfectly legal (it probably is), but if you
>take a debugger to the generated code for fsck.c, it turns out that the switch
>code does not match that (operand wise) to the assembly code.
> 
[more stuff]

I isolated that bug and sent a complete description to Borland.  They said
they couldn't reproduce it.  I didn't feel like sending them the entire source
to my program, so I let it go.  It is apparently a problem with the way the
assembler-end of the compiler generates code.  It was making a tight loop to
test some of the cases, and the jump-back instruction was pointing one
instruction after the test.  The result is that it runs the loop without
actually testing anything.  Inside the loop, there was a JNE followed by JMP.
The assembler code generated by the -S option had JE.  I believe the assembler
pass at the back end of the compiler substituted JNE+JMP without correcting
the offset from the end of the loop back to the beginning.  It was easy to make
this bug disappear, because rearranging the cases would move branches between
the loop tests and the jump table.

It was not in 1.0x, it appeared in 1.5, and it may be gone in 2.0.  I assume
their tech support guys didn't know about it, at least not when I was trying
to report it.

Mike

jca@pnet01.cts.com (John C. Archambeau) (05/08/89)

mjw@vaxine.UUCP (Mike Wilt) writes:
>In article <4105@crash.cts.com> jca@pnet01.cts.com (John C. Archambeau) writes:
>>I have found the problem with it and it turns out to be a nasty bug in the
>>object code generator for switch statements.  If you compile with the -S
>>option, the assembly code looks perfectly legal (it probably is), but if you
>>take a debugger to the generated code for fsck.c, it turns out that the switch
>>code does not match that (operand wise) to the assembly code.
>> 
>[more stuff]
>
>I isolated that bug and sent a complete description to Borland.  They said
>they couldn't reproduce it.  I didn't feel like sending them the entire source
>to my program, so I let it go.  It is apparently a problem with the way the
>assembler-end of the compiler generates code.  It was making a tight loop to
>test some of the cases, and the jump-back instruction was pointing one
>instruction after the test.  The result is that it runs the loop without
>actually testing anything.  Inside the loop, there was a JNE followed by JMP.
>The assembler code generated by the -S option had JE.  I believe the assembler
>pass at the back end of the compiler substituted JNE+JMP without correcting
>the offset from the end of the loop back to the beginning.  It was easy to make
>this bug disappear, because rearranging the cases would move branches between
>the loop tests and the jump table.
>
>It was not in 1.0x, it appeared in 1.5, and it may be gone in 2.0.  I assume
>their tech support guys didn't know about it, at least not when I was trying
>to report it.
>
>Mike


Would you mind telling us (especially me), how you corrected this bug?  I have
taken a good look at the code after calling Borland and this bug just doesn't
exist.  I have dumped both the -S generated code and have cranked the .obj
code through D86 and listed it to printer.  Everything is kosher.  My guess is
that A86 isn't doing something correctly or build.c has an error in it.  Right
now I'm just plain stuck on what to do about this problem and everything is
pretty much halted until I resolve this problem (and I have a 10 MB partition
waiting for Minix 1.3).  I figure it this way, if the people who have written
the Turbo C 1.5 articles have done it, then the bug is not in the compiler and
the only patch for Turbo C 1.5 is for the library module initgraph.  The only
other common denominator is the fact that I'm not using MASM which might be
botching up the cs register when I go to link up the A86 code and Turbo C
code.
 
 JCA

UUCP: {nosc ucsd hplabs!hp-sdd}!crash!pnet01!jca
ARPA: crash!pnet01!jca@nosc.mil
INET: jca@pnet01.cts.com