llvm-project/lld/ELF
Fangrui Song c8f0d3e130 [ELF][PPC64] Support long branch thunks with addends
Fixes PPC64 part of PR40438

  // clang -target ppc64le -c a.cc
  // .text.unlikely may be placed in a separate output section (via -z keep-text-section-prefix)
  // The distance between bar in .text.unlikely and foo in .text may be larger than 32MiB.
  static void foo() {}
  __attribute__((section(".text.unlikely"))) static int bar() { foo(); return 0; }
  __attribute__((used)) static int dummy = bar();

This patch makes such thunks with addends work for PPC64.

AArch64: .text -> `__AArch64ADRPThunk_ (adrp x16, ...; add x16, x16, ...; br x16)` -> target
PPC64: .text -> `__long_branch_ (addis 12, 2, ...; ld 12, ...(12); mtctr 12; bctr)` -> target

AArch64 can leverage ADRP to jump to the target directly, but PPC64
needs to load an address from .branch_lt . Before Power ISA v3.0, the
PC-relative ADDPCIS was not available. .branch_lt was invented to work
around the limitation.

Symbol::ppc64BranchltIndex is replaced by
PPC64LongBranchTargetSection::entry_index which take addends into
consideration.

The tests are rewritten: ppc64-long-branch.s tests -no-pie and
ppc64-long-branch-pi.s tests -pie and -shared.

Reviewed By: sfertile

Differential Revision: https://reviews.llvm.org/D70937
2019-12-05 10:17:45 -08:00
..
Arch [ELF][PPC64] Support long branch thunks with addends 2019-12-05 10:17:45 -08:00
AArch64ErrataFix.cpp Fix a few typos in lld/ELF to cycle bots 2019-10-28 21:41:47 -04:00
AArch64ErrataFix.h [ELF] Fix variable names in comments after VariableName -> variableName change 2019-07-16 05:50:45 +00:00
ARMErrataFix.cpp Fix a few typos in lld/ELF to cycle bots 2019-10-28 21:41:47 -04:00
ARMErrataFix.h [ELF][ARM] Implement --fix-cortex-a8 to fix erratum 657417 2019-09-16 09:38:38 +00:00
CMakeLists.txt [ELF] Suggest extern "C" when an undefined reference is mangled while the definition is not 2019-11-08 09:42:50 -08:00
CallGraphSort.cpp Fix a few typos in lld/ELF to cycle bots 2019-10-28 21:41:47 -04:00
CallGraphSort.h Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
Config.h [ELF] Delete unused Configuration::zExecstack after D56554 2019-11-25 14:44:09 -08:00
DWARF.cpp [ELF] Wrap things in `namespace lld { namespace elf {`, NFC 2019-10-07 08:31:18 +00:00
DWARF.h gdb-index: Wire up str_offsets section to avoid incorrect error message about offsets_base 2019-08-07 22:49:14 +00:00
Driver.cpp [ELF] Replace SymbolTable::forEachSymbol with iterator_range symbols() 2019-11-26 09:09:32 -08:00
Driver.h [Coding style change] Rename variables so that they start with a lowercase letter 2019-07-10 05:00:37 +00:00
DriverUtils.cpp LLD: Don't use the stderrOS stream in link before it's reassigned. 2019-11-21 10:55:03 -05:00
EhFrame.cpp [ELF] Wrap things in `namespace lld { namespace elf {`, NFC 2019-10-07 08:31:18 +00:00
EhFrame.h [Coding style change] Rename variables so that they start with a lowercase letter 2019-07-10 05:00:37 +00:00
ICF.cpp [ELF] Wrap things in `namespace lld { namespace elf {`, NFC 2019-10-07 08:31:18 +00:00
ICF.h Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
InputFiles.cpp [ELF] Disallow out-of-range section group indices after D70146 2019-11-19 09:49:45 -08:00
InputFiles.h Forward declare the DWARFCache to avoid including LLVM DWARF details 2019-11-14 14:17:49 -08:00
InputSection.cpp comment typo fix to cycle bots 2019-10-31 07:54:16 -04:00
InputSection.h [ELF] Improve --gc-sections compatibility with GNU ld regarding section groups 2019-11-19 08:54:06 -08:00
LTO.cpp [ELF] Replace SymbolTable::forEachSymbol with iterator_range symbols() 2019-11-26 09:09:32 -08:00
LTO.h [Coding style change] Rename variables so that they start with a lowercase letter 2019-07-10 05:00:37 +00:00
LinkerScript.cpp [ELF] Support input section description .rel[a].dyn in /DISCARD/ 2019-11-25 21:49:46 -08:00
LinkerScript.h Fix a few typos in lld/ELF to cycle bots 2019-10-28 21:41:47 -04:00
MapFile.cpp Make it possible to redirect not only errs() but also outs() 2019-11-18 11:18:06 +09:00
MapFile.h Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
MarkLive.cpp [ELF] Replace SymbolTable::forEachSymbol with iterator_range symbols() 2019-11-26 09:09:32 -08:00
MarkLive.h Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
Options.td [ELF] Error if -Ttext-segment is specified 2019-11-21 09:41:55 -08:00
OutputSections.cpp [LLD][ELF] - Make compression level be dependent on -On. 2019-11-26 11:50:22 +03:00
OutputSections.h [ELF] Make MergeInputSection merging aware of output sections 2019-09-24 11:48:31 +00:00
README.md
Relocations.cpp [ELF][PPC64] Support long branch thunks with addends 2019-12-05 10:17:45 -08:00
Relocations.h [ELF][AArch64] Support R_AARCH64_{CALL26,JUMP26} range extension thunks with addends 2019-12-02 10:07:24 -08:00
ScriptLexer.cpp [ELF] Wrap things in `namespace lld { namespace elf {`, NFC 2019-10-07 08:31:18 +00:00
ScriptLexer.h [Coding style change] Rename variables so that they start with a lowercase letter 2019-07-10 05:00:37 +00:00
ScriptParser.cpp [ELF] Wrap things in `namespace lld { namespace elf {`, NFC 2019-10-07 08:31:18 +00:00
ScriptParser.h [ELF] Fix variable names in comments after VariableName -> variableName change 2019-07-16 05:50:45 +00:00
SymbolTable.cpp Fix a few typos in lld/ELF to cycle bots 2019-10-28 21:41:47 -04:00
SymbolTable.h [ELF] Replace SymbolTable::forEachSymbol with iterator_range symbols() 2019-11-26 09:09:32 -08:00
Symbols.cpp [ELF][PPC64] Support long branch thunks with addends 2019-12-05 10:17:45 -08:00
Symbols.h [ELF][PPC64] Support long branch thunks with addends 2019-12-05 10:17:45 -08:00
SyntheticSections.cpp [ELF][PPC64] Support long branch thunks with addends 2019-12-05 10:17:45 -08:00
SyntheticSections.h [ELF][PPC64] Support long branch thunks with addends 2019-12-05 10:17:45 -08:00
Target.cpp [ELF][AArch64] Support R_AARCH64_{CALL26,JUMP26} range extension thunks with addends 2019-12-02 10:07:24 -08:00
Target.h [ELF][AArch64] Support R_AARCH64_{CALL26,JUMP26} range extension thunks with addends 2019-12-02 10:07:24 -08:00
Thunks.cpp [ELF][PPC64] Support long branch thunks with addends 2019-12-05 10:17:45 -08:00
Thunks.h [ELF][AArch64] Support R_AARCH64_{CALL26,JUMP26} range extension thunks with addends 2019-12-02 10:07:24 -08:00
Writer.cpp [LLD][ELF] Add support for PT_GNU_PROPERTY 2019-12-05 09:54:58 +00:00
Writer.h Revert "Revert r370635, it caused PR43241." 2019-09-06 15:57:24 +00:00

README.md

See docs/NewLLD.rst