//===- ELFStub.h ------------------------------------------------*- C++ -*-===// // // 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 // //===-----------------------------------------------------------------------===/ /// /// \file /// This file defines an internal representation of an ELF stub. /// //===-----------------------------------------------------------------------===/ #ifndef LLVM_TEXTAPI_ELF_ELFSTUB_H #define LLVM_TEXTAPI_ELF_ELFSTUB_H #include "llvm/BinaryFormat/ELF.h" #include "llvm/Support/VersionTuple.h" #include #include namespace llvm { namespace elfabi { typedef uint16_t ELFArch; enum class ELFSymbolType { NoType = ELF::STT_NOTYPE, Object = ELF::STT_OBJECT, Func = ELF::STT_FUNC, TLS = ELF::STT_TLS, // Type information is 4 bits, so 16 is safely out of range. Unknown = 16, }; struct ELFSymbol { ELFSymbol(std::string SymbolName) : Name(SymbolName) {} std::string Name; uint64_t Size; ELFSymbolType Type; bool Undefined; bool Weak; Optional Warning; bool operator<(const ELFSymbol &RHS) const { return Name < RHS.Name; } }; // A cumulative representation of ELF stubs. // Both textual and binary stubs will read into and write from this object. class ELFStub { // TODO: Add support for symbol versioning. public: VersionTuple TbeVersion; Optional SoName; ELFArch Arch; std::vector NeededLibs; std::set Symbols; ELFStub() {} ELFStub(const ELFStub &Stub); ELFStub(ELFStub &&Stub); }; } // end namespace elfabi } // end namespace llvm #endif // LLVM_TEXTAPI_ELF_ELFSTUB_H