llvm/lld/ELF/Thunks.h

//===- Thunks.h --------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef LLD_ELF_THUNKS_H
#define LLD_ELF_THUNKS_H

#include "llvm/ADT/SmallVector.h"
#include "Relocations.h"

namespace lld::elf {
struct Ctx;
class Defined;
class InputFile;
class Symbol;
class ThunkSection;
// Class to describe an instance of a Thunk.
// A Thunk is a code-sequence inserted by the linker in between a caller and
// the callee. The relocation to the callee is redirected to the Thunk, which
// after executing transfers control to the callee. Typical uses of Thunks
// include transferring control from non-pi to pi and changing state on
// targets like ARM.
//
// Thunks can be created for Defined, Shared and Undefined Symbols.
// Thunks are assigned to synthetic ThunkSections
class Thunk {};

// For a Relocation to symbol S create a Thunk to be added to a synthetic
// ThunkSection.
Thunk *addThunk(Ctx &, const InputSection &isec, Relocation &rel);

// Create a landing pad Thunk for use when indirect branches from Thunks
// are restricted.
Thunk *addLandingPadThunk(Ctx &, Symbol &s, int64_t a);

void writePPC32PltCallStub(Ctx &, uint8_t *buf, uint64_t gotPltVA,
                           const InputFile *file, int64_t addend);
void writePPC64LoadAndBranch(uint8_t *buf, int64_t offset);

} // namespace lld::elf

#endif