[llvm][IR] Add dso_local_equivalent Constant
authorLeonard Chan <leonardchan@google.com>
Wed, 1 Apr 2020 22:25:04 +0000 (15:25 -0700)
committerLeonard Chan <leonardchan@google.com>
Thu, 19 Nov 2020 18:26:17 +0000 (10:26 -0800)
commita97f62837f59620a60b3ed9f29568440c7d0553a
tree360eb006af37d0abe1f40757db6f4da7b5246984
parent2f3adc54b57356cd207ded2ec2d7f4e1273da0ff
[llvm][IR] Add dso_local_equivalent Constant

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](https://reviews.llvm.org/D72959)
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](http://lists.llvm.org/pipermail/llvm-dev/2020-August/144469.html) for more details.

Differential Revision: https://reviews.llvm.org/D77248
19 files changed:
llvm/docs/LangRef.rst
llvm/include/llvm/Analysis/ConstantFolding.h
llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
llvm/include/llvm/IR/Constants.h
llvm/include/llvm/IR/Value.def
llvm/include/llvm/Target/TargetLoweringObjectFile.h
llvm/lib/Analysis/ConstantFolding.cpp
llvm/lib/AsmParser/LLLexer.cpp
llvm/lib/AsmParser/LLParser.cpp
llvm/lib/AsmParser/LLToken.h
llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
llvm/lib/IR/AsmWriter.cpp
llvm/lib/IR/Constants.cpp
llvm/lib/IR/Core.cpp
llvm/lib/IR/LLVMContextImpl.h
llvm/test/CodeGen/X86/dso_local_equivalent.ll [new file with mode: 0644]
llvm/test/CodeGen/X86/relptr-rodata.ll