AtariDreams wrote:

> I talked this over with Mike Ash. I was concerned that Objective-C might 
> allow dynamic class changes that would burn our ability to do this 
> optimization, such as adding ivars during `+initialize`. The existing 
> optimization would work even with a relatively lax runtime as long as new 
> ivars always followed existing ivars. Fortunately, Mike assures me that this 
> is impossible: the layout of a class is fixed before it's ever exposed to 
> user code, including the calls to `+load` and `+initialize`. The runtime only 
> allows ivars to be added to a class before the class is registered with the 
> runtime (i.e. never for compiler-emitted classes). It is possible to replace 
> the superclass dynamically (although this is strongly discouraged), but class 
> layout has already happened by any point where this is possible, so there is 
> an effective requirement that the new superclass's class layout matches the 
> old one's. In short, we're comfortable saying that there's an ABI rule that 
> class layout for compiled classes is solely dependent on information 
> expressed in the language, at least as far as the class's subobject is 
> concerned (that is, we can never rule out subclasses, including dynamic 
> subclasses; but that doesn't interfere with the static optimization here). So 
> this optimization is indeed possible.
> 
> The compiler is not integrated with the linker and cannot see 
> `@implementation`s for classes defined outside the current translation unit. 
> So the approach in this patch only helps in the case that you have the 
> primary `@implementation` for multiple classes in a single translation unit. 
> That's fairly uncommon in my experience; ObjC programmers tend to define 
> different classes in different `.m` files. Still, it probably does happen, 
> especially with code generation, and we ought to be able to optimize it.
> 
> We should stress to programmers that they should not change their code by 
> defining everything in a single `.m` file just to get this optimization. It 
> is not likely to be worthwhile.
> 
> In order to optimize this across translation units, we'd need a version of it 
> that worked with LTO. It should be very feasible to do this with summaries in 
> ThinLTO. That seems like it'd be a huge win; it would have three effects that 
> I can see:
> 
> * We'd be able to pre-slide offset variables in subclasses according to their 
> superclasses in the same image.  This can significantly optimize load times 
> by reducing the amount of memory that has to be dirtied.  However, I think 
> the Mach-O linker already does this, so it's probably not a big deal to do in 
> LTO.
> * We'd be able to optimize ivar accesses to use static offsets even when the 
> superclass is defined in a different TU.  This seems like the biggest win.
> * We'd be able to optimize ivar accesses to use static offsets even for 
> accesses outside of the main `@implementation`.  This would be a huge win 
> except that it's pretty unidiomatic in Objective-C, which generally strongly 
> encourages the use of properties.
> 
> I'll take another look at your patch. As Aaron said, there is no need to ping 
> me so quickly, especially on the weekend.

Alright. I think the LTO should be done as a follow-up since it will likely 
take some time and multiple reviews to get right. 

https://github.com/llvm/llvm-project/pull/81335
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to