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;
Rui Ueyamaf20ee9f2017-01-28 00:48:06 +000018template <class ELFT> class InputSection;
19
Peter Smithfb05cd92016-07-08 16:10:27 +000020// 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//
Rui Ueyamaf20ee9f2017-01-28 00:48:06 +000027// 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.
Peter Smithfb05cd92016-07-08 16:10:27 +000030template <class ELFT> class Thunk {
Rui Ueyamaf20ee9f2017-01-28 00:48:06 +000031 typedef typename ELFT::uint uintX_t;
32
Peter Smithfb05cd92016-07-08 16:10:27 +000033public:
Rui Ueyamaf20ee9f2017-01-28 00:48:06 +000034 Thunk(const SymbolBody &Destination, const InputSection<ELFT> &Owner);
Peter Smithfb05cd92016-07-08 16:10:27 +000035 virtual ~Thunk();
36
Rui Ueyama0d410c262016-07-09 23:02:37 +000037 virtual uint32_t size() const { return 0; }
Rui Ueyamaf20ee9f2017-01-28 00:48:06 +000038 virtual void writeTo(uint8_t *Buf) const {}
39 uintX_t getVA() const;
Rui Ueyama3d2bbb12016-07-09 22:52:30 +000040
Rui Ueyamaf20ee9f2017-01-28 00:48:06 +000041protected:
Peter Smithfb05cd92016-07-08 16:10:27 +000042 const SymbolBody &Destination;
Rui Ueyamaf20ee9f2017-01-28 00:48:06 +000043 const InputSection<ELFT> &Owner;
Peter Smithfb05cd92016-07-08 16:10:27 +000044 uint64_t Offset;
45};
46
Rui Ueyamaf20ee9f2017-01-28 00:48:06 +000047// 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);
Peter Smithfb05cd92016-07-08 16:10:27 +000052
53} // namespace elf
54} // namespace lld
55
56#endif