//===- 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 <vector>
#include <set>

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<std::string> 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<std::string> SoName;
  ELFArch Arch;
  std::vector<std::string> NeededLibs;
  std::set<ELFSymbol> Symbols;

  ELFStub() {}
  ELFStub(const ELFStub &Stub);
  ELFStub(ELFStub &&Stub);
};
} // end namespace elfabi
} // end namespace llvm

#endif // LLVM_TEXTAPI_ELF_ELFSTUB_H
