/* Copyright (C) 2021 Free Software Foundation, Inc.

   This file is part of GDB.

   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, see <http://www.gnu.org/licenses/>.  */

/* This file contains generic functions for writing ELF based core files.  */

#if !defined (GCORE_ELF_H)
#define GCORE_ELF_H 1

#include "gdb_bfd.h"
#include "gdbsupport/gdb_signals.h"
#include "gcore.h"

struct gdbarch;
struct thread_info;

/* Add content to *NOTE_DATA (and update *NOTE_SIZE) to describe the
   registers of thread INFO.  Report the thread as having stopped with
   STOP_SIGNAL.  The core file is being written to OBFD, and GDBARCH is the
   architecture for which the core file is being generated.  */

extern void gcore_elf_build_thread_register_notes
  (struct gdbarch *gdbarch, struct thread_info *info, gdb_signal stop_signal,
   bfd *obfd, gdb::unique_xmalloc_ptr<char> *note_data, int *note_size);

/* Add content to *NOTE_DATA (and update *NOTE_SIZE) to include a note
   containing the current targtet's target description.  The core file is
   being written to OBFD.  If something goes wrong then *NOTE_DATA can be
   set to nullptr.  */

extern void gcore_elf_make_tdesc_note
  (bfd *obfd, gdb::unique_xmalloc_ptr<char> *note_data, int *note_size);

#endif /* GCORE_ELF_H */
