From d422e478433753f9044cf798311190e3f5091c62 Mon Sep 17 00:00:00 2001 From: dotnet-bot Date: Thu, 26 Feb 2015 21:33:21 -0800 Subject: [PATCH] Add Virtual Stub Dispatch doc --- Documentation/images/virtualstubdispatch-fig1.png | Bin 0 -> 21092 bytes Documentation/images/virtualstubdispatch-fig2.png | Bin 0 -> 10696 bytes Documentation/images/virtualstubdispatch-fig3.png | Bin 0 -> 9840 bytes Documentation/images/virtualstubdispatch-fig4.png | Bin 0 -> 8315 bytes Documentation/virtual-stub-dispatch.md | 188 ++++++++++++++++++++++ 5 files changed, 188 insertions(+) create mode 100755 Documentation/images/virtualstubdispatch-fig1.png create mode 100755 Documentation/images/virtualstubdispatch-fig2.png create mode 100755 Documentation/images/virtualstubdispatch-fig3.png create mode 100755 Documentation/images/virtualstubdispatch-fig4.png create mode 100644 Documentation/virtual-stub-dispatch.md diff --git a/Documentation/images/virtualstubdispatch-fig1.png b/Documentation/images/virtualstubdispatch-fig1.png new file mode 100755 index 0000000000000000000000000000000000000000..1249d01aa2e6baa8ee7f921de0893209a6ad2bef GIT binary patch literal 21092 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 literal 0 HcmV?d00001 diff --git a/Documentation/images/virtualstubdispatch-fig2.png b/Documentation/images/virtualstubdispatch-fig2.png new file mode 100755 index 0000000000000000000000000000000000000000..f733b0a938d0e09e2ee90a7df42e7a5a65dbe18e GIT binary patch literal 10696 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 E0ghOIKmY&$ literal 0 HcmV?d00001 diff --git a/Documentation/images/virtualstubdispatch-fig3.png b/Documentation/images/virtualstubdispatch-fig3.png new file mode 100755 index 0000000000000000000000000000000000000000..0bb1b0afd3129aed3bb1f7cd4434d5ed9ec82db3 GIT binary patch literal 9840 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 I6)j%=A9`)_Bme*a literal 0 HcmV?d00001 diff --git a/Documentation/images/virtualstubdispatch-fig4.png b/Documentation/images/virtualstubdispatch-fig4.png new file mode 100755 index 0000000000000000000000000000000000000000..be2138af541146c48e622edec6077ad4846531e7 GIT binary patch literal 8315 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 Z8LGZ`di~J-)]> entries. _type_ is the dynamically assigned identification number mentioned above, and is either a sentinel value to indicate the current class (a call to a virtual instance method), or is an identifier for an interface implemented by the current class (or implicitly by one if its parents). The sub-map (contained in brackets) has one or more entries. Within each entry, the first element always indicates a slot within _type_. The second element, _scope_, specifies whether or not the third element is an implementation _index_ or a _slot_ number. _scope_ can be a known sentinel value that indicates that the next number is to be interpreted as a virtual slot number, and should be resolved virtually as _this.slot_. _scope_ can also identify a particular class in the inheritance hierarchy of the current class, and in such a case the third argument is an _index_ into the implementation table of the class indicated by _scope_, and is the final method implementation for _type.slot_. + +#### Example + +The following is a small class structure (modeled in C#), and what the resulting implementation table and slot map would be for each class. + +![Figure 1](images/virtualstubdispatch-fig1.png) + +Thus, looking at this map, we see that the first column of the sub-maps of the slot maps correspond to the slot number in the classic virtual table view (remember that System.Object contributes four virtual methods of its own, which are omitted for clarity). Searches for method implementations are always bottom-up. Thus, if I had an object of type _B_ and I wished to invoke _I.Foo_, I would look for a mapping of _I.Foo_ starting at _B_'s slot map. Not finding it there, I would look in _A_'s slot map and find it there. It states that virtual slot 0 of _I_ (corresponding to _I.Foo_) is implemented by virtual slot 0. Then I return to _B_'s slot map and search for an implementation for slot 0, and find that it is implemented by slot 1 in its own implementation table. + +### Additional Uses + +It is important to note that this mapping technique can be used to implement methodimpl re-mapping of virtual slots (i.e., a virtual slot mapping in the map for the current class, similar to how an interface slot is mapped to a virtual slot). Because of the scoping capabilities of the map, non-virtual methods may also be referenced. This may be useful if ever the runtime wants to support the implementation of interfaces with non-virtual methods. + +### Optimizations + +The slot maps are bit-encoded and take advantage of typical interface implementation patterns using delta values, thus reducing the map size significantly. In addition, new slots (both virtual and non-) can be implied by their order in the implementation table. If the table contains new virtual slots followed by new instance slots, then followed by overrides, then the appropriate slot map entries can be implied by their index in the implementation table combined with the number of virtuals inherited by the parent class. All such implied map entries have been indicated with a (\*). The current layout of data structures uses the following pattern, where the DispatchMap is only present when mappings cannot be fully implied by ordering in the implementation table. + + MethodTable -> [DispatchMap ->] ImplementationTable + +Type ID Map +----------- + +This will map types to IDs, which are allocated as monotonically increasing values as each previously unmapped type is encountered. Currently, all such types are interfaces. + +Currently, this is implemented using a HashMap, and contains entries for both lookup directions. + +Dispatch Tokens +--------------- + +Dispatch tokens will be <_typeID_,_slot_> tuples. For interfaces, the type will be the interface ID assigned to that type. For virtual methods, this will be a constant value to indicate that the slot should just be resolved virtually within the type to be dispatched on (a virtual method call on _this_). This value pair will in most cases fit into the platform's native word size. On x86, this will likely be the lower 16 bits of each value, concatenated. This can be generalized to handle overflow issues similar to how a _TypeHandle_ in the runtime can be either a _MethodTable_ pointer or a <_TypeHandle,TypeHandle_> pair, using a sentinel bit to differentiate the two cases. It has yet to be determined if this is necessary. + +Design of Virtual Stub Dispatch +=============================== + +Dispatch Token to Implementation Resolution +------------------------------------------- + +Given a token and type, the implementation is found by mapping the token to an implementation table index for the type. The implementation table is reachable from the type's MethodTable. This map is created in BuildMethodTable: it enumerates all interfaces implemented by the type for which it is building a MethodTable and determines every interface method that the type implements or overrides. By keeping track of this information, at interface dispatch time it is possible to determine the target code given the token and the target object (from which the MethodTable and token mapping can be obtained). + +Stubs +----- + +Interface dispatch calls go through stubs. These stubs are all generated on demand, and all have the ultimate purpose of matching a token and object with an implementation, and forwarding the call to that implementation. + +There are currently three types of stubs. The below diagram shows the general control flow between these stubs, and will be explained below. + +![Figure 2](images/virtualstubdispatch-fig2.png) + +### Generic Resolver + +This is in fact just a C function that serves as the final failure path for all stubs. It takes a <_token_, _type_> tuple and returns the target. The generic resolver is also responsible for creating dispatch and resolver stubs when they are required, patching indirection cells when better stubs become available, caching results, and all bookkeeping. + +### Lookup Stubs + +These stubs are the first to be assigned to an interface dispatch call site, and are created when the JIT compiles an interface call site. Since the JIT has no knowledge of the type being used to satisfy a token until the first call is made, this stub passes the token and type as arguments to the generic resolver. If necessary, the generic resolver will also create dispatch and resolve stubs, and will then back patch the call site to the dispatch stub so that the lookup stub is no longer used. + +One lookup stub is created for each unique token (i.e., call sites for the same interface slot will use the same lookup stub). + +### Dispatch Stubs + +These stubs are used when a call site is believed to be monomorphic in behaviour. This means that the objects used at a particular call site are typically the same type (i.e. most of the time the object being invoked is the same as the last object invoked at the same site.) A dispatch stub takes the type (MethodTable) of the object being invoked and compares it with its cached type, and upon success jumps to its cached target. On x86, this is typically results in a "comparison, conditional failure jump, jump to target" sequence and provides the best performance of any stub. If a stub's type comparison fails, it jumps to its corresponding resolve stub (see below). + +One dispatch stub is created for each unique <_token_,_type_> tuple, but only lazily when a call site's lookup stub is invoked. + +### Resolve Stubs + +Polymorphic call sites are handled by resolve stubs. These stubs use the key pair <_token_, _type_> to resolve the target in a global cache, where _token_ is known at JIT time and _type_ is determined at call time. If the global cache does not contain a match, then the final step of the resolve stub is to call the generic resolver and jump to the returned target. Since the generic resolver will insert the <_token_, _type_, _target_> tuple into the cache, a subsequent call with the same <_token_,_ type_> tuple will successfully find the target in the cache. + +When a dispatch stub fails frequently enough, the call site is deemed to be polymorphic and the resolve stub will back patch the call site to point directly to the resolve stub to avoid the overhead of a consistently failing dispatch stub. At sync points (currently the end of a GC), polymorphic sites will be randomly promoted back to monomorphic call sites under the assumption that the polymorphic attribute of a call site is usually temporary. If this assumption is incorrect for any particular call site, it will quickly trigger a backpatch to demote it to polymorphic again. + +One resolve stub is created per token, but they all use a global cache. A stub-per-token allows for a fast, effective hashing algorithm using a pre-calculated hash derived from the unchanging components of the <_token_, _type_> tuple. + +### Code Sequences + +The former interface virtual table dispatch mechanism results in a code sequence similar to this: + +![Figure 3](images/virtualstubdispatch-fig3.png) + +And the typical stub dispatch sequence is: + +![Figure 1](images/virtualstubdispatch-fig4.png) + +where expectedMT, failure and target are constants encoded in the stub. + +The typical stub sequence has the same number of instructions as the former interface dispatch mechanism, and fewer memory indirections may allow it to execute faster with a smaller working set contribution. It also results in smaller JITed code, since the bulk of the work is in the stub instead of the call site. This is only advantageous if a callsite is rarely invoked. Note that the failure branch is arranged so that x86 branch prediction will follow the success case. + +Current State +============= + +Currently, VSD is enabled only for interface method calls but not virtual instance method calls. There were several reasons for this: + +- **Startup:** Startup working set and speed were hindered because of the need to generate a great deal of initial stubs. +- **Throughput:** While interface dispatches are generally faster with VSD, virtual instance method calls suffer an unacceptable speed degradation. + +As a result of disabling VSD for virtual instance method calls, every type has a vtable for virtual instance methods and the implementation table described above is disabled. Dispatch maps are still present to enable interface method dispatching. + +Physical Architecture +===================== + +For dispatch token and map implementation details, please see [clr/src/vm/contractImpl.h](https://github.com/dotnet/coreclr/blob/master/src/vm/contractimpl.h) and [clr/src/vm/contractImpl.cpp](https://github.com/dotnet/coreclr/blob/master/src/vm/contractimpl.cpp). + +For virtual stub dispatch implementation details, please see [clr/src/vm/virtualcallstub.h](https://github.com/dotnet/coreclr/blob/master/src/vm/virtualcallstub.h) and [clr/src/vm/virtualcallstub.cpp](https://github.com/dotnet/coreclr/blob/master/src/vm/virtualcallstub.cpp). \ No newline at end of file -- 2.7.4