blob: b937d7918491080864f4254720a3eace529c1933 [file] [log] [blame]
Peter Smithfb05cd92016-07-08 16:10:27 +00001//===- Thunks.h --------------------------------------------------------===//
2//
3// The LLVM Linker
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef LLD_ELF_THUNKS_H
11#define LLD_ELF_THUNKS_H
12
13#include "Relocations.h"
14
15namespace lld {
16namespace elf {
17class SymbolBody;
Peter Smithfb05cd92016-07-08 16:10:27 +000018template <class ELFT> class InputSection;
Peter Smithfb05cd92016-07-08 16:10:27 +000019
20// Class to describe an instance of a Thunk.
21// A Thunk is a code-sequence inserted by the linker in between a caller and
22// the callee. The relocation to the callee is redirected to the Thunk, which
23// after executing transfers control to the callee. Typical uses of Thunks
24// include transferring control from non-pi to pi and changing state on
25// targets like ARM.
26//
27// Thunks can be created for DefinedRegular and Shared Symbols. The Thunk
28// is stored in a field of the Symbol Destination.
29// Thunks to be written to an InputSection are recorded by the InputSection.
30template <class ELFT> class Thunk {
Rui Ueyama3d2bbb12016-07-09 22:52:30 +000031 typedef typename ELFT::uint uintX_t;
32
Peter Smithfb05cd92016-07-08 16:10:27 +000033public:
Peter Smithfb05cd92016-07-08 16:10:27 +000034 Thunk(const SymbolBody &Destination, const InputSection<ELFT> &Owner);
35 virtual ~Thunk();
36
Rui Ueyama0d410c262016-07-09 23:02:37 +000037 virtual uint32_t size() const { return 0; }
38 virtual void writeTo(uint8_t *Buf) const {}
Rui Ueyama3d2bbb12016-07-09 22:52:30 +000039 uintX_t getVA() const;
40
Peter Smithfb05cd92016-07-08 16:10:27 +000041protected:
42 const SymbolBody &Destination;
43 const InputSection<ELFT> &Owner;
44 uint64_t Offset;
45};
46
47// For a Relocation to symbol S from InputSection Src, create a Thunk and
48// update the fields of S and the InputSection that the Thunk body will be
49// written to. At present there are implementations for ARM and Mips Thunks.
50template <class ELFT>
51void addThunk(uint32_t RelocType, SymbolBody &S, InputSection<ELFT> &Src);
52
53} // namespace elf
54} // namespace lld
55
56#endif