| T.R | Title | User | Personal Name
 | Date | Lines | 
|---|
| 108.1 | Are there objections to this? | AD::LOWNEY |  | Wed Jan 29 1997 18:36 | 5 | 
|  | 
Is there a reason not to support this?  Our products (GEM and asaxp)
have already been changed to behave this way.  NTOM will require it.
 | 
| 108.2 | Sauce for the goose... | WIBBIN::NOYCE | Pulling weeds, pickin' stones | Thu Jan 30 1997 11:05 | 4 | 
|  | Does NTOM produce procedure descriptors for all the code it
generates?
I support this proposal.
 | 
| 108.3 | Need a rule for legacy object and images | STEVEN::hobbs | Steven Hobbs | Thu Jan 30 1997 11:35 | 11 | 
|  | I would like to include wording that says legacy images and legacy
objects are still supported for execution.  In particular, this new
rule should not permit changes to the linker or image activator that
cause existing objects and images to break.
I am willing to have a rule that says the image optimizers, such as
NTOM, and debuggers can require that old objects and images must be
regenerated in order to use these tools.  It would be nice if these
new tools could detect legacy data and give a warning if the tool
might not work but I do not know if NT objects and images have the
necessary version control information.
 | 
| 108.4 | re .2 and .3 | AD::LOWNEY |  | Thu Jan 30 1997 14:14 | 23 | 
|  | 
re: .2
Yes, NTOM creates procedure descriptors for all the code it generates. 
The only exception are the thunks generated by the linker, which have
no procedure descriptors. 
re: .3
In almost all cases, NTOM will be able to detect an old image, for it
will see a bsr to a location without a procedure descriptor.
NTOM has a set of conservative heuristics for dealing with images
without full procedure descriptor coverage.  If it can't prove
something is code, it assumes it is data.  If data looks like a
potential branch, the source and target of the branch are locked so
that no relocation occurs.  Sometimes this locking is so extensive
that no optimization can occur (or we ignore the problem cases, which
are invariably true data).
 | 
| 108.5 | First cut at possible ECO text | GEMGRP::BRENDER | Ron Brender | Fri Feb 07 1997 11:36 | 66 | 
|  | Here is a first cut at trying to capture these ideas in text appropriate
for the WNT calling standard. This is not yet a formal ECO. Look at the
text and consider the questions that follow...
--------------------------------------------------------------------------------
In the introduction to Chapter 8, page 8-1, modify the following
        Every non-null frame procedure must have an associated procedure
        descriptor. Most commonly there will be one procedure descriptor
        for each non-null frame procedure; however, there may be more than
        one procedure descriptor used to describe a procedure.
        When there is more than one procedure descriptor for a procedure, the
        following must hold:
to
  - Insert new text after the first sentence (see below)
  - Start a new paragraph with the second sentence, and merge it with the
    next paragraph.
to get this result:
        Every non-null frame procedure must have an associated procedure
|       descriptor. While not strictly required, for the benefit of post-
|       linktime tools that analyze, manage and/or modify executable images,
|       it is strongly recommended that null frame procedures have an
|       associated procedure descriptor as well. For this purpose, it is
|       valid for a contiguous group of null frame procedures to be described
|       by a single procedure descriptor.
        Most commonly there will be one procedure descriptor for each non-null
        frame procedure; however, there may be more than one procedure
        descriptor used to describe a procedure. When there is more than one
        procedure descriptor for a procedure, the following must hold:
--------------------------------------------------------------------------------
There are two key ideas here:
  - strongly recommend procedure descriptors for null frame procedures
    rather than absolutely require.
    I suggest this because
      . It is "upward compatible" with existing practice, so long as tools
        are prepared to deal gracefully with older images.
      . It does not have to specifically name particular exceptions, such
        as linker transfer vectors
      . It leaves open the possibility of run-time generated code without
        having to provide means to register procedure descriptors at run-time
	(Note: Monty, and TVB before him, have done some work toward providing
	such an interface, but it is not ready for prime time yet.)
  - establish that a group of null frame procedures can be described by a
    single procedure descriptor
The latter is motivated in part to make exceptions for the likes of linker
transfer vectors unnecessary or at least unimportant on the grounds of overhead
space dedicated to "useless" procedure descriptors. So, if you like the
second idea, you might want to go "all the way" and require *all* statically
generated code to have procedure descritors.
What do you think:
  - is "strongly recommended" strong enough?
  - is one procedure descriptor for many null frame procedures OK?
 | 
| 108.6 | How about data in a text section | SMURF::GAF | Jerry Feldman, Unix Dev. Environment, DTN:381-2970 | Fri Feb 07 1997 14:08 | 5 | 
|  |     One area that is not covered is data in the text sections. Currently,
    the rule that the assembler is using is that if it is in the text
    section, it gets a procedure descriptor. I don't know if any of the
    compilers put actual data into text sections, but there are many
    assembler programs that do. 
 | 
| 108.7 | Not so much sections, but data within instructions? | GEMGRP::BRENDER | Ron Brender | Fri Feb 07 1997 14:51 | 17 | 
|  | >    One area that is not covered is data in the text sections...
Actually, that is more or less intentional. The notion of sections, how
managed by the linker, and so on, deal with mechanisms that are not addressed
by the calling standard as such. (Many of us have often wished there was a
book that described such another level of "run time architecture" but...
and actually the Object File and Symbol Table Specification begin produced
by the OF/ST Working Group is going to come pretty close.)
So long as procedure descriptors do not "cover" any data that happens to be
in the text section, I think there is no problem. If a procedure descriptor
does cover data, whether in the text or data section, then tools like om
are likely to be mislead.
Since everything about procedure descriptors is stated in terms of instructions,
it has not occurred to me that a rule prohibiting data within the BeginAddress..
EndAddress range is needed. But, maybe it is?
 | 
| 108.8 |  | DECCXL::OUELLETTE |  | Mon Feb 10 1997 11:29 | 3 | 
|  | Some of NT is compiled with the -cbstring switch.
That causes local string literals to be attached to their procedure's .text
section.
 | 
| 108.9 | when is data data and not instructions | SMURF::GAF | Jerry Feldman, Unix Dev. Environment, DTN:381-2970 | Mon Feb 10 1997 17:10 | 8 | 
|  |     WRT: .7
    Actually, there are some interesting issues. We can assume that .ascii
    is generally data, but what about a .long. It is a common practice to
    encode an instruction that is not yet implemented in the assembler. 
    
    In the current version of asaxp, when a data directive is encountered, 
    the assembler terminates the current procedure descriptor and creates a
    new one. However, the data is still covered by a procedure desriptor. 
 | 
| 108.10 | please make this a requirement | AD::LOWNEY |  | Mon Feb 10 1997 18:48 | 57 | 
|  | The point of this ECO is to enable NTOM to distinguish code from data.
NO DATA should be covered by a procedure descriptor, and ALL CODE
should be covered by a procedure descriptor.
I would like the ECO to state this clearly.  My motivations:
    - We need to cut over to this policy to make NTOM effective.
      Conservative heuristics can work, but they limit optimization.
    - I would like everyone within Digital to understand the policy.
    - I want a unambiguous document to give to external compiler vendors.
Here is my attempt to write it.   ** marks the new text; any other change
is unintentional.
------------------------------------------------------------------------
    Procedure descriptors serve these functions:
    1. They provide a means to map from an arbitrary program counter
       value to the descriptive information associated with the code at 
       that address.
    2. They provide information about a procedure ... that is needed for
       call chain walking in general and exception handling in particular.
    3. They provide means for link-time, post-link-time and execution-time
       tools to identify all of the the instructions that make up a complete
       procedure, which provides information about the availability of general
       register R28 for use by those tools ...
**  4. They provide a means for link-time and post-link-time tools to distinguish
**     code from data.  No data should be covered by a procedure descriptor, and all
**     instructions should be.
**  Every procedure must have an associated procedure descriptor, with two
**  exceptions discussed below.  Most commonly there will be one procedure
**  descriptor for each procedure; however, there may be more than one.
    When there is more than one procedure descriptor, the following must hold:
        o ...
        o ...
    Two instructions are part of the same procedure if and only if they have the
    same primary procedure descriptor or neither is described by a procedure
    descriptor.
**  We require procedure descriptors for null-frame procedures only to distinguish
**  code from data at link-time or post-link-time.  This permits two exceptions
**  to the requirement:
**      o Procedure descriptors are not required for transfer vectors generated
**        by the linker.
**      o Procedure descriptors are not required for null-frame procedures
**        created a run-time.
**  We also permit a contiguous group of null frame procedures to be described
**  by a single procedure descriptor.
-------------------------------------
We also need to 3.1.4, where it states that null frame procedures do not need
a procedure descriptor.
 | 
| 108.11 | Yes | DECWET::GLOSSON |  | Mon Feb 10 1997 19:31 | 13 | 
|  | Microsoft feels perfectly at home placing data in .text sections.
Fortunately for us, they have to yet to decide to place it
within a procedure descriptor.  We should approve this ECO
rapidly to forstall them from getting any ideas. :-)  When
data is emitted within a .text section, it is placed either
immediately prior to the entry of or immediately after the 
conclusion of the text associated with a function, so such data
is not currently covered by any procedure descriptor.
Actually, I don't have any problem with this ECO as it is well
within the bounds of actual practice.
I vote Yes.
 | 
| 108.12 | There are some real world MS cases | SMURF::GAF | Jerry Feldman, Unix Dev. Environment, DTN:381-2970 | Tue Feb 11 1997 13:01 | 8 | 
|  |     I have seen a case in some Visual Basic code where there are no
    .ent/.end pairs, in sequences of code/data/code/data...
    
    In the assembler, we have a way to automatically generate the correct
    procedure descriptors around the data. Through a miscommunication with
    Geoff, this does allow data to creep into the procedure. I am currently
    correcting that problem, and we will hopefully get that version of the
    assembler into VC++5.0. 
 | 
| 108.13 | "Coverage" is independent of sections | GEMGRP::BRENDER | Ron Brender | Thu Feb 13 1997 09:53 | 26 | 
|  | If I am interpreting correctly, I am hearing a strong pitch from Geoff to
make it mandatory to "cover" all code (with named exceptions) and no
resistance from others. Accordingly, I will re-draft the proposed ECO along
those lines (using language similar to that suggested by Geoff).
Before I do that, however, I do want to comment on a couple related notions
that been mentioned above.
Re .6 & .8: The ECO says nothing about sections, and does not prohibit
mixing code and data in the same section (whether .text, .data, or otherwise).
Re .9: It is not clear to me that the assembler should assume that a .long
directive necessarily is data or necessarily should start a new procedure
descriptor. But that is probably the dominant case, so maybe that is the
right handling. Of course, if .long is assumed to be data then it should
terminate the current procedure descriptor, but *not start a new one* of
itself, so that the data is not covered by a procedure descriptor. This
is probably the correction that Jerry is taking about in .12.
In order to support the reported practice of using .long to encode instructions
prior to the availability of appropriate nmemonics, there are several
alternatives. Perhaps the simplest is to add a .inst directive, which
behaves very much like .long except that it is treated as an instruction
wrt to procedure descriptor management. Other solutions might involve the
ability to define new instruction nmemonics. In any case, the solution is
outside the scope of the call standard per se.
 | 
| 108.14 | I concur with Geoff's assesment | SMURF::GAF | Jerry Feldman, Unix Dev. Environment, DTN:381-2970 | Thu Feb 13 1997 11:04 | 23 | 
|  |     Re: .13
    I agree with Geoff. The assembler currently covers all code by a
    procedure desriptor. It does not cover data.
    
    Also, the assembler has already implemented the .instr directive which
    has the identical syntax as .long, but is treated as an instruction of
    unknown type. I had implemented this as a way to support NTOM. 
    In the current version of the NT assembler, data directives, .long, 
    .ascii, .quad, etc, cause the assembler to generate a .end directive,
    terminating the procedure descriptor. A new procedure descriptor is
    created upon encountering an instruction, or a procedure entry
    directive, such as .ent or .aent. The assembler also guarantees proper
    alignment in some perverse cases:
    
    	.ent main
    	.globl main
    main:
    	<some code>
    	.ascii "ab\0"
    1:
    	<more code>
    The assembler will insert an alignment prior to the symbol, 1: and the
    resumption of code. 
 | 
| 108.15 | Remember inline parameters on 7094 and pdp-10 | STEVEN::hobbs | Steven Hobbs | Thu Feb 13 1997 13:42 | 18 | 
|  | One of the reasons assembler programmers use .long in a code section
is for "inline parameters" (it is possible that John Yates
has used these in the FX32 emulator).  Here is an example of a call
with two inline parameters.
	jsr	R28,routine
	.long	parameter1
	.long	parameter2
	nop			! return location
The called routine uses r28 to address the two inline parameters and
bumps r28 by 8 before returning.
I believe that inline parameters are prohibited and that these
parameters need not be supported by NTOM (but NTOM can easily support
them if they not described as being code).  I also believe that inline
parameters need not be supported by the jacketting code that supports
sharable images.
 | 
| 108.16 | ECO follows, please vote | GEMGRP::BRENDER | Ron Brender | Thu Feb 13 1997 15:02 | 6 | 
|  | The following note presents the formal ECO on this topic. Please cast your
ballot in this conference no later than
	Monday, 24 February
Thanks.
 | 
| 108.17 | Proposed WNT ECO 8 | GEMGRP::BRENDER | Ron Brender | Thu Feb 13 1997 15:03 | 56 | 
|  | 			WNT Call Standard ECO 8
			      regarding
		      Procedure Descriptor Coverage
Abstract
--------
Procedure descriptors are required for all code (and no data).
Proposal
--------
In Chapter 8-1, page 8-1, introductory paragraph, add a new numbered bullet
as follows:
	4.  They provide the means for link-time and post-link-time tools
	    to distinguish code and data.
Change the next paragraph to:
	Every procedure must have an associated procedure descriptor, with
|	the exception of certain null frame procedures as described below.
	Most commonly there will be one procedure descriptor for each
	procedure; however, there may be more than one procedure descriptor
|	used to describe a procedure. In addition, it is valid for a
|	contiguous group of null frame procedures to be described by a
|	single procedure descriptor.
Just prior to Section 8.1, insert the following new paragraph:
	Procedure descriptors are rquired for null frame procedures except
	for the following:
	1.  Transfer vectors created by the linker
	2.  Null frame procedures created at run-time
Discussion
----------
See the discussion in ALPHA_CALLSTD notes 108.*, especially .0, .10 & .13.
Steve Hobbs has verbally argued that this new requirement must not be
construed to prevent old/exiting objects from linking and/or old/existing
images from loading and successfully executing. That is, it is OK for the
likes of NTOM to be less effective, or even fail, if this requirement is not
met, but not other traditional linking and execution activities. We don't
have a way to state should backward compatibility support rules in the call
standard, so I won't try to create any language along these lines. In this
case at least, I don't think there is any real problem since GEM has been
following this rule for some time (and transfer vectors are not affected).
 | 
| 108.18 | YES | WIBBIN::NOYCE | Pulling weeds, pickin' stones | Thu Feb 13 1997 15:53 | 14 | 
|  | I vote YES.
Some editorial clarifications:
change
	4.  They provide the means for link-time and post-link-time tools
	    to distinguish code and data.
to
	... to distinguish code from data.
	Procedure descriptors are rquired for null frame procedures except
typo                              required
	-- WOL (Ring if an Rnsr is Rquird)
 | 
| 108.19 | Yes | WIDTH::MDAVIS | Mark Davis - compiler maniac | Fri Feb 14 1997 10:27 | 0 | 
| 108.20 | section 3.1.4 as well | AD::LOWNEY |  | Fri Feb 14 1997 16:25 | 2 | 
|  |     Do you need to change 3.1.4 as well, where it says a reg. frame
    procedure need not have a procedure descriptor?
 | 
| 108.21 | Per .18 & .20: Updated WNT ECO 8 | GEMGRP::BRENDER | Ron Brender | Mon Feb 17 1997 14:21 | 63 | 
|  | 			WNT Call Standard ECO 8
			      regarding
		      Procedure Descriptor Coverage
Abstract
--------
Procedure descriptors are required for all code (and no data).
Proposal
--------
In Section 3.1.4, page 3-5, change the last sentence to:
	This special case of a register frame procedure is of interest
|	because such procedures may not need an associated procedure
|	descriptor in certain cases (see Chapter 8, Procedure Descriptors).
In Chapter 8, page 8-1, introductory paragraph, add a new numbered bullet
as follows:
	4.  They provide the means for link-time and post-link-time tools
	    to distinguish code from data.
Change the next paragraph to:
	Every procedure must have an associated procedure descriptor, with
|	the exception of certain null frame procedures as described below.
	Most commonly there will be one procedure descriptor for each
	procedure; however, there may be more than one procedure descriptor
|	used to describe a procedure. In addition, it is valid for a
|	contiguous group of null frame procedures to be described by a
|	single procedure descriptor.
Just prior to Section 8.1, insert the following new paragraph:
	Procedure descriptors are required for null frame procedures except
	for the following:
	1.  Transfer vectors created by the linker
	2.  Null frame procedures created at run-time
Discussion
----------
See the discussion in ALPHA_CALLSTD notes 108.*, especially .0, .10 & .13.
Steve Hobbs has verbally argued that this new requirement must not be
construed to prevent old/exiting objects from linking and/or old/existing
images from loading and successfully executing. That is, it is OK for the
likes of NTOM to be less effective, or even fail, if this requirement is not
met, but not other traditional linking and execution activities. We don't
have a way to state should backward compatibility support rules in the call
standard, so I won't try to create any language along these lines. In this
case at least, I don't think there is any real problem since GEM has been
following this rule for some time (and transfer vectors are not affected).
 | 
| 108.22 |  | DECWET::MVB | Monty VanderBilt | Tue Feb 18 1997 16:31 | 1 | 
|  | Yes
 | 
| 108.23 | APPROVED | GEMGRP::BRENDER | Ron Brender | Tue Feb 25 1997 14:28 | 5 | 
|  | Having been accepted by the Calling Standard Committee and there being no
issues or suggestions posted, this ECO is
                                APPROVED
 | 
| 108.24 | WNT Call Std Working Draft X1.10 Available | GEMGRP::BRENDER | Ron Brender | Tue Feb 25 1997 15:19 | 5 | 
|  | Working draft X1.10 (with change bars) of the Alpha WNT Calling Standard, which
incorporates ECOs 6 through 8 is available in
        GEMGRP::GEM2$:<BRENDER.PUBLIC>ALPHA-WNT-CALL-STD-X110-970225.PS
 | 
| 108.25 | Some assembler anomalies with PDs. | SMURF::GAF | Jerry Feldman, Unix Dev. Environment, DTN:381-2970 | Wed Mar 12 1997 13:07 | 60 | 
|  |     We discovered a few problems related to procedure descriptors. This
    probably only affects assemblers.
    Case 1: A sub-procedure that contains a .prologue directive, 
            but no instructions in the prolog. 
            The WNT assembler was generating a descriptor for
            the empty prolog as well as for the body. 
            This was definitely a bug in the assembler. 
            The ots divide functions present this case>
    
    Case 2: A procedure with at least one alternate entry point
            (or a split procedure) where the main entry point
    	    and the following alternate entry point have the same
            address, for example:
    	
    		.globl foo
    		.ent   foo
    foo:
    		.set noat
    		.set noreorder
    		.frame	sp, 0, r26
                .globl fubar
    	        .aent  fubar
    fubar:
                .set noat
                .set noreorder
                .frame  sp, 0, r26
                --- Some code
    		.globl bar
    		.aent  bar
    bar:
                .set noat
                .set noreorder
                .frame  sp, 0, r26
        	--- mode code
    		.end
    	In this case, the assembler was generating 3 procedure descriptors.
    	The PD for the primary entry point, foo, had the begin, end, and
    prologend all pointing to the same address. The implemented solution
    was to produce 2 procedure desriptors:
    1. foo ending at the .aent bar directive.
    2. bar ending at the .end directive.          
    Entry point fubar would not receive a procedure descriptor of its own.
    The net effect is that the .ent fubar directive would be parsed for
    syntax, but would contain no semantic actions.
    
    Both of these cases came from the ots_divide module in Windows NT. 
    The empty prolog case is probably more common in the real world where
    there might be a common code base for NT and DU:
    
    	.globl foo
    	.aent   foo
    foo:
    	ldgp	$gp, 0($27)		# load the global pointer
    	.prologue 1
    	---- some code
    	.end
    
    The assembler in NT treats the ldgp as a nop causing the prologue to be
    empty.  
    
 | 
| 108.26 | No Call Std bug, right? | FLYBA::BRENDER | Ron Brender | Tue Mar 25 1997 11:10 | 10 | 
|  | Re .-1
Jerry,
Just let me make sure I am understanding correctly: You are posting some info
regarding problems with the implementation of this ECO in the assembler, but
you are not suggesting that there is any problem to be dealt with in the Call
Standard itself -- right?
Ron
 | 
| 108.27 | Maybe we should add a sentence | SMURF::GAF | Jerry Feldman, Unix Dev. Environment, DTN:381-2970 | Tue Mar 25 1997 13:38 | 18 | 
|  |     Re .-2 and .-1
    Ron,
    The two issues I raised were more implementation issues. In essence,
    what to do if a procedure actually contains no code. I don't think that
    the GEM based compilers would produce that type of code, but the ACC
    compiler and, presumably the GCC compiler could. In both cases, the
    assembler must have a rule to deal with these. I don't think that we
    need to go into that kind of detail in the calling standard. 
    
    The problem was that the assembler did not check (nor did it have the
    information available) to determine if a procedure (or prologue) did
    not contain any actual code, but it generated the procedure descriptors
    based on the what the programmer told it. 
    
    I think the case of a zero length procedure should be addressed in 8.1.
    I would suggest adding a sentence to the EndAddress paragraph that the
    EndAddress must be greater than the BeginAddress. We actually had
    real-world examples of this in the OTS Divide sources. 
 |