Trailing-Edge
-
PDP-10 Archives
-
BB-H138C-BM
-
5-documentation/blis10.doc
There are 18 other files named blis10.doc in the archive. Click here to see a list.
BLISS.DOC -- Changes from V6(212) to V7E(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.
BLS7E.DOC Page 2
BLISS.DOC -- Changes from V6(212) to V7E(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
size.
BLS7E.DOC Page 3
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,
as follows: SREG=#17, FREG=#15, VREG=#1, DREGS=7, and #0 and
#16 are reserved. Of course explicit assignments given in
BLS7E.DOC Page 4
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
MACRO JBDAT = ?.JBDAT $;
BLS7E.DOC Page 5
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;
VREG = B;
VREG = C;
BLS7E.DOC Page 6
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 = C0,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:
4,5,7,8,10,11,12,13,17,18,21,22,24,25,
BLS7E.DOC Page 7
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
GLOBAL ROUTINE ONE=
BLS7E.DOC Page 8
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.
BLS7E.DOC Page 9
Ex:
OWN T;
T=#123456654321;
T18,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)
BLS7E.DOC 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.
BLS7E.DOC 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;
BLS7E.DOC 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
BLS7E.DOC 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
BLS7E.DOC 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 .R35,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.
BLS7E.DOC 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.Y10,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
BLS7E.DOC 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;
BLS7E.DOC 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)
BLS7E.DOC 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;
BLS7E.DOC 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;
BLS7E.DOC 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)]
BLS6.DOC Page 21
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.
Ex: MODULE AAA=
BEGIN
REGISTER A;
GLOBAL ROUTINE MLIST=-2;
A=-1;
END
ELUDOM
BLS6.DOC Page 22
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;
T18,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.
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
BLS6.DOC Page 23
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.
18. BIND to REGISTER does not work.
Ex:
REGISTER A;
BIND B=A; %FAILS%
BIND C=(A); %WORKS%
BLS6.DOC Page 24
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.
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:.
BLS6.DOC Page 25
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 /[...]/ ...
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 .....
BLS6.DOC Page 26
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
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.
BLS6.DOC Page 27
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 -
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>
BLS6.DOC Page 28
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]