-------------------------------------------------------------------------------
*  RELEASE 2.00 BUGLIST                                                       *
*  Update - 10/30/89                                                          *
*                                                                             *
*  This file contains a list of bugs in the release 2.00 of the 320C30 code   *
*  generation tools.                                                          *
*                                                                             *
*  All bugs will be fixed in the next production release unless otherwise     *
*  indicated.  There will sometimes be references to internal versions in     *
*  this list.  For that reason you must always refer to the release status    *
*  information (published every two weeks) to verify the availability of a    *
*  specific revision.                                                         *
*                                                                             *
-------------------------------------------------------------------------------
UTILITIES
-----------------------------------------------------------------------------
1)  C30-2854 FIXED 2.10  cl30 shell utility
    cl30 does not return correct code to the operating system on completion.
    Therefore, when cl30 is used in a MicroSoft MAKE-file the MAKE utility
    sends a "FATAL ERROR" message to the terminal, even though cl30 performed
    all tasks successfuly.

PARSER
-----------------------------------------------------------------------------
CODE GENERATOR
-----------------------------------------------------------------------------
1)  C302824 FIXED 2.10
    In certain very rare cases, a conditional expression (? and : operators)
    used in a conditional context (such as in an if statement) may not evaluate
    correctly.

2)  C302839 FIXED 2.10
    Switch statements with long (>16 bits) case values do not execute correctly.
    This only occurs if the case values are widely scattered.

3)  C302845 FIXED 2.10
    When using the big model, the compiler omits the LDP instruction when
    the dot operator is used to access a member of a global structure (as in
    structure.member = x;) or when global array is accessed with a constant
    index (as in a[ 5 ] = x;).

4)  FIXED 2.10
    Certain cases of using multiply, divide, or mod operators as one of
    several arguments to a function cause the code generator to crash.  This
    can only occur when the function call in question is used in an expression.

5)  C302891 FIXED 2.10
    If an assignment to a pointer register variable is used in a conditinal
    context, the compiler can in certain cases omit the compare instruction
    for the condition.  Example: "if (reg_ptr = malloc()) ...".  This usually
    occurs when the RHS of the assignment is a function call, as in the example.
    Workaround:  separate the assignment from the condition, as in:
        reg_ptr = malloc();
        if (reg_ptr) ...

6)  FIXED 2.10
    When an integer variable is multiplied by a constant, its value in
    subsequent expressions may be incorrect.  This only ocuurs when the
    constant is a power of two, the sum of two powers of two, or the
    difference of a power of two and 1.  In these cases the compiler optimizes
    the multiply into a shift/add operation.

7)  C302890   FIXED 2.10
    Codegen prints message "REG_REALLOC" in compiling a conditional expression
    assigned to a pointer register variable, where one of the conditional
    results is an indirect reference through the same register.  Example:
    "ar4 = (cond) ? 0 : *ar4".

8)  FIXED 2.10
    If a union member with integral type is accessed, and then in subsequent
    code a floating point member at the same offset is accessed, the floating
    point member is not reloaded (resulting in an incorrect value).

9)  FIXED 2.10
    In the expression "call((a = b()) + (a * c))", the result of the first
    assignment is not saved before the multiply function is called.  (Note that
    this expression is not well defined anyway).

10) C30-2887     FIXED 2.10   (ALSO REPORTED AS C30-2894)
    The compiler generates the wrong code or writes "REG_REALLOC" when compiling
    certain expressions involving two or more operands which both have two
    levels of indirection.  For example: "*p->x = *q->y".

11) C30-2893     FIXED 2.10
    The compiler does not honor the -mx option (avoid TMX silicon bugs) in
    cases where two indirect operands are combined, and one or both pointers
    are autoincremented (or autodecremented).  For example: "a = *p++ + *q".
    The compiler uses a standard three-operand instruction, which is correct
    but will not correctly execute on early TMX320C30 devices.

12) C30-2900     FIXED 2.10
    The compiler does not flag frame pointer (FP) out of range condition
    as an error.

13) C30-2910 will fix 2.30
    With code that makes multiple, consecutive assignments to the same address,
    the compiler can generate parallel STI's to the same address which are
    executed in reverse order in the runtime environment.  For example:
                *out = A;
                *out = B;
                *out = A;
                *out = B;
    will execute in the order: B,A,B,A at runtime.
    Work Around: compile with -x option.

ASSEMBLER
-----------------------------------------------------------------------------
RUN TIME SUPPORT
------------------------------------------------------------------------
ROM UTILITY
-----------------------------------------------------------------------------

LINKER
-----------------------------------------------------------------------------

1)  RR2878     FIXED 2.10
    Specification of an empty GROUP in the link command file sometimes
    causes linker to crash.

ARCHIVER
-----------------------------------------------------------------------------
DOCUMENTATION
-----------------------------------------------------------------------------

1) dsp2828
   November 1988 TMS320C30 Assembly Language Tools User's Guide
   (SPRU035)
   Sections 7.4 & 7.5  -  Examples given claim to illustrate the passing of
   .string values to $MACROs.  But value qualifier suffix must be used for
   this function.  That is:
                            :PARAM.v:
   must be used where '.v' is the value qualifier.

