/* Copyright (C) 2021-2022 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 */
