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

// Copyright 2008 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;
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();

  // 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<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)
