// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef SRC_LIB_DEBUGGER_UTILS_ELF_SYMTAB_H_
#define SRC_LIB_DEBUGGER_UTILS_ELF_SYMTAB_H_

#include <cstdint>
#include <cstdio>
#include <memory>
#include <string>

#include "elf_reader.h"
#include "src/lib/fxl/macros.h"

namespace debugger_utils {

struct ElfSymbol {
  // weak pointer into the string section of the loaded ELF file
  const char* name = nullptr;
  uint64_t addr = 0;
  uint64_t size = 0;
};

class ElfSymbolTable {
 public:
  ElfSymbolTable(const std::string& file_name, const std::string& contents);
  ~ElfSymbolTable();

  const std::string& file_name() const { return file_name_; }
  const std::string& contents() const { return contents_; }
  size_t num_symbols() const { return num_symbols_; }

  // |symtab_type| is one of SHT_SYMTAB, SHT_DYNSYM.
  bool Populate(ElfReader* elf, unsigned symtab_type);

  // |index| must be valid.
  const ElfSymbol& GetSymbol(size_t index) const { return symbols_[index]; }

  const ElfSymbol* FindSymbol(uint64_t addr) const;

  void Dump(FILE*) const;

 private:
  void Finalize();

  // For debugging/informational purposes only.
  const std::string file_name_;

  // For debugging/informational purposes only.
  // One may wish to load a file's symbols into different symbol tables.
  // E.g., One may wish to keep SHT_SYMTAB and SHT_DYNSYM separate.
  // This string is for identifying the contents of the symtab in error
  // messages, etc.
  const std::string contents_;

  size_t num_symbols_ = 0;
  // Once Finalize() is called this is sorted by |Symbol.addr|.
  ElfSymbol* symbols_ = nullptr;

  // To separate our lifetime with that of the ELF reader, we store the
  // strings here.
  std::unique_ptr<ElfSectionContents> string_section_;

  FXL_DISALLOW_COPY_AND_ASSIGN(ElfSymbolTable);
};

}  // namespace debugger_utils

#endif  // SRC_LIB_DEBUGGER_UTILS_ELF_SYMTAB_H_
