/* dwarf2codeview.h - DWARF interface for CodeView generation.
   Copyright (C) 2023-2025 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 GCC_DWARF2CODEVIEW_H
#define GCC_DWARF2CODEVIEW_H 1

#include "dwarf2out.h"
#include "flags.h"

/* Constants for in-built types.  */

#define T_VOID			0x0003
#define T_HRESULT		0x0008
#define T_CHAR			0x0010
#define T_SHORT			0x0011
#define T_LONG			0x0012
#define T_QUAD			0x0013
#define T_UCHAR			0x0020
#define T_USHORT		0x0021
#define T_ULONG			0x0022
#define T_UQUAD			0x0023
#define T_BOOL08		0x0030
#define T_REAL32		0x0040
#define T_REAL64		0x0041
#define T_REAL80		0x0042
#define T_REAL128		0x0043
#define T_RCHAR			0x0070
#define T_WCHAR			0x0071
#define T_INT4			0x0074
#define T_UINT4			0x0075
#define T_CHAR16		0x007a
#define T_CHAR32		0x007b
#define T_CHAR8			0x007c

#define CV_POINTER_32		0x0400
#define CV_POINTER_64		0x0600
#define T_32PVOID		(T_VOID | CV_POINTER_32)
#define T_64PVOID		(T_VOID | CV_POINTER_64)

/* LF_POINTER attributes.  */
#define CV_PTR_NEAR32		0x0a
#define CV_PTR_64		0x0c

/* enum CV_ptrmode_e in cvinfo.h, shifted by 5 for the lfPointerAttr bitfield */
#define CV_PTR_MODE_MASK	0xe0
#define CV_PTR_MODE_LVREF	0x20
#define CV_PTR_MODE_PMEM	0x40
#define CV_PTR_MODE_PMFUNC	0x60
#define CV_PTR_MODE_RVREF	0x80

/* enum CV_pmtype_e in in cvinfo.h */
#define CV_PMTYPE_D_Single	0x01
#define CV_PMTYPE_F_Single	0x05

/* LF_MODIFIER values.  */
#define MOD_const		0x1
#define MOD_volatile		0x2

#define CV_ACCESS_PRIVATE	1
#define CV_ACCESS_PROTECTED	2
#define CV_ACCESS_PUBLIC	3

/* CV_methodprop_e values in cvinfo.h, shifted by 2 for CV_fldattr_t.  */
#define CV_METHOD_VANILLA	0x00
#define CV_METHOD_VIRTUAL	0x04
#define CV_METHOD_STATIC	0x08
#define CV_METHOD_FRIEND	0x0c
#define CV_METHOD_INTRO		0x10
#define CV_METHOD_PUREVIRT	0x14
#define CV_METHOD_PUREINTRO	0x18

#define CV_PROP_FWDREF		0x80

/* Debug Format Interface.  Used in dwarf2out.cc.  */

extern void codeview_debug_finish (void);
extern void codeview_source_line (unsigned int, const char *);
extern void codeview_start_source_file (const char *);
extern void codeview_switch_text_section ();
extern void codeview_end_epilogue (void);
extern void codeview_debug_early_finish (dw_die_ref die);
extern void codeview_begin_block (unsigned int, unsigned int, tree);
extern void codeview_end_block (unsigned int, unsigned int);
extern void codeview_abstract_function (tree);

#endif /* GCC_DWARF2CODEVIEW_H */
