commit | b3c43d6281eaabc1269025715256ed220affe230 | [log] [tgz] |
---|---|---|
author | alx32 <103613512+alx32@users.noreply.github.com> | Tue Mar 19 13:14:29 2024 -0700 |
committer | Copybara-Service <copybara-worker@google.com> | Tue Mar 19 13:22:10 2024 -0700 |
tree | 9972bb2da8a92b19dc3bbd3593b921b500f6ca4a | |
parent | cde72c0ad69ba52c0eacd34571005390cd434c59 [diff] |
[lld-macho] Implement ObjC category merging (-objc_category_merging) (#85727) This change adds a flag to lld to enable category merging for MachoO + ObjC. It adds the '-objc_category_merging' flag for enabling this option and uses the existing '-no_objc_category_merging' flag for disabling it. In ld64, this optimization is enabled by default, but in lld, for now, we require explicitly passing the '-objc_category_merging' flag in order to enable it. Behavior: if in the same link unit, multiple categories are extending the same class, then they get merged into a single category. Ex: Cat1(method1+method2,protocol1) + Cat2(method3+method4,protocol2, property1) = Cat1_2(method1+method2+method3+method4, protocol1+protocol2, property1) Notes on implementation decisions made in this diff: There is a possibility to further improve the current implementation by directly merging the category data into the base class (if the base class is present in the link unit) - this improvement may be done as a follow-up. This improved functionality is already present in ld64. We do the merging on the raw inputSections - after dead-stripping (categories can't be dead stripped anyway). The changes are mostly self-contained to ObjC.cpp, except for adding a new flag (linkerOptimizeReason) to ConcatInputSection and StringPiece to mark that this data has been optimized away. Another way to do it would have been to just mark the pieces as not 'live' but this would cause the old symbols to show up in the linker map as being dead-stripped - even if dead-stripping is disabled. This flag allows us to match the ld64 behavior. Note: This is a re-land of https://github.com/llvm/llvm-project/pull/82928 after fixing using already freed memory in `generatedSectionData`. This issue was detected by ASAN build. --------- Co-authored-by: Alex B <alexborcan@meta.com> GitOrigin-RevId: cd34860705607ba804e20753f3ef4f2d4392df57
This directory and its subdirectories contain source code for the LLVM Linker, a modular cross platform linker which is built as part of the LLVM compiler infrastructure project.
lld is open source software. You may freely distribute it under the terms of the license agreement found in LICENSE.txt.
In order to make sure various developers can evaluate patches over the same tests, we create a collection of self contained programs.
It is hosted at https://s3-us-west-2.amazonaws.com/linker-tests/lld-speed-test.tar.xz
The current sha256 is 10eec685463d5a8bbf08d77f4ca96282161d396c65bd97dc99dbde644a31610f
.