Google
 

Trailing-Edge - PDP-10 Archives - BB-J713A-BM - 4-documentation/blis10.doc
There are 18 other files named blis10.doc in the archive. Click here to see a list.


BLISS.DOC Changes from 6(212) to 7E(227)
January, 1978
































 COPYRIGHT (c) 1978 BY
 DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.

 THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND  COPIED
 ONLY  IN  ACCORDANCE  WITH  THE  TERMS  OF  SUCH  LICENSE AND WITH THE
 INCLUSION OF THE ABOVE COPYRIGHT NOTICE.  THIS SOFTWARE OR  ANY  OTHER
 COPIES  THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
 OTHER PERSON.  NO TITLE TO AND OWNERSHIP OF  THE  SOFTWARE  IS  HEREBY
 TRANSFERRED.

 THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE  WITHOUT  NOTICE
 AND  SHOULD  NOT  BE  CONSTRUED  AS  A COMMITMENT BY DIGITAL EQUIPMENT
 CORPORATION.

 DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR  RELIABILITY  OF  ITS
 SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
                                                                Page 2


BLISS.DOC Changes from 6(212) to 7E(227)
January, 1978



1.0  SUMMARY

BLISS-10 7E(227) replacing BLISS-10 6(212).

The distribution tape contains the following files:

         BLIS10.EXE       !BLISS-10 Compiler V7E(227)
         BLIS10.ERR       !BLISS-10 Error file
         BLIS10.DOC       !BLISS-10 Document file
         BLIS10.HLP       !BLISS-10 Help file
         DEB10.EXE        !BLISS-10 Debugging compiler
         SIX12.BLI        !SIX12 Source file
         SIX12X.REL       !SIX12 Object file

This version runs on TOPS-10 monitors from 5.07 to  present.   It  can
run  on  DECsystem-20  under  the compatability package.  This version
supersedes 6(212).

A description of BLISS-10 is contained in

     DECsystem-10 BLISS-10 Programmer's Reference Manual



2.0  EXTERNAL CHANGES

The major  changes  to  the  compiler  have  been  to  the  once  only
initialization  module  and  the  declaration  processing  modules  to
incorporate the first two new language features described below.



2.1  New Features Added Since Version 6(212).

                    *** WARNING ***


     Here 6  below  may  affect  some  current  programs.   Review  it
     carefully before using V7E.


     Six new features have been added.

     1.  Initialization  of  OWN  and  GLOBAL  data  segments  is  now
         possible.   Initialization  of  a segment is specified within
         its OWN or GLOBAL declaration and consists of an equal  sign,
         "=",   followed  by  a  plit  argument.   The  initialization
         specification follows the segment name (and size if any).  An
         initialization  specification  must  not be factored, and the
         number of words initialized must not exceed the data  segment
                                                                Page 3


         size.

         Examples:
                    OWN X=1,Y[2]=(4,5);
                    GLOBAL STRING[4]= 'This is a String';

         The declaration

                    OWN X:Y:Z = 1:

         only initializes X and gives the warning message  for  Y  and
         for Z that factorization of initialization is not allowed.

         The declaration

                    OWN X = (2,3),Y;

         produces a warning message  stating  that  overinitialization
         has  taken place;  in this example X will be initialized to 2
         and Y to 3.

     2.  It is now possible to have more than one module in the  input
         file.   Each  module is compiled independently and the object
         file produced is the concatenation of the  ones  produced  by
         compiling  each  module separately.  This new feature is also
         the fix of bug 13 listed below.  Each module must start on  a
         new  line.   Delimiters  following  and  on  the same line as
         ELUDOM are ignored.

     3.  Register assignments for each module are  now  identified  in
         the  relocatable object file.  To achieve this, the following
         names

              .SREG
              .FREG
              .VREG
              .DREGS

         are predeclared by the compiler and  globally  bound  to  the
         negative  of  SREG,  FREG,  VREG,  and the preserved register
         mask,  respectively.   Thus,  two  modules   with   differing
         register  assignments  will  produce multiply defined symbols
         when linked.  These names appear in the listing file as well.
         The default register assignment produces:

              .SREG=:0
              .FREG=:-2
              .VREG=:-3
              .DREGS=:-174000

         This states that SREG is  0,  FREG  is  2,  VREG  is  3,  and
         registers 17, 16, 15, 14, and 13 (octal) are preserved.

     4.  A new command line switch, /Z,  is  now  available.   The  /Z
         switch  establishes alternative default register assignments,
                                                                Page 4


         as follows:  SREG=#17, FREG=#15, VREG=#1, DREGS=7, and #0 and
         #16  are  reserved.   Of course explicit assignments given in
         the module head will override this default.


     5.  A require file declaration may also have the form

              REQUIRE 'file-specification';

         where a file-specification is written

              device:filename.extension[ppn]

         with device:, .extension, and  [ppn]  being  optional.   This
         corrects the deficiency #10 listed below in section 3.

     6.  Within a  macro  definition,  two  new  conventions  are  now
         available  to  incorporate  a  dollar sign character into the
         text  of  the  macro  being  defined.   First,  the  ?   name
         convention  is now used by the macro scanner to find names in
         the macro body.  Specifically, if a name begins with  ?   any
         contiguous  $  will  become  part  of  the macro body and not
         terminate the macro definition.  (This does  not  affect  the
         use of $ adjacent to non-?  names.) Second, a sequence of two
         adjacent dollar signs will be incorporated in the macro  body
         as  a single dollar sign character and will not terminate the
         macro definition.  This is needed to permit the  dollar  sign
         character to be used in quoted strings within the macro body.
         Note in particular, that the ?  convention  takes  precedence
         over  the adjacent $ convention so that two adjacent $ in a ?
         name will give two $'s in the expansion.

         WARNING:  This convention is  not  intended  to  allow  macro
         expansions    to    produce   (nested)   macro   definitions.
         Unpredictable results will occur if this is attempted.

         Example:

              MACRO
                  TEXT  = 'ab$$'$,
                  NAME1 = ?X$ $,
                  NAME2 = ?X$$Y $,
                  NAME3 = X$;

         defines TEXT to be the five character sequence  'ab$',  NAME1
         to  be  the  sequence ?X$, NAME2 to be the sequence ?X$$Y and
         NAME3 to be the sequence X.


         Some macros used with compilers prior to V7E may need  to  be
         changed for proper operation.  For example:

              MACRO JBDAT = ?.JBDAT$;

         must be changed to
                                                                Page 5


              MACRO JBDAT = ?.JBDAT $;

         that is, a space (or tab) must precede the $ that  terminates
         the macro body.




3.0  KNOWN BUGS AND DEFICIENCIES


3.1  Documentaion

The following documentaion problems exist in the BLISS-10 Programmer's
Reference Manual, DEC-10-LBRMA-A-D:

     1.  ^ Operator

         The ^ operator is described as an arithmetic  shift,  but  is
         actually a logical shift.

     2.  @ Operator with Formal Name in Structure Definition

         Several  users  have  reported  problems  when  the  @  fetch
         operator   is   used  with  a  formal  name  in  a  structure
         definition, such as

                 STRUCTURE V = .V + @I;

         They expect that the "@" works like "." to cause the formal I
         to   refer  to  an  access  actual  parameter,  but  this  is
         incorrect.   Since  no  dot  preceeds  the  formal  I  it  is
         interpreted  as  an  allocation  parameter  to  which the "@"
         operator is applied.  Since allocation parameters are  always
         constant   values,   optimization   effects  often  give  the
         appearance of missing code.

         As a general rule, it is almost never meaningful to  use  the
         "@" (or "\") operator preceeding a formal name in a structure
         definition.  Such usage is not, however, an actual error  and
         hence can not be diagnosed by the compiler.

     3.  Discrepancy between GLOBAL BIND and EXTERNAL references

         There is a discrepancy between the effects  obtained  from  a
         GLOBAL  BIND  definition  of  a  name  and  the corresponding
         EXTERNAL  definition  of  the  name  in  a  separate  module.
         Consider this example:

                 MODULE =
                 BEGIN
                 BIND A = 1;
                 GLOBAL BIND B = 2;
                 EXTERNAL C;
                 VREG = A;
                                                                Page 6


                 VREG = B;
                 VREG = C;
                 END
                 ELUDOM

         The compiled code is:

                   MOVEI   $V,1
                   MOVEI   $V,2
                   MOVE    $V,MA1N.C+0
                   ...
         MA1N.C:   XWD     004400,,C

         One would expect that if C is defined by the declaration

                 GLOBAL BIND C=2;

         in another module, that the value of C assigned to  $V  would
         not  have  004400  in  the left half-word, since that is what
         happens for A and B.

         This discrepancy illustrates an  inherent  ambiguity  in  the
         definition  of  BLISS-10;   there is no practical resolution.
         For symbol B in the above example, the  compiler  knows  that
         the value of B and treats it in the "natural" way.  The value
         of C is not known and is treated like a  relocatable  storage
         name, which gives rise to the byte pointer value of the name.

         The assignment

                 VREG = C<0,0>

         will have the intended effect for the case where C is defined
         as a constant value.  Note that a further implication of this
         problem is that constant values  defined  in  a  GLOBAL  BIND
         effectively  must  be  treated  as  18-bit  values  in  other
         routines.

     4.  LOWSEG module head switch

         The LOWSEG is mis-printed as LOSEG in the BLISS-10 syntax  in
         the  appendix A.  LOWSEG module head switch forces the entire
         compilation into the low segment.  LOSEG switch has no effect
         and is ignored by the BLISS-10 compiler.



3.2  Compiler

The following bugs remain (numbers refer to the  cumulative  bug  list
below):

6,19,20,47 and 52.

The following bugs have been fixed:
                                                                Page 7


4,5,7,8,10,11,12,13,17,18,21,22,24,25,
26,27,28,29,30,31,32,33,34,35,36,37,
38,39,40,41,42,43,44,45,46,48,49,50 and 51.


The following deficiencies are determined to be not repairable or  not
worth correction and are left as is:

1,2,3,9,14,15,16 and 23.

     1.  DEFICIENCY

         Case Folding (translation of lower case to upper  case)  does
         not work with macro formal names in strings.

         Ex.
              EXTERNAL TYPSTR;          ! Types an ASCIZ string
              MACRO M(H)=TYPSTR('THE MESSAGE IS :h')$;
              M(WRONG)

         This should type:

              THE MESSAGE IS:WRONG

         Instead it types:

              THE MESSAGE IS:h

     2.  DEFICIENCY

         When processing a quoted string longer than  1000  characters
         the compiler gives an error message and aborts.

     3.  DEFICIENCY

         A compiler error occurs if allocation declarations (LOCAL  or
         OWN) appear in a BEGIN ... END block of a structure.

     4.  BUG FIXED 7E(225)

         A global routine should have a compound expression  or  block
         as  its  body.   Otherwise,  an "illegal up level addressing"
         error message may occur.   The  above  error  occurs  if  one
         defines  nested  global  routines and declares registers with
         the same names in each global routine.

         Ex:
              MODULE AAA=
              BEGIN
                  REGISTER A;
                  GLOBAL ROUTINE MLIST=-2;
                  A=-1;
              END
              ELUDOM
                                                                Page 8


              GLOBAL ROUTINE ONE=
              BEGIN
                   REGISTER R,S,T;
                   BEGIN
                        GLOBAL ROUTINE TWO=
                        BEGIN
                             REGISTER R,S,T;
                             R=S=T=2;
                        END;
                   END;
                   R=S=T=1;
              END;

     5.  BUG FIXED 7(215)

         Bad code is generated for the last argument to the call  when
         it is in a structure accessing definition.

         Ex:
              STRUCTURE FOO[I,J]=(BAZ(@.FOO,.I,.J));

         The call to BAZ has nonsense for its last argument.  This may
         be  fixed  by inserting parenthesis around the last argument,
         thus

              STRUCTURE FOO[I,J]=(BAX(@.FOO,.I,(.J)));

     6.  BUG

         An INDEXES name will give an  error  ("an  operator  must  be
         followed  by  a  simple expression") if it is not enclosed in
         parentheses.

         Ex.
              BIND B=PLIT(C INDEXES 4,5,6):
              IF .X EQL C THEN ...  fails.

         However,

              IF .X EQL (C) THEN ...

         works.

     7.  BUG FIXED 7(215)

         Bind within binds yield an infinite loop  or  illegal  memory
         reference

         Ex.
              BIND A=(BIND FOO=1;  FOO+5);

     8.  BUG FIXED 7(215)

         On rare occasion BLISS will lose track of the register  where
         it has stored the value of an OWN and bad code is generated.
                                                                Page 9


         Ex:
              OWN T;
              T=#123456654321;
              T<18,6>=0;
              T=..T +.(.T+1);

     9.  DEFICIENCY

         If a main module (with  "STACK"  or  "START"  in  its  module
         header)  without  "TIMER=EXTERNAL(SIX12)",  or  the  like  is
         compiled with "/D", an error message is produced.  A  default
         timer specification should be assumed.

    10.  DEFICIENCY REMOVED 7B(222)

         BLISS will not accept a request for a  require  file  if  its
         name begins with a number.

         Ex:
              123.BLI

         This problem  may  now  be  avoided  by  enclosing  the  file
         specification in quotes--e.g., '123.BLI'.

    11.  BUG FIXED 7B(222)

         A zero index on an indirect vector  access  causes  an  error
         message.

         Ex:
              STRUCTURE S[I]=(..S+.I);
              LOCAL S X;
              X[0]=.X[0] +1;

    12.  BUG FIXED 7(215)

         When # is not followed by  an  octal  digit,  the  result  is
         equivalent  to  #0.   Hence  #-14  is  decimal -14.  No error
         message is given.

    13.  BUG FIXED 7(215)

         One cannot have several modules defined in a file.  Only  the
         first module gets compiled.

    14.  DEFICIENCY

         An error message may occur if a control expression  involving
         VREG is the right operand of an assignment.  For example,

              A=IF .B THEN .C ELSE .VREG +1

         is an error, but

              A=(IF .B THEN .C ELSE .VREG+1)
                                                               Page 10


         is not.

    15.  DEFICIENCY

         Setting the CREF switch in module header with  no  list  file
         specified  in  the  command  string causes the compilation to
         abort, sometimes with the error  message  "PDL  OVERFLOW"  or
         "I/O TO UNDEFINED CHANNEL".

         Ex:
              .R BLIS10
              *A=FILE.BLI

         where FILE.BLIS contains:

                MODULE SSS(STACK,XREF)=
                BEGIN
                EXTERNAL A;
                 A=12;
                END
                ELUDOM

    16.  DEFICIENCY

         MACHOP JUMP instructions compile incorrectly.

    17.  BUG FIXED 7(215)

         MACHOPS #127,#126 produce DPB,IDPB  machine  instructions  in
         the   list  file.   It  should  produce  FLTR,  FIXR  machine
         instructions.  In any case, the instructions in the REL  file
         are okay.

    18.  BUG FIXED 7B(222)

         BIND to REGISTER does not work.

         Ex:
              REGISTER A;
              BIND B=A;     %FAILS%
              BIND C=(A);   %WORKS%

    19.  BUG

         Occassionally a BIND to a pointer with the indirect  bit  set
         causes an error message.

         Ex:
              BIND A=(-1)<0,36,FREG,1>;

    20.  BUG

         A structure containing a compound expression may not generate
         correct code.
                                                               Page 11


         Ex:
              STRUCTURE XXX[I.J]=
                   [1](.I=I+.I;  .J=J+.J);
              OWN U,V,X,Y,XXX Z[2,3];
               .
               .
               .
              Z[(IF .X THEN U ELSE V),Y];

    21.  BUG FIXED 7(215)

         Negative replication counts in PLITS may cause a  variety  of
         problems  such  as:   infinite  loops,  empty PLIT areas, and
         nonsense PLITs.

         Ex:
              BIND B = PLIT(1,2,3,-2:(4))

    22.  BUG FIXED 7(215)

         A TDZA instruction preceded by a SKIPN causes the wrong value
         to be loaded into the register.

         Ex:
              EXTERNAL X,Y,Z;
              ROUTINE T(S) =
                 BEGIN
                 CASE .S OF
                 SET
                     X = (.Y NEQ 0);
                     X = .Z
              TES;
              END;

         The code generated is incorrect code.

    23.  DEFICIENCY

         More  than  eight  consecutive  assignments  cause  an  error
         message  (the  limit is eight) and an ILL-MEM-REF.  This is a
         user error  (more  than  eight  are  not  allowed),  but  the
         compiler should not crash.

    24.  BUG FIXED 7B(222)

         BREG is declared to be both LOCAL and EXTERNAL  by  BLISS-10,
         in the listing file.

    25.  BUG FIXED 7(215)

         Multiple FORWARD declarations are not allowed.

         Example:
              FORWARD  A;
              FORWARD  A;
                                                               Page 12


    26.  BUG FIXED 7(215)

         Actual arguments pushed on the stack by a routine call may be
         overwritten  when  one of the arguments is a block containing
         locals.

         Ex:
              EXTERNAL  BAZ;
              BAZ (1,2,BEGIN
                           LOCAL I,J,K;
                           K_10;
                           .K
                       END , 3)

    27.  BUG FIXED 7(215)

         REQUIRE file names cannot have the same name or extension  as
         a previously declared symbol.  This causes an error message.

         Ex:
              BIND  ABC=2;
              REQUIRE  ABC.REQ;

    28.  BUG FIXED 7(215)

         When MACROs consisting only of comments are used
         excessively, a PDL overflow occurs.

         Ex:
             MACRO  X=!!$;
             X  ABCDE
             X  ABCDE
             .
             .
             .
             X  ABCDE

    29.  BUG FIXED 7(215)

         The peephole optimizer attempts to replace a  store  followed
         by  a  load  with  a single store.  Unfortunately, a sequence
         such as

                    MOVEM   3,1(2)
                    PUSHJ   0,Y
                    MOVE    3,1(2)

         is incorrectly optimized.

         The optimizer does not know that a routine  call  can  change
         register  3.   This bug would arise in the following BLISS-10
         routine:

           ROUTINE  R =
               BEGIN
                                                               Page 13


               EXTERNAL X,Y,Z;
               LOCAL T;
               T = X();
               Y();
               Z = .Z+.T
               END;

    30.  BUG FIXED 7(215)

         The character manipulation built-in  functions  INCP,  SCANI,
         REPLACEI,  COPYNI, COPYIN, and COPYII, produce a side effect,
         i.e.  incrementing a byte pointer, that BLISS-10 is sometimes
         unaware  of.  If the byte pointer is brought from memory to a
         register, BLISS-10 may use the register value even though the
         memory value has been changed by one of the above functions.

         Example:

           ROUTINE R =
               BEGIN
               EXTERNAL X;
               LOCAL T;
               T = .X;
               IF SCANI(T)  THEN X = .T
               END;

         The updated value of T is not placed back in X.

    31.  BUG FIXED 7B(222)

         The chain of external references to a  given  symbol  is  not
         constructed  properly when some of the references fall in the
         low segment.  As a result the program is not linked properly.

         Example:

           EXTERNAL  A,B;
           BIND  C = PLIT (A,B);
           BIND  D = PLIT (A,A);

         If PLITS are put in the low segment,  a  linking  error  will
         result.

    32.  DEFICIENCY FIXED 7B(222)

         An error message is given each time an  undefined  symbol  is
         referenced  in  a  block.   A warning message should be given
         only for the first instance of the symbol.

    33.  BUG FIXED 7B(222)

         The peeophole optimizer tries to  replace  a  MOVE  and  test
         sequence with a SKIP instruction.  Thus,

           MOVE R,X
                                                               Page 14


           TLNN R, #400000

         becomes SKIPL R,X.  This should not be  done,  however,  when
         the test instruction is labelled.

         Example:

           REGISTER R;
           EXTERNAL X,Y;
           R = .X;
           WHILE .R<35,1> DO Y();

         This generates the above sequence.

    34.  BUG FIXED 7B(222)

         Extra blank characters are inserted into a quoted  string  if
         the string extends over more than one source line.

         Example:

           PLIT( 'HELLO-
           BLISS-10' );

         This string contains one extra blank character.

    35.  BUG FIXED 7B(222)

         Sometimes incorrect code for SELECT expressions is generated.

         Example:

           EXTERNAL X;
           ROUTINE XXX=
           BEGIN
           SELECT .X OF
           NSET
           1: RETURN 1;
           2:  RETURN 2;
           OTHERWISE: RETURN 0
           TESN;
           END;

    36.  BUG FIXED 7C(223) 

         When processing a complicated test expression  in  a  control
         expression, BLISS-10 may have difficulty attempting to dump a
         common subexpression contained in a register  to  the  stack.
         The  result  is  a  dangling  pointer  which may subsequently
         destroy the free storage chain and cause an ILL-MEM-REF.

    37.  BUG FIXED 7B(222)

         If ELUDOM is followed by a semicolon, or any other  delimiter
         except MODULE, the compiler loops.
                                                               Page 15


    38.  BUG FIXED 7E(225)

         A name prefixed by the escape character "?" is not  processed
         properly when it appears in a macro body.

         Example:

                    BEGIN
                    BIND ?X%Y=1;
                    MACRO FOO = ?X%Y$;
                    BIND A=FOO;
                    END;

         This gives the error message that X is undefined, because  %Y
         is  considered  to  be  the  start  of  a  comment.   This is
         corrected by new feature #6 described above.  Note,  however,
         that this example must now be written as

                 MACRO FOO = ?X%Y $;

         where the space between Y and $ is  necessary  to  prevent  $
         from being included in the ?-name.

    39.  BUG FIXED 7C(223)

         Incorrect code is generated when a memory location is updated
         using  a  dynamically  constructed  byte  pointer.   The byte
         pointer is constructed and used to correctly  modify  memory,
         but  BLISS-10  does  not  invalidate the previous copy of the
         memory from the register  table.   This  can  be  avoided  by
         declaring it as a register type.

         Example:

           ROUTINE R =
               BEGIN
               LOCAL X,Y,Z;
               X = 1;
               X<.Y<10,3>,5> = 2;
               Z = @X
               END;

    40.  BUG FIXED 7C(223)

         Bad symbol name is generated if the symbol is declared  using
         '?' and mixture of upper and lower case characters.

         Example:

           GLOBAL ?HelLo;
           EXTERNAL ?JbInt;

    41.  BUG FIXED 7C(223)

         Lower  case  character  in  a  string  in  a  MACRO  body  is
                                                               Page 16


         translated to upper case during MACRO expansion.

         Example:

           MACRO TEST = VREG = "a" $;
           TEST;

    42.  BUG FIXED 7D(225)

         BLISS-10 generates  the  error  message,  "Illegal  up  level
         addressing"  for  inner  declaration  of  "REGISTER T" in the
         following example.

         Example:

           GLOBAL ROUTINE R =
           BEGIN
           REGISTER T;
             BEGIN
             GLOBAL ROUTINE RR =
               BEGIN
               REGISTER T;
                  .
                  .
                  .
               END;
             END
           END;

    43.  BUG FIXED 7C(223)

         Bad code is generated  when  constant  CASE  or  constant  IF
         control  expressions are used.  BLISS-10 tries to use VREG as
         a target register.  It should  have  processed  it  like  any
         other ordinary expression.

         Example:

           EXTERNAL SRSEMP,SRSUBP,F;
           STRUCTURE SRSTACK[I]=
             (IF .I LSS 0
              THEN (.SRSEMP + (.I + 1))<0,36>
              ELSE (.SRSUBP + .I)<0,36>
              );
           EXTERNAL SRSTACK SRSTK;
           STRUCTURE SRELEM[X,I,P,S]=(@SRSTK[.SRELEM] +
                                        (.i - .X))<.P,>s>;
           BIND SRELEM SEMO = -1;
           ROUTINE SR26=
              BEGIN
              LOCAL LEX;
              LEX = .SEMO[0,2,0,36]; 
              SEMO[0,2,0,36] = F(2);
              .VREG
              END;
                                                               Page 17


    44.  BUG FIXED 7E(227)

         BLISS-10 does not give a very meaningful error  message  when
         the  illegal  /-V switch is used.  The error message produced
         is " ?P is an illegal switch ".

         Example:

           .R BLIS10
           *,A=A/-V

    45.  DEFICIENCY FIXED 7C(223)

         BLISS-10 does not allow $'s in comments in a MACRO body.

         Example:

           MACRO NOGO = %This is a dollar ... $ %$;

         See item 6 of section 2 for an alternative approach.

    46.  BUG FIXED 7C(223)

         Bad code is generated when common subexpressions are involved
         in  a  control  expression  and  a  expression which uses the
         control expression.

         Example:

           MACRO INDEX(ADDR) =
           BEGIN
              IF ADDR THEN 1
                      ELSE IF (ADDR AND  777)
                            THEN 2
                            ELSE 3
           END$;
           ROUTINE R(ADDR) =
                ((.ADDR AND  777) + INDEX(.ADDR));

    47.  BUG

         Bad code is generated for the following example.

         Example:

           MODULE L(DREGS=2,RESERVE(9,10,11,12,13,14,15)) =
           BEGIN
              GLOBAL ROUTINE R =
              BEGIN
              MACRO S(X) = PUSH(SREG,X)$;
              S(2);S(3);S(4);S(5);S(6);S(7);S(8);S(9);S(10);S(11);
              S(12);S(13);S(14);S(15);
              INCR I TO 12 DO
              INCR J TO  3 DO
                RETURN (.I + .J)
                                                               Page 18


              END;
           END ELUDOM

         The DREGS=2 and RESERVE( ) in MODULE head have  some  effects
         on this program.

    48.  BUG FIXED 7C(223)

         Bad code was generated when  routine  definitions  nested  in
         other  control  expression  contexts  use  INCR  or DECR loop
         expressions.   BLISS-10  did   not   preserve   the   savable
         temporaries across the routines.

         Example:

         ROUTINE ONE=
                       BEGIN
            LOCAL A[3];
            INCR I FROM 1 TO 3 DO A[.I]=3;
              BEGIN
               ROUTINE TWO=
                  BEGIN
                  LOCAL A[4];
                  INCR I FROM 1 TO 3 DO A[.I]=4;
                  END;
              END
            END;

    49.  BUG FIXED 7D(224)

         BLIS10 compiler loops in the following context.   BLIS10  did
         not  free all references to a register when that register was
         not free and used by MOD function.  The register content  was
         saved onto a stack, but did not free all it's references.

         Example:

           MACRO
                TAB= 11$,
                INBUFLEN=3000$,
                CR= 15$;
           EXTERNAL READLINE;
           STRUCTURE
              BYTE[I]=[(I+4)/5](.BYTE+(.I/5))<29-7*(.I MOD 5),7>;
           OWN
              IN,
              INSEQ,
              BYTE INLINE[INBUFLEN],
              BYTE LINE[80],
              INEND;
           ROUTINE GETLINE(POS)=
           BEGIN
             LOCAL CH,LEN,I,N;
             IF (LEN=READLINE(@IN,LINE,INSEQ)) LSS 0 THEN RETURN;
             I=-1;
                                                               Page 19


             INLINE[@POS+72]=" ";
             WHILE (CH=.LINE[I=@I+1]) NEQ CR DO
               BEGIN
               IF @CH EQL TAB 
                  THEN N=8-(@POS MOD 8)
                  ELSE
                  INLINE[@POS]=@CH;
               END;
             POS=@POS-1
             END;

    50.  DEFICIENCY FIXED 7E(225)

         Byte pointer creation.

         BLISS-10 would give the warning  ("Value  in  field  selector
         outside  permitted  range") for the following field selection
         cases.  The cases are P < 0, S < 0, X < 0, I < 0, P > 36, S >
         36,  X  >  15, and I > 1.  Where P = position field, S = size
         field, X = index register value, I = indirect bit value.

    51.  DEFICIENCY FIXED 7E(225)

         The machine instruction mnemonics used  in  the  listing  are
         limited to KA10 instructions.

         All KI10 machine instructions are now  added.   The  previous
         compiler  was  outputting  wrong  mnemonics  into the listing
         file.   Now,  the  listing  file  would  have   the   correct
         mnemonics.  In any case, the instructions in the REL file are
         okay.  The added instructions are

         DFAD,DFSB,DFMP,DFDV,DMOVE,DMOVN,FIX,DMOVEM,DMOVNM,FIXR,FLTR,
         MAP.

         Note that these  instructions  are  never  generated  by  the
         compiler except by an explicit MACHOP in the program source.

    52.  BUG

         Bad code was generated for the following case.  The  BLISS-10
         compiler  did  not  distinguish  the  symbol  'COUNT'  use in
         different context.  The loop name 'COUNT' is  different  from
         the external name used in the expression '.COUNT' .

           EXTERNAL COUNT,VALUE;
           DECR COUNT FROM .COUNT TO 0
                     DO  VALUE=1;
                                                               Page 20


4.0  INSTALLATION INSTRUCTIONS

The BLIS10.EXE and BLIS10.ERR files go on SYS:.  The  file  BLIS10.DOC
goes on DOC:.



5.0  INTERNAL CHANGES

The error file is once again BLIS10.ERR.



6.0  SUGGESTIONS

If you suspect bad code is being generated, try recompiling the module
with   /U.   This  turns  off  optimization--in  particular,  peephole
optimization.



[End of BLIS10.DOC]

[BLIS10 V6(212) is appended as an integral part of BLIS10 V7E(226)]
                                                               Page 21


BLIS10.DOC CHANGES FROM 5A(124) TO 6(212)
JANUARY, 1977
































Copyright (C) 1976, 1977
Digital Equipment Corporation,  Maynard, Massachusetts  01754

This software is furnished under a license for use only on  a
single computer system and may be copied only with the inclu-
sion of the above copyright notice.  This  software,  or  any
other  copies  thereof, may not be provided or otherwise made
available to any other person except for use on  such  system
and  to  one who agrees to these license terms.  Title to and
ownership of the software shall at all times remain in DEC.

The information in this software is subject to change without
notice and should not be construed as a commitment by Digital
Equipment Corporation.

DEC assumes no responsibility for the use or  reliability  of
its software on equipment which is not supplied by DEC.
                                                               Page 22


1.0  SUMMARY


BLISS-10 6(212) replacing BLISS-10 5A(124).


This version runs on TOPS-10 monitors from 5.07 to  present.   It  can
run  on  DECsystem-20  under  the compatability package.  This version
supercedes 5A(124).


A description of BLISS-10 is contained in

     DECsystem-10    BLISS-10    Programmer's     Reference     Manual
     DEC-10-LBRMA-A-D


2.0  External Changes


The macro code generated by BLISS-10 now places the  PLIT  area  after
the code, constant, and literal areas.  This is reflected in the macro
listing and the REL file.


3.0  Known Bugs and Deficiencies


 1.  Case Folding (translation of lower case to upper case)  does  not
     work with macro formal names in strings.

     Ex.

          EXTERNAL TYPSTR;              ! Types an ASCIZ string
          MACRO M(H)=TYPSTR('THE MESSAGE IS :h')$;
          M(WRONG)

     This should type:

          THE MESSAGE IS:WRONG

     Instead it types:

          THE MESSAGE IS:h

 2.  A quoted string longer than  1000  characters  gives  a  compiler
     error and dies.

 3.  A compiler error occurs if allocation declarations (LOCAL or OWN)
     appear in BEGIN ... END block of a structure.

 4.  A global routine should have a compound expression  or  block  as
     its  body.   Otherwise,  an  "illegal  up level addressing" error
     message may occur.
                                                               Page 23


     Ex:  MODULE AAA=
          BEGIN
              REGISTER A;
              GLOBAL ROUTINE MLIST=-2;
              A=-1;
          END
          ELUDOM

 5.  Bad code is generated for the last argument to the call  when  it
     is in a structure accessing definition.

     Ex:

          STRUCTURE FOO[I,J]=(BAZ(@.FOO,.I,.J));

     The call to BAZ has nonsense for its last argument.  This may  be
     fixed by inserting parenthesis around the last argument, thus

          STRUCTURE FOO[I,J]=(BAX(@.FOO,.I,(.J)));

 6.  An INDEXES name will give an error ("an operator must be followed
     by a simple expression") if it is not enclosed in parentheses.

     Ex.

          BIND B=PLIT(C INDEXES 4,5,6):
          IF .X EQL C THEN ...  fails.

     However,

          IF .X EQL (C) THEN ...

     works.

 7.  Bind within binds  yield  an  infinite  loop  or  illegal  memory
     reference

     Ex.

          BIND A=(BIND FOO=1;  FOO+5);

 8.  On rare occasion BLISS will lose track of the register  where  it
     has stored the value of an OWN and bad code is generated.

     Ex:

          OWN T;
          T=#123456654321;
       T<18,6>=0;
       T=..T +.(.T+1);

 9.  If a main module (with "STACK" or "START" in its  module  header)
     without  "TIMER=EXTERNAL(SIX12)",  or  the  like is compiled with
     "/D", an error message is produced.
                                                               Page 24


10.  BLISS will not accept a request for a require file  if  its  name
     begins with a number.

     Ex:

          123.BLI

11.  A zero index  on  an  indirect  vector  access  causes  an  error
     message.

     Ex:

          STRUCTURE S[I]=(..S+.I);
          LOCAL S X;
          X[0]=.X[0] +1;

12.  When #  is  not  followed  by  an  octal  digit,  the  result  is
     equivalent  to  #0.  Hence #-14 is decimal -14.  No error message
     is given.

13.  One cannot have several modules defined  in  a  file.   Only  the
     first module gets compiled.

14.  An error message may occur if a control expression involving VREG
     is the right operand of an assignment.  For example,

          A=IF .B THEN .C ELSE .VREG +1

     is an error, but

          A=(IF .B THEN .C ELSE .VREG+1)

     is not.

15.  Setting the CREF switch  in  module  header  with  no  list  file
     specified  in  the  command string bombs.  Sometimes it gives the
     error message "PDL OVERFLOW" or "I/O TO UNDEFINED CHANNEL".

     Ex:

          .R BLIS10
          *A=FILE.BLI
          WHERE FILE.BLIS CONTAINS:
            MODULE SSS(STACK,XREF)=
            BEGIN
            EXTERNAL A;
             A=12;
            END
          ELUDOM

16.  MACHOP JUMP instructions compile incorrectly.

17.  MACHOPS #127,#126 PRODUCE DPB,IDPB machine  instructions  in  the
     list file.  It should produce FLTR,FIXR machine instructions.  In
     any case, the instructions in the REL file are okay.
                                                               Page 25


18.  BIND to REGISTER does not work.

     Ex:

          REGISTER A;
          BIND B=A;     %FAILS%
          BIND C=(A);   %WORKS%

19.  Occassionally a BIND to a  pointer  with  the  indirect  bit  set
     causes an error message.

     Ex:

          BIND A=(300)<0,36,FREG,1>;

20.  A structure containing a compound  expression  may  not  generate
     correct code.

     Ex:

          STRUCTURE XXX[I.J]=
               [1](.I=I+.I;  .J=J+.J);
          OWN U,V,X,Y,XXX Z[2,3];
           .
           .
           .
          Z[(IF .X THEN U ELSE V),Y];

21.  Negative replication counts in PLIT;s  may  cause  a  variety  of
     problems such as:  infinite loops, empty PLIT areas, and nonsense
     PLITs.

     Ex:

          BIND B = PLIT(1,2,3,-2:(4))

22.  A TDZA instruction preceded by a SKIPN causes the wrong value  to
     be loaded into the register.

     Ex: EXTERNAL X,Y,Z;

         ROUTINE T(S) =
             BEGIN
             CASE .S OF
             SET
                 X = (.Y NEQ 0);
                 X = .Z
         TES;
         END;

     The code generated is incorrect code.

23.  More than eight consecutive assignments cause  an  error  message
     (the limit is eight) and an ILL-MEM-REF.
                                                               Page 26


24.  BREG is declared to be both LOCAL and EXTERNAL by BLISS-10.


4.0  Installation Instructions


The BLIS10.EXE and BL10ER.ERR files go on SYS:.  The  file  BLIS10.DOC
goes on DOC:.


5.0  Internal Changes


There are two major internal changes:  numerous bugs have  been  fixed
and several new features have been added.


5.1  New Features Added Since Version 5A(124).


These are as follows:

 1.  ALLMACHOP -
     JSYS the TOPS-20 monitor interface command has been added to  the
     ALLMACHOP list.  Its value is octal 104.

 2.  EXTERNAL -
     Multiple declaration of a name as external in the same  block  is
     now allowed.

 3.  MACROS -
     For various reasons, a user may wish to include a comment in  the
     body  of a MACRO.  To do this, the user may now use a double "!".
     No separation may appear between the  exclamation  marks.   Macro
     formals  are not expanded within a comment.  A "$" may not appear
     as part of any comment inside a MACRO.  If  one  does  appear  it
     will  terminate the MACRO definition.  If the comment was started
     with a single "!" or with a "%" then the  comment  will  also  be
     terminated.   If  the  comment was started with a double "!" then
     the comment in the  definition  will  also  be  terminated.   The
     comment  in  the  expansion, however will not be terminated until
     the end of the line on which the macro name occurs.

 4.  LOWER CASE -
     Lower to upper case conversion is done for identifiers.

 5.  LINKAGE -
     (A)  All  declaration  usages  formerly  allowing   an   optional
          structure-name now allow an optional linkage name to precede
          the optional structure name.  Thus, the  following  are  now
          correct:

               LOCAL /LINKX/ /STRUX/ NAME /[...]/ ...
               MAP /LINKX/ /STRUX/ NAME /[...]/ ...
                                                               Page 27


          where by /.../ is meant an optional item  and  by  LINKX  is
          meant a name declared in a linkage declaration of the form:

               LINKAGE LINKX=ENTXIT(...,...);

          LINKAGE NAMES USED IN THIS WAY ARE NOT INTENDED TO HAVE  ANY
          EFFECT AT PRESENT.

     (B)  LINKAGE  NAMES  MAY  APPEAR  IN  FORWARD  AND   IN   ROUTINE
          DECLARATIONS AS FOLLOWS:

               FORWARD /LINKX/ NAME, ...
               ROUTINE /LINKX/ NAME .....

          If a name has a linkage name associated with  it  through  a
          forward  declaration,  then  it must not have a linkage name
          associated with it when it is redeclared later as a routine.

          The effect of  these  declarations  is  to  alter  the  code
          generated  at  routine  entry  and exit:  instead of .ENT.0,
          .ENT.1, ...  AND .EXT.0, ..., names derived from the linkage
          declaration  of the linkage name will be used.  Furthermore,
          the use of the XXXX.0 forms is not optional:  every entry to
          and  return from a routine declared with linkage will be via
          an XXXX.N form.

          A sample program showing proper coding follows:

          LINKAGE INOUT=ENTXIT(WAYIN,WAYOUT);
          EXTERNAL ?WAYI.0,?WAYI.1,?WAYI.2, ..., ?WAYI.5
          EXTERNAL ?WAYO.0,?WAYO.1,?WAYO.2, ... ,?WAYO.5
          FORWARD INOUT R1,R2,R4;
          ROUTINE R1=1;
          ROUTINE R2=2;
          ROUTINE INOUT R3=3;
          ROUTINE R4=4;

          -----WAYIN  is  presumably  a  macro  program  assembled  in
          high-seg with the names WAYI.1, etc., declared "INTERN".

     Linkage is not provided for functions or co-routines.

 6.  PORTAL -
     The keyword "PORTAL" may optionally replace the keyword  "GLOBAL"
     before  "ROUTINE".   The  effect of this substitution is to cause
     the portal instruction "JRST 01,.+1" to be generated as the first
     instruction  at the entry to the routine and otherwise to compile
     the routine as if it had been declared "GLOBAL ROUTINE".

     The use  of  "PORTAL"  conflicts  with  the  inspect  feature  of
     BLISS-10;  thus it should not be used in a program being compiled
     under /I.  "PORTAL" may be used with /D and /T.

     Usage:  PORTAL is to be used when a program is to be protected at
     level  6.   A  routine  declared  with  PORTAL may be called from
                                                               Page 28


     low-seg.  Thus PORTAL is expected to be  used  only  for  entries
     actually  called  from lo-seg.  If a BLISS program is compiled in
     low-seg and called from high-seg, then PORTAL will not work:  the
     solution  is  a  linkage  to  exit  from the lo-seg routine via a
     linkage  segment  in  high-seg  which  begins   with   a   PORTAL
     instruction.

     MACRO programs in  lo-seg  must  be  compiled  with  literals  in
     lo-seg,  for it will not be possible to read literals in high-seg
     from lo-seg.

 7.  UPLIT -
     UPLIT is now a reserved word.  It may be used as PLIT is used and
     has the effect of creating a PLIT without a preceding count word.

 8.  OFFSET -
     OFFSET(FORMAL = -N , for the Nth parameter (i.e.,  FORMAL)  TO  A
     ROUTINE.

     OFFSET(LOCAL) = +N , where local  is  stored  N  words  down  the
     stack.

     OFFSET(LOCAL)  is  not  treated  internally  as  a  literal   and
     therefore not all usages are allowed.  The following are allowed:

     PLIT(OFFSET(LOCAL));
     PLIT(#123456^18+OFFSET(LOCALL));
     PLIT(#123456^18+OFFSET(LOCAL+DELTA));

     Note:  if X is a local or a routine formal, then
          .(.FREG+OFFSET(X)) is equivalent to .X.

 9.  NULL SWITCH -
     NULL SWITCH for module head and switches declaration.

     Action:  none.

10.  INPUT LINE LENGTH -
     Maximum input line length is now 145 characters  (tabs  count  as
     one character).

11.  COMMAND LIST "#" -
     A command line consisting of a file name followed by a  "#"  will
     cause  the program on that file to be run.  The default device is
     "SYS".  This is same as "!" except "!" causes the program  to  be
     started at its starting point plus 1.

12.  CHARACTER "&" -
     The character "&" may be used as an alphabetic character in names
     without  preceding the name with a "?".  It is equivalent to ".",
     which may still be used with old "?" notation.

     Example:  'WAIT&1' is equivalent to '?WAIT.1'.

13.  LINK TIME CONSTANTS -
                                                               Page 29


     Link time constants have been expanded.  Link time constants  are
     the legal entries in a PLIT.

     <LTC> = <CTC>
             <VAR TYP1>
             <VAR TYP2>
             <VAR TYP1> + <CTC>
             <CTC> + <VAR TYP1>
             <VAR TYP1> = <CTC>

     <VAR TYP1> = <OWN VARIABLE>
             <GLOBAL VARIABLE>
             <EXTERNAL VARIABLE>
             <PLIT>

     <VAR TYP2> = <ROUTINE>
             <FORWARD>
             <FUNCTION>
             <GLOBAL ROUTINE>

     <CTC> = <COMPILE TIME CONSTANT>

14.  GLOBAL BIND -
     Global binds may be made to any link time constant.

15.  BLISS-36C SPECIAL FEATURES -
     The three module head switches  "BLS36",  "IDELETE"  and  "B10NL"
     have  been  added.  Also two new keywords, "LOAD&" and "LIBRARY&"
     with the  corresponding  special  declarations  are  implemented.
     These  special  features  are  intended  only  to  facilitate the
     processing of BLISS-36C programs.


6.0  Suggestions


None


[End of BLIS10.DOC]