The general rule is that HLASM programs which assemble without
error should always continue to generate compatible binary code,
preferably identical.  In this case we failed to spot that
people could be using the type attribute to test for a
self-defining term and assume that it was positive as a result,
because self-defining terms can also be hexadecimal, binary or
character, all of which can already have negative values.

We sometimes have to make an exception if a program is in error
but HLASM failed to detect it.

The only "incompatibility" I am aware of in that category
relates to APAR PH30060, which added a missing check to detect
when an opcode had been changed to a reserved macro opcode using
OPSYN between the time the macro was defined and the macro was
executed.  This check was done if the opcode was generated by
substitution, giving message ASMA001E in that case, but was
overlooked if the instruction was changed using OPSYN.  The
result was likely to be HLASM terminating with ASMA951U because
of a bad branch, which is what the APAR fixed, but after fixing
it we found that someone had been changing PRINT to ANOP with
OPSYN and had been getting away with it because in that case the
bad branch happened by chance to cause the operation to be
ignored!  That was easily solved by defining a dummy PRINT macro
instead.

We sometimes also make harmless changes which affect the object
code (although we try to avoid those if possible).

Many years ago, when quadword alignment was introduced, support
for 16-byte aligned literals was added as a separate alignment
level, so existing programs which happened to have 16-byte
literals now had those generated before all 8-byte literals,
instead of being included in the 8-byte alignment group.  (I
would personally have said that should only have been done when
16-byte section alignment was in effect, to avoid unnecessary
differences, but that was before my time in HLASM).

More recently, we discovered some inconsistencies in how
literals got defined.  Some references to literals in macros
were causing the literal to be defined at the time the macro was
defined, even if the relevant statement was never reached when
the macro was executed.  Also, references to attribute of
literals (in particular the length attribute) were causing the
literal to be defined even when there was no reference to the
literal itself, so it was not needed.  These problems were
fixed as part of APAR PH43846, which can therefore mean that
some unreferenced literals will no longer be generated, but
this was considered safe enough because it will never cause
generation of additional literals.

Jonathan Scott, HLASM
IBM Hursley UK

Reply via email to