The dso_local_equivalent constant is a wrapper for functions that represents a value which is functionally equivalent to the global passed to this. That is, if this accepts a function, calling this constant should have the same effects as calling the function directly. This could be a direct reference to the function, the @plt modifier on X86/AArch64, a thunk, or anything that's equivalent to the resolved function as a call target.
When lowered, the returned address must have a constant offset at link time from some other symbol defined within the same binary. The address of this value is also insignificant. The name is leveraged from dso_local where use of a function or variable is resolved to a symbol in the same linkage unit.
In this patch:
- Addition of dso_local_equivalent and handling it
- Update Constant::needsRelocation() to strip constant inbound GEPs and take advantage of dso_local_equivalent for relative references
This is useful for the Relative VTables C++ ABI which makes vtables readonly. This works by replacing the dynamic relocations for function pointers in them with static relocations that represent the offset between the vtable and virtual functions. If a function is externally defined, dso_local_equivalent can be used as a generic wrapper for the function to still allow for this static offset calculation to be done.
See RFC for more details.
Adding a member in the middle breaks prebuilt binaries linking against llvm-c. How about just dropping the change?