| Peter Smith | fb05cd9 | 2016-07-08 16:10:27 +0000 | [diff] [blame] | 1 | //===- 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 |  | 
|  | 15 | namespace lld { | 
|  | 16 | namespace elf { | 
|  | 17 | class SymbolBody; | 
|  | 18 | class InputFile; | 
|  | 19 | template <class ELFT> class InputSection; | 
|  | 20 | template <class ELFT> class InputSectionBase; | 
|  | 21 |  | 
|  | 22 | // Class to describe an instance of a Thunk. | 
|  | 23 | // A Thunk is a code-sequence inserted by the linker in between a caller and | 
|  | 24 | // the callee. The relocation to the callee is redirected to the Thunk, which | 
|  | 25 | // after executing transfers control to the callee. Typical uses of Thunks | 
|  | 26 | // include transferring control from non-pi to pi and changing state on | 
|  | 27 | // targets like ARM. | 
|  | 28 | // | 
|  | 29 | // Thunks can be created for DefinedRegular and Shared Symbols. The Thunk | 
|  | 30 | // is stored in a field of the Symbol Destination. | 
|  | 31 | // Thunks to be written to an InputSection are recorded by the InputSection. | 
|  | 32 | template <class ELFT> class Thunk { | 
|  | 33 | public: | 
|  | 34 | virtual uint32_t size() const { return 0; } | 
|  | 35 | typename ELFT::uint getVA() const; | 
|  | 36 | virtual void writeTo(uint8_t *Buf) const {}; | 
|  | 37 | Thunk(const SymbolBody &Destination, const InputSection<ELFT> &Owner); | 
|  | 38 | virtual ~Thunk(); | 
|  | 39 |  | 
|  | 40 | protected: | 
|  | 41 | const SymbolBody &Destination; | 
|  | 42 | const InputSection<ELFT> &Owner; | 
|  | 43 | uint64_t Offset; | 
|  | 44 | }; | 
|  | 45 |  | 
|  | 46 | // For a Relocation to symbol S from InputSection Src, create a Thunk and | 
|  | 47 | // update the fields of S and the InputSection that the Thunk body will be | 
|  | 48 | // written to. At present there are implementations for ARM and Mips Thunks. | 
|  | 49 | template <class ELFT> | 
|  | 50 | void addThunk(uint32_t RelocType, SymbolBody &S, InputSection<ELFT> &Src); | 
|  | 51 |  | 
|  | 52 | } // namespace elf | 
|  | 53 | } // namespace lld | 
|  | 54 |  | 
|  | 55 | #endif |