> On Feb 3, 2017, at 1:27 PM, John McCall <rjmcc...@apple.com> wrote:
> 
>> On Feb 3, 2017, at 4:18 PM, Andrew Trick <atr...@apple.com 
>> <mailto:atr...@apple.com>> wrote:
>>> On Feb 3, 2017, at 11:55 AM, Andrew Trick via swift-dev 
>>> <swift-dev@swift.org <mailto:swift-dev@swift.org>> wrote:
>>> 
>>>>> #3b. (lazy resolution) Offset tables can be completely localized.
>>>>> 
>>>>> method_index = immediate
>>>>> { // common per-class method lookup
>>>>>  isa = load[obj]
>>>>>  offset = load[@local_class_method_table + method_index]
>>>>>  if (!isInitializedOffset(offset)) {
>>>>>    offset = @resolveMethodOffset(@class_id, method_index)
>>>>>    store [@local_class_method_table + method_index]
>>>>>  }
>>>>>  if (isVtableOffset(offset))
>>>>>    method_entry = load[isa + offset]
>>>>>  else
>>>>>    method_entry = @resolveMethodAddress(isa, @class_id, method_index)
>>>>> }
>>>>> call method_entry
>>>> 
>>>> The size of @local_class_method_table is not statically knowable.
>>>> Fortunately, it doesn't matter, because this mechanism does not actually
>>>> care about the table being contiguous; the lookup function could be
>>>> passed a per-method cache variable.  This would also allow the lookup
>>>> function to be shared between classes.
>> 
>> Hmm... I thought the local method offset table size could be statically 
>> knowable because it will only be accesd for methods that were publicly 
>> available at build time, based on the sorted method index.
> 
> Sure, I mean, you can pick a table size that's sufficient for all the offsets 
> that will be passed.  That would save a few instructions at call sites, at 
> the cost of requiring the resolvers to be per-class.
> 
>> We could simplify the method resolution API with a single exported symbol 
>> per-class (maybe that's what you're getting at):
>> 
>> method_entry = resolveMethodAddress_ForAClass(isa, method_index, 
>> &vtable_offset)
> 
> Right, this is what I was thinking.
> 
>> The problem with that is the client-side code can’t hoist and combine the 
>> method offset lookup anymore.
> 
> Why not?  vtable_offset is basically an opaque cache here.  Sure, technically 
> the call isn't readnone anymore, but it's an innocuous violation like adding 
> memoization to sin().
> 
> Or is there some finer-grained hoisting you're imagining than the entire call?
> 
> John.

I was briefly over-thinking the problem… we could hoist the part that wasn’t 
dependent on the `isa`. That’s probably not important, and if it were, we could 
still hoist the cache lookup.

This option does seem to have the lowest immediate ABI cost (one symbol per 
class) with a tremendous amount of flexibility for optimizing both the dispatch 
code and the metadata representation.

-Andy
_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev

Reply via email to