1//===- ELFStub.h ------------------------------------------------*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===-----------------------------------------------------------------------===/ 8/// 9/// \file 10/// This file defines an internal representation of an ELF stub. 11/// 12//===-----------------------------------------------------------------------===/ 13 14#ifndef LLVM_TEXTAPI_ELF_ELFSTUB_H 15#define LLVM_TEXTAPI_ELF_ELFSTUB_H 16 17#include "llvm/BinaryFormat/ELF.h" 18#include "llvm/Support/VersionTuple.h" 19#include <vector> 20#include <set> 21 22namespace llvm { 23namespace elfabi { 24 25typedef uint16_t ELFArch; 26 27enum class ELFSymbolType { 28 NoType = ELF::STT_NOTYPE, 29 Object = ELF::STT_OBJECT, 30 Func = ELF::STT_FUNC, 31 TLS = ELF::STT_TLS, 32 33 // Type information is 4 bits, so 16 is safely out of range. 34 Unknown = 16, 35}; 36 37struct ELFSymbol { 38 ELFSymbol(std::string SymbolName) : Name(SymbolName) {} 39 std::string Name; 40 uint64_t Size; 41 ELFSymbolType Type; 42 bool Undefined; 43 bool Weak; 44 Optional<std::string> Warning; 45 bool operator<(const ELFSymbol &RHS) const { 46 return Name < RHS.Name; 47 } 48}; 49 50// A cumulative representation of ELF stubs. 51// Both textual and binary stubs will read into and write from this object. 52class ELFStub { 53// TODO: Add support for symbol versioning. 54public: 55 VersionTuple TbeVersion; 56 Optional<std::string> SoName; 57 ELFArch Arch; 58 std::vector<std::string> NeededLibs; 59 std::set<ELFSymbol> Symbols; 60 61 ELFStub() {} 62 ELFStub(const ELFStub &Stub); 63 ELFStub(ELFStub &&Stub); 64}; 65} // end namespace elfabi 66} // end namespace llvm 67 68#endif // LLVM_TEXTAPI_ELF_ELFSTUB_H 69