GCC Middle and Back End API Reference
ctfc.h File Reference
#include "config.h"
#include "system.h"
#include "tree.h"
#include "fold-const.h"
#include "dwarf2ctf.h"
#include "ctf.h"
#include "btf.h"
Include dependency graph for ctfc.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  ctf_string
 
struct  ctf_strtable
 
struct  ctf_encoding
 
struct  ctf_arinfo
 
struct  ctf_funcinfo
 
struct  ctf_sliceinfo
 
struct  ctf_itype
 
struct  ctf_dmdef
 
struct  ctf_func_arg
 
struct  ctf_dtdef
 
struct  ctf_dvdef
 
struct  ctf_srcloc
 
struct  ctfc_dtd_hasher
 
struct  ctfc_dvd_hasher
 
struct  ctf_container
 

Macros

#define CTF_NULL_TYPEID   0
 
#define CTF_INIT_TYPEID   1
 
#define ctti_size   _u._size
 
#define ctti_type   _u._type
 
#define CTF_FUNC_VARARG   0x1
 
#define ctf_dmd_list_next(elem)   ((ctf_dmdef_t *)((elem)->dmd_next))
 
#define ctf_farg_list_next(elem)   ((ctf_func_arg_t *)((elem)->farg_next))
 
#define ctf_type_id(dtd)   ((uint32_t) dtd->dtd_type)
 
#define CTF_STRTAB   0 /* CTF string table. @endverbatim */
 
#define CTF_AUX_STRTAB   1 /* CTF auxilliary string table. @endverbatim */
 
#define CTF_ADD_NONROOT   0 /* CTF type only visible in nested scope. @endverbatim */
 
#define CTF_ADD_ROOT   1 /* CTF type visible at top-level scope. @endverbatim */
 

Typedefs

typedef uint64_t ctf_id_t
 
typedef struct ctf_dtdef ctf_dtdef_t
 
typedef ctf_dtdef_tctf_dtdef_ref
 
typedef struct ctf_string ctf_string_t
 
typedef struct ctf_strtable ctf_strtable_t
 
typedef struct ctf_encoding ctf_encoding_t
 
typedef struct ctf_arinfo ctf_arinfo_t
 
typedef struct ctf_funcinfo ctf_funcinfo_t
 
typedef struct ctf_sliceinfo ctf_sliceinfo_t
 
typedef struct ctf_itype ctf_itype_t
 
typedef struct ctf_dmdef ctf_dmdef_t
 
typedef struct ctf_func_arg ctf_func_arg_t
 
typedef struct ctf_dvdef ctf_dvdef_t
 
typedef ctf_dvdef_tctf_dvdef_ref
 
typedef struct ctf_srcloc ctf_srcloc_t
 
typedef ctf_srcloc_tctf_srcloc_ref
 
typedef struct ctf_container ctf_container_t
 
typedef ctf_container_tctf_container_ref
 
typedef bool(* funcs_traverse_callback) (ctf_dtdef_ref, void *)
 

Enumerations

enum  ctf_dtu_d_union_enum {
  CTF_DTU_D_MEMBERS , CTF_DTU_D_ARRAY , CTF_DTU_D_ENCODING , CTF_DTU_D_ARGUMENTS ,
  CTF_DTU_D_SLICE
}
 

Functions

enum ctf_dtu_d_union_enum ctf_dtu_d_union_selector (ctf_dtdef_ref)
 
void ctfc_delete_container (ctf_container_ref)
 
bool ctfc_is_empty_container (ctf_container_ref)
 
unsigned int ctfc_get_num_ctf_types (ctf_container_ref)
 
unsigned int ctfc_get_num_ctf_vars (ctf_container_ref)
 
ctf_strtable_tctfc_get_strtab (ctf_container_ref, int)
 
void init_ctf_strtable (ctf_strtable_t *)
 
void ctfc_delete_strtab (ctf_strtable_t *)
 
size_t ctfc_get_strtab_len (ctf_container_ref, int)
 
size_t ctfc_get_num_vlen_bytes (ctf_container_ref)
 
void ctf_init (void)
 
void ctf_output (const char *filename)
 
void ctf_finalize (void)
 
void btf_early_finish (void)
 
void btf_finish (void)
 
void btf_finalize (void)
 
ctf_container_ref ctf_get_tu_ctfc (void)
 
bool ctf_type_exists (ctf_container_ref, dw_die_ref, ctf_dtdef_ref *)
 
void ctf_add_cuname (ctf_container_ref, const char *)
 
ctf_dtdef_ref ctf_dtd_lookup (const ctf_container_ref ctfc, dw_die_ref die)
 
ctf_dvdef_ref ctf_dvd_lookup (const ctf_container_ref ctfc, dw_die_ref die)
 
bool ctf_dvd_ignore_lookup (const ctf_container_ref ctfc, dw_die_ref die)
 
const char * ctf_add_string (ctf_container_ref, const char *, uint32_t *, int)
 
ctf_dtdef_ref ctf_add_reftype (ctf_container_ref, uint32_t, ctf_dtdef_ref, uint32_t, dw_die_ref)
 
ctf_dtdef_ref ctf_add_enum (ctf_container_ref, uint32_t, const char *, HOST_WIDE_INT, bool, dw_die_ref)
 
ctf_dtdef_ref ctf_add_slice (ctf_container_ref, uint32_t, ctf_dtdef_ref, uint32_t, uint32_t, dw_die_ref)
 
ctf_dtdef_ref ctf_add_float (ctf_container_ref, uint32_t, const char *, const ctf_encoding_t *, dw_die_ref)
 
ctf_dtdef_ref ctf_add_integer (ctf_container_ref, uint32_t, const char *, const ctf_encoding_t *, dw_die_ref)
 
ctf_dtdef_ref ctf_add_unknown (ctf_container_ref, uint32_t, const char *, const ctf_encoding_t *, dw_die_ref)
 
ctf_dtdef_ref ctf_add_pointer (ctf_container_ref, uint32_t, ctf_dtdef_ref, dw_die_ref)
 
ctf_dtdef_ref ctf_add_array (ctf_container_ref, uint32_t, const ctf_arinfo_t *, dw_die_ref)
 
ctf_dtdef_ref ctf_add_forward (ctf_container_ref, uint32_t, const char *, uint32_t, dw_die_ref)
 
ctf_dtdef_ref ctf_add_typedef (ctf_container_ref, uint32_t, const char *, ctf_dtdef_ref, dw_die_ref)
 
ctf_dtdef_ref ctf_add_function (ctf_container_ref, uint32_t, const char *, const ctf_funcinfo_t *, dw_die_ref, bool, int)
 
ctf_dtdef_ref ctf_add_sou (ctf_container_ref, uint32_t, const char *, uint32_t, size_t, dw_die_ref)
 
int ctf_add_enumerator (ctf_container_ref, ctf_dtdef_ref, const char *, HOST_WIDE_INT, dw_die_ref)
 
int ctf_add_member_offset (ctf_container_ref, dw_die_ref, const char *, ctf_dtdef_ref, uint64_t)
 
int ctf_add_function_arg (ctf_container_ref, dw_die_ref, const char *, ctf_dtdef_ref)
 
int ctf_add_variable (ctf_container_ref, const char *, ctf_dtdef_ref, dw_die_ref, unsigned int, dw_die_ref)
 
ctf_dtdef_ref ctf_lookup_tree_type (ctf_container_ref, const tree)
 
bool traverse_btf_func_types (funcs_traverse_callback, void *)
 
void btf_mark_type_used (tree)
 
int ctfc_get_dtd_srcloc (ctf_dtdef_ref, ctf_srcloc_ref)
 
int ctfc_get_dvd_srcloc (ctf_dvdef_ref, ctf_srcloc_ref)
 

Variables

ctf_container_ref tu_ctfc
 

Macro Definition Documentation

◆ CTF_ADD_NONROOT

#define CTF_ADD_NONROOT   0 /* CTF type only visible in nested scope. @endverbatim */
The compiler demarcates whether types are visible at top-level scope or not.
The only example so far of a type not visible at top-level scope is slices.
CTF_ADD_NONROOT is used to indicate the latter.   

Referenced by ctf_add_enum(), ctf_add_generic(), ctf_add_sou(), and gen_ctf_sou_type().

◆ CTF_ADD_ROOT

◆ CTF_AUX_STRTAB

#define CTF_AUX_STRTAB   1 /* CTF auxilliary string table. @endverbatim */

◆ ctf_dmd_list_next

◆ ctf_farg_list_next

#define ctf_farg_list_next ( elem)    ((ctf_func_arg_t *)((elem)->farg_next))

◆ CTF_FUNC_VARARG

#define CTF_FUNC_VARARG   0x1
Function arguments end with varargs.   

Referenced by gen_ctf_function_type().

◆ CTF_INIT_TYPEID

#define CTF_INIT_TYPEID   1
Value to start generating the CTF type ID from.   

Referenced by ctfc_is_empty_container(), and init_ctf_container().

◆ CTF_NULL_TYPEID

#define CTF_NULL_TYPEID   0
ctfc.h - Declarations and definitions related to the CTF container.
   Copyright (C) 2019-2024 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/>.   
This file defines the data structures and functions used by the compiler
to generate the CTF debug info.  The definitions below are compiler internal
representations and closely reflect the CTF format requirements in <ctf.h>.

The contents of the CTF container are used eventually for emission of both
CTF (ctfout.cc) and BTF debug info (btfout.cc), as the two type debug formats
are close cousins.   
Invalid CTF type ID definition.   

Referenced by output_asm_ctf_sou_fields(), output_asm_ctf_type(), output_asm_ctf_vlen_bytes(), and output_ctf_vars().

◆ CTF_STRTAB

#define CTF_STRTAB   0 /* CTF string table. @endverbatim */
Markers for which string table from the CTF container to use.   

Referenced by btf_add_used_type(), btf_assign_datasec_ids(), btf_collect_pruned_types(), ctf_output(), and output_asm_btf_func_args_list().

◆ ctf_type_id

#define ctf_type_id ( dtd)    ((uint32_t) dtd->dtd_type)

◆ ctti_size

#define ctti_size   _u._size

◆ ctti_type

#define ctti_type   _u._type

Typedef Documentation

◆ ctf_arinfo_t

typedef struct ctf_arinfo ctf_arinfo_t
Array information for CTF generation.   

◆ ctf_container_ref

◆ ctf_container_t

CTF container structure.
It is the context passed around when generating ctf debug info.  There is
one container per translation unit.   

◆ ctf_dmdef_t

typedef struct ctf_dmdef ctf_dmdef_t
Struct/union/enum member definition for CTF generation.   

◆ ctf_dtdef_ref

◆ ctf_dtdef_t

typedef struct ctf_dtdef ctf_dtdef_t

◆ ctf_dvdef_ref

◆ ctf_dvdef_t

typedef struct ctf_dvdef ctf_dvdef_t

◆ ctf_encoding_t

typedef struct ctf_encoding ctf_encoding_t
Encoding information for integers, floating-point values etc.  The flags
field will contain values appropriate for the type defined in <ctf.h>.   

◆ ctf_func_arg_t

typedef struct ctf_func_arg ctf_func_arg_t
Function Argument.   

◆ ctf_funcinfo_t

typedef struct ctf_funcinfo ctf_funcinfo_t
Function information for CTF generation.   

◆ ctf_id_t

typedef uint64_t ctf_id_t
CTF type ID.   

◆ ctf_itype_t

typedef struct ctf_itype ctf_itype_t
CTF type representation internal to the compiler.  It closely reflects the
ctf_type_t type node in <ctf.h> except the tags.   

◆ ctf_sliceinfo_t

◆ ctf_srcloc_ref

◆ ctf_srcloc_t

typedef struct ctf_srcloc ctf_srcloc_t
Location information for CTF Types and CTF Variables.   

◆ ctf_string_t

typedef struct ctf_string ctf_string_t
CTF string table element (list node).   

◆ ctf_strtable_t

typedef struct ctf_strtable ctf_strtable_t
Internal representation of CTF string table.   

◆ funcs_traverse_callback

typedef bool(* funcs_traverse_callback) (ctf_dtdef_ref, void *)
Callback and traversal function for BTF_KIND_FUNC records.  Used by BPF
target for BPF CO-RE implementation.   

Enumeration Type Documentation

◆ ctf_dtu_d_union_enum

Helper enum and api for the GTY machinery to work on union dtu_d.   
Enumerator
CTF_DTU_D_MEMBERS 
CTF_DTU_D_ARRAY 
CTF_DTU_D_ENCODING 
CTF_DTU_D_ARGUMENTS 
CTF_DTU_D_SLICE 

Function Documentation

◆ btf_early_finish()

void btf_early_finish ( void )
extern

◆ btf_finalize()

void btf_finalize ( void )
extern
Reset all state for BTF generation so that we can rerun the compiler within
the same process.   

References btf_info_section, btf_used_types, ctf_get_tu_ctfc(), ctfc_delete_container(), datasecs, fixups, forwards, func_map, funcs, i, max_translated_id, NULL, and tu_ctfc.

Referenced by btf_finish().

◆ btf_finish()

◆ btf_mark_type_used()

void btf_mark_type_used ( tree t)
extern
Manually mark that type T is used to ensure it will not be pruned.
Used by the BPF backend when generating BPF CO-RE to mark types used
in CO-RE relocations.   

References btf_add_used_type(), ctf_get_tu_ctfc(), ctf_lookup_tree_type(), gcc_assert, and TYPE_P.

◆ ctf_add_array()

◆ ctf_add_cuname()

void ctf_add_cuname ( ctf_container_ref ctfc,
const char * filename )
extern
Add the compilation unit (CU) name string to the CTF string table.  The
CU name has a prepended pwd string if it is a relative path.  Also set the
CU name offset in the CTF container.   

References CONST_CAST, ctf_add_string(), ctf_container::ctfc_cuname_offset, ctf_container::ctfc_strlen, DIR_SEPARATOR, get_src_pwd(), ggc_alloc_atomic(), ggc_strdup, and NULL.

Referenced by ctf_output().

◆ ctf_add_enum()

ctf_dtdef_ref ctf_add_enum ( ctf_container_ref ctfc,
uint32_t flag,
const char * name,
HOST_WIDE_INT size,
bool eunsigned,
dw_die_ref die )
extern

◆ ctf_add_enumerator()

◆ ctf_add_float()

ctf_dtdef_ref ctf_add_float ( ctf_container_ref ctfc,
uint32_t flag,
const char * name,
const ctf_encoding_t * ep,
dw_die_ref die )
extern

References ctf_add_encoded().

Referenced by gen_ctf_base_type().

◆ ctf_add_forward()

ctf_dtdef_ref ctf_add_forward ( ctf_container_ref ctfc,
uint32_t flag,
const char * name,
uint32_t kind,
dw_die_ref die )
extern

◆ ctf_add_function()

◆ ctf_add_function_arg()

◆ ctf_add_integer()

ctf_dtdef_ref ctf_add_integer ( ctf_container_ref ctfc,
uint32_t flag,
const char * name,
const ctf_encoding_t * ep,
dw_die_ref die )
extern

◆ ctf_add_member_offset()

◆ ctf_add_pointer()

ctf_dtdef_ref ctf_add_pointer ( ctf_container_ref ctfc,
uint32_t flag,
ctf_dtdef_ref ref,
dw_die_ref die )
extern

References ctf_add_reftype().

Referenced by gen_ctf_pointer_type().

◆ ctf_add_reftype()

◆ ctf_add_slice()

◆ ctf_add_sou()

◆ ctf_add_string()

const char * ctf_add_string ( ctf_container_ref ctfc,
const char * name,
uint32_t * name_offset,
int aux_str = CTF_STRTAB )
extern

◆ ctf_add_typedef()

◆ ctf_add_unknown()

ctf_dtdef_ref ctf_add_unknown ( ctf_container_ref ctfc,
uint32_t flag,
const char * name,
const ctf_encoding_t * ep,
dw_die_ref die )
extern

References ctf_add_encoded().

Referenced by gen_ctf_unknown_type().

◆ ctf_add_variable()

◆ ctf_dtd_lookup()

◆ ctf_dtu_d_union_selector()

enum ctf_dtu_d_union_enum ctf_dtu_d_union_selector ( ctf_dtdef_ref ctftype)
Return which member of the union is used in CTFTYPE.  Used for garbage
collection.   

References CTF_DTU_D_ARGUMENTS, CTF_DTU_D_ARRAY, CTF_DTU_D_ENCODING, CTF_DTU_D_MEMBERS, CTF_DTU_D_SLICE, ctf_itype::ctti_info, and ctf_dtdef::dtd_data.

◆ ctf_dvd_ignore_lookup()

bool ctf_dvd_ignore_lookup ( const ctf_container_ref ctfc,
dw_die_ref die )
extern
Lookup the dummy CTF variable given the DWARF die for the non-defining
decl to be ignored.   

References ctf_container::ctfc_ignore_vars, ctf_dvdef::dvd_key, and hash_table< Descriptor, Lazy, Allocator >::find_slot().

Referenced by btf_emit_variable_p(), ctf_dvd_preprocess_cb(), and gen_ctf_variable().

◆ ctf_dvd_lookup()

ctf_dvdef_ref ctf_dvd_lookup ( const ctf_container_ref ctfc,
dw_die_ref die )
extern

◆ ctf_finalize()

void ctf_finalize ( void )
extern
Reset all state for CTF generation so that we can rerun the compiler within
the same process.   

References ctf_get_tu_ctfc(), ctf_info_section, ctfc_delete_container(), NULL, and tu_ctfc.

Referenced by ctf_debug_early_finish().

◆ ctf_get_tu_ctfc()

◆ ctf_init()

void ctf_init ( void )
extern
These APIs allow to initialize and finalize the CTF machinery and
to add types to the CTF container associated to the current
translation unit.  Used in dwarf2ctf.cc.   
CTF routines interfacing to the compiler.   

References init_ctf_container().

Referenced by ctf_debug_init().

◆ ctf_lookup_tree_type()

ctf_dtdef_ref ctf_lookup_tree_type ( ctf_container_ref ctfc,
const tree type )
extern
Given a TREE_TYPE node, return the CTF type object for that type.   

References ctf_dtd_lookup(), lookup_type_die(), and NULL.

Referenced by btf_mark_type_used().

◆ ctf_output()

◆ ctf_type_exists()

bool ctf_type_exists ( ctf_container_ref ctfc,
dw_die_ref type,
ctf_dtdef_ref * dtd )
extern
Check if CTF for TYPE has already been generated.  Mainstay for
de-duplication.  If CTF type already exists, returns TRUE and updates
the CTF type object DTD for the caller.   

References ctf_dtd_lookup().

Referenced by gen_ctf_array_type(), gen_ctf_function(), gen_ctf_function_type(), gen_ctf_modifier_type(), gen_ctf_pointer_type(), gen_ctf_sou_type(), gen_ctf_subrange_type(), gen_ctf_type(), gen_ctf_typedef(), and gen_ctf_unknown_type().

◆ ctfc_delete_container()

◆ ctfc_delete_strtab()

◆ ctfc_get_dtd_srcloc()

int ctfc_get_dtd_srcloc ( ctf_dtdef_ref dtd,
ctf_srcloc_ref loc )
extern
CTF section does not emit location information; at this time, location
information is needed for BTF CO-RE use-cases.   
Location information for CTF Types and CTF Variables.  CTF section does not
emit location information; at this time, location information is needed for
BTF CO-RE use-cases.   

References ctf_get_die_loc_col(), ctf_get_die_loc_file(), ctf_get_die_loc_line(), ctf_srcloc::ctsloc_col, ctf_srcloc::ctsloc_file, ctf_srcloc::ctsloc_line, ctf_dtdef::dtd_key, and NULL.

◆ ctfc_get_dvd_srcloc()

◆ ctfc_get_num_ctf_types()

unsigned int ctfc_get_num_ctf_types ( ctf_container_ref ctfc)
extern
Get the total number of CTF types in the container.   

References ctf_container::ctfc_types, and hash_table< Descriptor, Lazy, Allocator >::elements().

Referenced by output_ctf_header().

◆ ctfc_get_num_ctf_vars()

unsigned int ctfc_get_num_ctf_vars ( ctf_container_ref ctfc)
extern
Get the total number of CTF variables in the container.   

References ctf_container::ctfc_vars, and hash_table< Descriptor, Lazy, Allocator >::elements().

Referenced by ctf_preprocess().

◆ ctfc_get_num_vlen_bytes()

size_t ctfc_get_num_vlen_bytes ( ctf_container_ref ctfc)
extern
Get the number of bytes to represent the variable length portion of all CTF
types in the CTF container.   

References ctf_container::ctfc_num_vlen_bytes.

Referenced by output_ctf_header().

◆ ctfc_get_strtab()

ctf_strtable_t * ctfc_get_strtab ( ctf_container_ref ctfc,
int aux )
extern
Get reference to the CTF string table or the CTF auxilliary
string table.   

References ctf_container::ctfc_strtable.

Referenced by ctf_add_string(), and ctfc_get_strtab_len().

◆ ctfc_get_strtab_len()

size_t ctfc_get_strtab_len ( ctf_container_ref ctfc,
int aux )
extern
Get the length of the specified string table in the CTF container.   
Get the length of the specified string table of the CTF container.   

References ctfc_get_strtab(), and ctf_strtable::ctstab_len.

Referenced by btf_assign_datasec_ids(), ctf_output(), and output_asm_btf_func_args_list().

◆ ctfc_is_empty_container()

bool ctfc_is_empty_container ( ctf_container_ref ctfc)
extern
If the next ctf type id is still set to the init value, no ctf records to
report.   

References CTF_INIT_TYPEID.

Referenced by output_btf_header(), and output_ctf_header().

◆ init_ctf_strtable()

void init_ctf_strtable ( ctf_strtable_t * strtab)
extern
CTF container setup and teardown routines.   
Initialize the CTF string table.
The first entry in the CTF string table (empty string) is added.   

References ctfc_strtable_add_str(), ctf_strtable::ctstab_estr, ctf_strtable::ctstab_head, ctf_strtable::ctstab_len, ctf_strtable::ctstab_num, ctf_strtable::ctstab_tail, and NULL.

Referenced by btf_early_finish(), and init_ctf_string_table().

◆ traverse_btf_func_types()

bool traverse_btf_func_types ( funcs_traverse_callback callback,
void * data )
Traversal function for all BTF_KIND_FUNC type records.   

References FOR_EACH_VEC_ELT, funcs, and i.

Variable Documentation

◆ tu_ctfc

ctf_container_ref tu_ctfc
extern
Generate CTF.
   Copyright (C) 2019-2024 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/>.   
A CTF container object - one per translation unit.   

Referenced by btf_early_finish(), btf_finalize(), btf_finish(), ctf_do_die(), ctf_finalize(), ctf_get_tu_ctfc(), ctf_output(), init_ctf_container(), and new_ctf_container().