[all-commits] [llvm/llvm-project] 3c24fa: [lld-macho] Add support for objc_msgSend stubs

Keith Smiley via All-commits all-commits at lists.llvm.org
Wed Aug 10 17:17:43 PDT 2022

  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: 3c24fae3986aea9a920025c87d0feb3d03c6e876
  Author: Keith Smiley <keithbsmiley at gmail.com>
  Date:   2022-08-10 (Wed, 10 Aug 2022)

  Changed paths:
    M lld/MachO/Arch/ARM.cpp
    M lld/MachO/Arch/ARM64.cpp
    M lld/MachO/Arch/ARM64Common.h
    M lld/MachO/Arch/ARM64_32.cpp
    M lld/MachO/Arch/X86_64.cpp
    M lld/MachO/Config.h
    M lld/MachO/Driver.cpp
    M lld/MachO/InputFiles.cpp
    M lld/MachO/InputSection.cpp
    M lld/MachO/InputSection.h
    M lld/MachO/Options.td
    M lld/MachO/SyntheticSections.cpp
    M lld/MachO/SyntheticSections.h
    M lld/MachO/Target.h
    M lld/MachO/Writer.cpp
    A lld/test/MachO/arm64-objc-stubs.s
    A lld/test/MachO/objc-methname.s
    A lld/test/MachO/objc-selrefs.s
    A lld/test/MachO/x86-64-objc-stubs.s

  Log Message:
  [lld-macho] Add support for objc_msgSend stubs

Apple Clang in Xcode 14 introduced a new feature for reducing the
overhead of objc_msgSend calls by deduplicating the setup calls for each
individual selector. This works by clang adding undefined symbols for
each selector called in a translation unit, such as `_objc_msgSend$foo`
for calling the `foo` method on any `NSObject`. There are 2
different modes for this behavior, the default directly does the setup
for `_objc_msgSend` and calls it, and the smaller option does the
selector setup, and then calls the standard `_objc_msgSend` stub

The general overview of how this works is:

- Undefined symbols with the given prefix are collected
- The suffix of each matching undefined symbol is added as a string to
- A pointer is added for every method name in the `__objc_selrefs`
- A `got` entry is emitted for `_objc_msgSend`
- Stubs are emitting pointing to the synthesized locations


- Both `__objc_methname` and `__objc_selrefs` can also exist from object
  files, so their contents are merged with our synthesized contents
- The compiler emits method names for defined methods, but not for
  undefined symbols you call, but stubs are used for both
- This only implements the default "fast" mode currently just to reduce
  the diff, I also doubt many folks will care to swap modes
- This only implements this for arm64 and x86_64, we don't need to
  implement this for 32 bit iOS archs, but we should implement it for
  watchOS archs in a later diff

Differential Revision: https://reviews.llvm.org/D128108

More information about the All-commits mailing list