// mapfile.h -- map file generation for gold   -*- C++ -*-

// Copyright (C) 2008-2021 Free Software Foundation, Inc.
// Written by Ian Lance Taylor <iant@google.com>.

// This file is part of gold.

// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
// MA 02110-1301, USA.

#ifndef GOLD_MAP_H
#define GOLD_MAP_H

#include <cstdio>
#include <string>

namespace gold
{

class Archive;
class Symbol;
class Relobj;
template<int size, bool big_endian>
class Sized_relobj_file;
class Output_section;
class Output_data;

// This class manages map file output.

class Mapfile
{
 public:
  Mapfile();

  ~Mapfile();

  // Open the map file.  Return whether the open succeed.
  bool
  open(const char* map_filename);

  // Close the map file.
  void
  close();

  // Return the underlying file.
  FILE*
  file()
  { return this->map_file_; }

  // Report that we are including a member from an archive.  This is
  // called by the archive reading code.
  void
  report_include_archive_member(const std::string& member_name,
				const Symbol* sym, const char* why);

  // Report allocating a common symbol.
  void
  report_allocate_common(const Symbol*, uint64_t symsize);

  // Print discarded input sections.
  void
  print_discarded_sections(const Input_objects*);

  // Print an output section.
  void
  print_output_section(const Output_section*);

  // Print an input section.
  void
  print_input_section(Relobj*, unsigned int shndx);

  // Print an Output_data.
  void
  print_output_data(const Output_data*, const char* name);

 private:
  // The space we allow for a section name.
  static const size_t section_name_map_length;

  // Advance to a column.
  void
  advance_to_column(size_t from, size_t to);

  // Print the memory map header.
  void
  print_memory_map_header();

  // Print symbols for an input section.
  template<int size, bool big_endian>
  void
  print_input_section_symbols(const Sized_relobj_file<size, big_endian>*,
			      unsigned int shndx);

  // Map file to write to.
  FILE* map_file_;
  // Whether we have printed the archive member header.
  bool printed_archive_header_;
  // Whether we have printed the allocated common header.
  bool printed_common_header_;
  // Whether we have printed the memory map header.
  bool printed_memory_map_header_;
};

} // End namespace gold.

#endif // !defined(GOLD_MAP_H)
