[Info-vax] More "notes from the x86 compilers"

John Reagan xyzzy1959 at gmail.com
Tue Dec 17 23:52:27 EST 2019


This is a combo "recent bugs we just fixed" and a BLISS Tip 'O The Week.

BLISS has a declaration named BIND.  BIND associates a name with an expression (usually an address).  There is also a GLOBAL BIND which makes the name visible
to the linker.  You normally see two common forms.

GLOBAL BIND
   TABLE_OF_VALUES = UPLIT(LONG(1,2,3));

that associates the name TABLE_OF_VALUES to a UPLIT (Uncounted Pure LITeral) that contains three longwords with values 1, 2, and 3.  You can think of this as a normal global variable TABLE_OF_VALUES that is an array of longwords with initial values of 1,2, and 3.  

One bug fixed was that we allocated that 1,2,3 into an anonymous piece of storage and instead of binding the name TABLE_OF_VALUES to that storage, we allocated TABLE_OF_VALUES separately to a bunch of 0s.  Wrong!  Fixed that one.

The other common form of GLOBAL BIND is

GLOBAL BIND
   DEFAULT_TABLE_VALUE = TABLE_OF_VALUES[2];

That associates the name DEFAULT_TABLE_VALUE to the address of TABLE_OF_VALUES[2].  In a language like C, you'd have to declare DEFAULT_TABLE_VALUE as a pointer to a longword and follow the pointer.  With BLISS, DEFAULT_TABLE_VALUE doesn't allocate any storage.  It is purely a label to the middle of some other variable.  I'll let you guess what went wrong here...  :)

For these type of GLOBAL BINDs, we have to work around some limitations in the older LLVM we're using for the cross-compilers, but with after lots of debugging (and perhaps a little red wine), I got it working.

With both of these bugs out of the way, EDT now seems to be mostly functional and AUTHORIZE can create a fresh SYSUAF and you can create an account.



More information about the Info-vax mailing list