/* coreout.h - Declarations and definitions related to
   BPF Compile Once - Run Everywhere (CO-RE) support.
   Copyright (C) 2021 Free Software Foundation, Inc.

   This file is part of GCC.

   GCC 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, or (at your option)
   any later version.

   GCC 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 GCC; see the file COPYING3.  If not see
   <http://www.gnu.org/licenses/>.  */


#ifndef __COREOUT_H
#define __COREOUT_H

#include <stdint.h>

#ifdef	__cplusplus
extern "C"
{
#endif

/* .BTF.ext information.  */

struct btf_ext_section_header
{
  uint32_t kind;
  uint32_t sec_name_off;
  uint32_t num_records;
};

/* A funcinfo record, in the .BTF.ext funcinfo section.  */
struct btf_ext_funcinfo
{
  uint32_t insn_off; /* Offset of the first instruction of the function.  */
  uint32_t type;     /* Type ID of a BTF_KIND_FUNC type.  */
};

/* A lineinfo record, in the .BTF.ext lineinfo section.  */
struct btf_ext_lineinfo
{
  uint32_t insn_off;      /* Offset of the instruction.  */
  uint32_t file_name_off; /* Offset of file name in BTF string table.  */
  uint32_t line_off;      /* Offset of source line in BTF string table.  */
  uint32_t line_col;      /* Line number (bits 31-11) and column (11-0).  */
};

enum btf_core_reloc_kind
{
  BPF_RELO_FIELD_BYTE_OFFSET = 0,
  BPF_RELO_FIELD_BYTE_SIZE = 1,
  BPF_RELO_FIELD_EXISTS = 2,
  BPF_RELO_FIELD_SIGNED = 3,
  BPF_RELO_FIELD_LSHIFT_U64 = 4,
  BPF_RELO_FIELD_RSHIFT_U64 = 5,
  BPF_RELO_TYPE_ID_LOCAL = 6,
  BPF_RELO_TYPE_ID_TARGET = 7,
  BPF_RELO_TYPE_EXISTS = 8,
  BPF_RELO_TYPE_SIZE = 9,
  BPF_RELO_ENUMVAL_EXISTS = 10,
  BPF_RELO_ENUMVAL_VALUE = 11
};

struct btf_ext_reloc
{
  uint32_t insn_off;       /* Offset of instruction to be patched. A
			      section-relative label at compile time.  */
  uint32_t type_id;        /* Type ID of the outermost containing entity, e.g.
			      the containing structure.  */
  uint32_t access_str_off; /* Offset of CO-RE accessor string in .BTF strings
			      section.  */
  uint32_t kind;           /* An enum btf_core_reloc_kind. Note that it always
			      takes 32 bits.  */
};

struct btf_ext_header
{
  uint16_t magic;		/* Magic number (BTF_MAGIC).  */
  uint8_t  version;		/* Data format version (BTF_VERSION).  */
  uint8_t  flags;		/* Flags. Currently unused.  */
  uint32_t hdr_len;		/* Length of this header in bytes.  */

  /* Following offsets are relative to the end of this header, in bytes.
     Following lengths are in bytes.  */
  uint32_t func_info_off;	/* Offset of funcinfo section.  */
  uint32_t func_info_len;	/* Length of funcinfo section.  */
  uint32_t line_info_off;	/* Offset of lineinfo section.  */
  uint32_t line_info_len;	/* Length of lineinfo section.  */

  uint32_t core_relo_off;	/* Offset of CO-RE relocation section.  */
  uint32_t core_relo_len;	/* Length of CO-RE relocation section.  */
};

extern void btf_ext_init (void);
extern void btf_ext_output (void);

extern void bpf_core_reloc_add (const tree, const char *, vec<unsigned int> *,
				rtx_code_label *);
extern int bpf_core_get_sou_member_index (ctf_container_ref, const tree);

#ifdef	__cplusplus
}
#endif

#endif /* __COREOUT_H */
