Procedure descriptors serve these functions:
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.
A static procedure descriptor is a procedure descriptor that is created during compilation and included with the code it describes as part of the same executable image. A static procedure descriptor becomes active when its containing image is loaded. A dynamic procedure descriptor is a procedure descriptor that is created during program execution. A dynamic procedure descriptor becomes active (and inactive) as described in Section 8.3, Run-Time Generated Code.
Each instruction of a program must be described by at most one active procedure descriptor. (Equivalently, all of the active procedure descriptors of a program must describe mutually disjoint sets of instructions.)
When there is more than one procedure descriptor for a procedure, there is a particular procedure descriptor of the set, called the primary procedure descriptor, that can be efficiently determined from any of the others, called secondary procedure descriptors. (The means for doing this is based on use of the PrologEndAddress field of the procedure descriptor.) The primary procedure descriptor need not correspond to any particular portion of the procedure's code (for example, it need not describe the portion of the code at the lowest addresses).
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.
Procedure descriptors are required for null frame procedures except for the following: