1 1.1 mrg /* Output CTF format from GCC. 2 1.1 mrg Copyright (C) 2019-2022 Free Software Foundation, Inc. 3 1.1 mrg 4 1.1 mrg This file is part of GCC. 5 1.1 mrg 6 1.1 mrg GCC is free software; you can redistribute it and/or modify it under 7 1.1 mrg the terms of the GNU General Public License as published by the Free 8 1.1 mrg Software Foundation; either version 3, or (at your option) any later 9 1.1 mrg version. 10 1.1 mrg 11 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY 12 1.1 mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 1.1 mrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 1.1 mrg for more details. 15 1.1 mrg 16 1.1 mrg You should have received a copy of the GNU General Public License 17 1.1 mrg along with GCC; see the file COPYING3. If not see 18 1.1 mrg <http://www.gnu.org/licenses/>. */ 19 1.1 mrg 20 1.1 mrg #include "config.h" 21 1.1 mrg #include "system.h" 22 1.1 mrg #include "coretypes.h" 23 1.1 mrg #include "target.h" 24 1.1 mrg #include "memmodel.h" 25 1.1 mrg #include "tm_p.h" 26 1.1 mrg #include "output.h" 27 1.1 mrg #include "dwarf2asm.h" 28 1.1 mrg #include "debug.h" 29 1.1 mrg #include "ctfc.h" 30 1.1 mrg #include "diagnostic-core.h" 31 1.1 mrg 32 1.1 mrg static int ctf_label_num; 33 1.1 mrg 34 1.1 mrg /* Pointers to various CTF sections. */ 35 1.1 mrg 36 1.1 mrg static GTY (()) section * ctf_info_section; 37 1.1 mrg 38 1.1 mrg /* Section names used to hold CTF debugging information. */ 39 1.1 mrg 40 1.1 mrg /* CTF debug info section. */ 41 1.1 mrg 42 1.1 mrg #ifndef CTF_INFO_SECTION_NAME 43 1.1 mrg #define CTF_INFO_SECTION_NAME ".ctf" 44 1.1 mrg #endif 45 1.1 mrg 46 1.1 mrg /* Section flags for the CTF debug info section. */ 47 1.1 mrg 48 1.1 mrg #define CTF_INFO_SECTION_FLAGS (SECTION_DEBUG) 49 1.1 mrg 50 1.1 mrg /* Maximum size (in bytes) of an artificially generated CTF label. */ 51 1.1 mrg 52 1.1 mrg #define MAX_CTF_LABEL_BYTES 40 53 1.1 mrg 54 1.1 mrg static char ctf_info_section_label[MAX_CTF_LABEL_BYTES]; 55 1.1 mrg 56 1.1 mrg #ifndef CTF_INFO_SECTION_LABEL 57 1.1 mrg #define CTF_INFO_SECTION_LABEL "Lctf" 58 1.1 mrg #endif 59 1.1 mrg 60 1.1 mrg /* CTF preprocess callback arguments. */ 61 1.1 mrg 62 1.1 mrg typedef struct ctf_dtd_preprocess_arg 63 1.1 mrg { 64 1.1 mrg uint64_t dtd_global_func_idx; 65 1.1 mrg ctf_container_ref dtd_arg_ctfc; 66 1.1 mrg } ctf_dtd_preprocess_arg_t; 67 1.1 mrg 68 1.1 mrg typedef struct ctf_dvd_preprocess_arg 69 1.1 mrg { 70 1.1 mrg uint64_t dvd_global_obj_idx; 71 1.1 mrg ctf_container_ref dvd_arg_ctfc; 72 1.1 mrg } ctf_dvd_preprocess_arg_t; 73 1.1 mrg 74 1.1 mrg /* Compare two CTF variable definition entries. Currently used for sorting 75 1.1 mrg by name. */ 76 1.1 mrg 77 1.1 mrg static int 78 1.1 mrg ctf_varent_compare (const void * entry1, const void * entry2) 79 1.1 mrg { 80 1.1 mrg int result; 81 1.1 mrg const ctf_dvdef_t * e1 = *(const ctf_dvdef_t * const*) entry1; 82 1.1 mrg const ctf_dvdef_t * e2 = *(const ctf_dvdef_t * const*) entry2; 83 1.1 mrg 84 1.1 mrg result = strcmp (e1->dvd_name, e2->dvd_name); 85 1.1 mrg 86 1.1 mrg return result; 87 1.1 mrg } 88 1.1 mrg 89 1.1 mrg /* A CTF type record may be followed by variable-length of bytes to encode the 90 1.1 mrg CTF type completely. This routine calculates the number of bytes, in the 91 1.1 mrg final binary CTF format, which are used to encode information about the type 92 1.1 mrg completely. 93 1.1 mrg 94 1.1 mrg This function must always be in sync with the CTF header. */ 95 1.1 mrg 96 1.1 mrg static uint64_t 97 1.1 mrg ctf_calc_num_vbytes (ctf_dtdef_ref ctftype) 98 1.1 mrg { 99 1.1 mrg uint32_t size; 100 1.1 mrg uint64_t vlen_bytes = 0; 101 1.1 mrg 102 1.1 mrg uint32_t kind = CTF_V2_INFO_KIND (ctftype->dtd_data.ctti_info); 103 1.1 mrg uint32_t vlen = CTF_V2_INFO_VLEN (ctftype->dtd_data.ctti_info); 104 1.1 mrg 105 1.1 mrg ctf_dmdef_t * dmd; 106 1.1 mrg ctf_func_arg_t * farg; 107 1.1 mrg uint32_t size_per_member = 0; 108 1.1 mrg unsigned int num_members = 0; 109 1.1 mrg unsigned int num_fargs = 0; 110 1.1 mrg 111 1.1 mrg switch (kind) 112 1.1 mrg { 113 1.1 mrg case CTF_K_FORWARD: 114 1.1 mrg case CTF_K_UNKNOWN: 115 1.1 mrg case CTF_K_POINTER: 116 1.1 mrg case CTF_K_TYPEDEF: 117 1.1 mrg case CTF_K_VOLATILE: 118 1.1 mrg case CTF_K_CONST: 119 1.1 mrg case CTF_K_RESTRICT: 120 1.1 mrg /* These types have no vlen data. */ 121 1.1 mrg break; 122 1.1 mrg 123 1.1 mrg case CTF_K_INTEGER: 124 1.1 mrg case CTF_K_FLOAT: 125 1.1 mrg /* 4 bytes to represent encoding CTF_INT_DATA, CTF_FP_DATA. */ 126 1.1 mrg vlen_bytes += sizeof (uint32_t); 127 1.1 mrg break; 128 1.1 mrg case CTF_K_FUNCTION: 129 1.1 mrg /* Sanity check - number of function args must be the same as 130 1.1 mrg vlen. */ 131 1.1 mrg for (farg = ctftype->dtd_u.dtu_argv; 132 1.1 mrg farg != NULL; farg = (ctf_func_arg_t *) ctf_farg_list_next (farg)) 133 1.1 mrg num_fargs++; 134 1.1 mrg gcc_assert (vlen == num_fargs); 135 1.1 mrg 136 1.1 mrg /* FIXME - CTF_PADDING_FOR_ALIGNMENT. */ 137 1.1 mrg vlen_bytes += (vlen + (vlen & 1)) * sizeof (uint32_t); 138 1.1 mrg break; 139 1.1 mrg case CTF_K_ARRAY: 140 1.1 mrg /* This has a single ctf_array_t. */ 141 1.1 mrg vlen_bytes += sizeof (ctf_array_t); 142 1.1 mrg break; 143 1.1 mrg case CTF_K_SLICE: 144 1.1 mrg vlen_bytes += sizeof (ctf_slice_t); 145 1.1 mrg break; 146 1.1 mrg case CTF_K_STRUCT: 147 1.1 mrg case CTF_K_UNION: 148 1.1 mrg /* Count the number and type of members. */ 149 1.1 mrg size = ctftype->dtd_data.ctti_size; 150 1.1 mrg size_per_member = size >= CTF_LSTRUCT_THRESH 151 1.1 mrg ? sizeof (ctf_lmember_t) : sizeof (ctf_member_t); 152 1.1 mrg 153 1.1 mrg /* Sanity check - number of members of struct must be the same as 154 1.1 mrg vlen. */ 155 1.1 mrg for (dmd = ctftype->dtd_u.dtu_members; 156 1.1 mrg dmd != NULL; dmd = (ctf_dmdef_t *) ctf_dmd_list_next (dmd)) 157 1.1 mrg num_members++; 158 1.1 mrg gcc_assert (vlen == num_members); 159 1.1 mrg 160 1.1 mrg vlen_bytes += (num_members * size_per_member); 161 1.1 mrg break; 162 1.1 mrg case CTF_K_ENUM: 163 1.1 mrg vlen_bytes += vlen * sizeof (ctf_enum_t); 164 1.1 mrg break; 165 1.1 mrg default : 166 1.1 mrg break; 167 1.1 mrg } 168 1.1 mrg return vlen_bytes; 169 1.1 mrg } 170 1.1 mrg 171 1.1 mrg /* Add a CTF variable to the end of the list. */ 172 1.1 mrg 173 1.1 mrg static void 174 1.1 mrg ctf_list_add_ctf_vars (ctf_container_ref ctfc, ctf_dvdef_ref var) 175 1.1 mrg { 176 1.1 mrg ctfc->ctfc_vars_list[ctfc->ctfc_vars_list_count++] = var; 177 1.1 mrg } 178 1.1 mrg 179 1.1 mrg /* Initialize the various sections and labels for CTF output. */ 180 1.1 mrg 181 1.1 mrg void 182 1.1 mrg init_ctf_sections (void) 183 1.1 mrg { 184 1.1 mrg /* Note : Even in case of LTO, the compiler continues to generate a single 185 1.1 mrg CTF section for each compilation unit "early". Unlike other debug 186 1.1 mrg sections, CTF sections are non-LTO sections, and do not take the 187 1.1 mrg .gnu.debuglto_ prefix. The linker will de-duplicate the types in the CTF 188 1.1 mrg sections, in case of LTO or otherwise. */ 189 1.1 mrg ctf_info_section = get_section (CTF_INFO_SECTION_NAME, CTF_INFO_SECTION_FLAGS, 190 1.1 mrg NULL); 191 1.1 mrg 192 1.1 mrg ASM_GENERATE_INTERNAL_LABEL (ctf_info_section_label, 193 1.1 mrg CTF_INFO_SECTION_LABEL, ctf_label_num++); 194 1.1 mrg } 195 1.1 mrg 196 1.1 mrg /* Routines for CTF pre-processing. */ 197 1.1 mrg 198 1.1 mrg static void 199 1.1 mrg ctf_preprocess_var (ctf_container_ref ctfc, ctf_dvdef_ref var) 200 1.1 mrg { 201 1.1 mrg /* Add it to the list of types. This array of types will be sorted before 202 1.1 mrg assembling into output. */ 203 1.1 mrg ctf_list_add_ctf_vars (ctfc, var); 204 1.1 mrg } 205 1.1 mrg 206 1.1 mrg /* CTF preprocess callback routine for CTF variables. */ 207 1.1 mrg 208 1.1 mrg int 209 1.1 mrg ctf_dvd_preprocess_cb (ctf_dvdef_ref * slot, void * arg) 210 1.1 mrg { 211 1.1 mrg ctf_dvd_preprocess_arg_t * dvd_arg = (ctf_dvd_preprocess_arg_t *)arg; 212 1.1 mrg ctf_dvdef_ref var = (ctf_dvdef_ref) *slot; 213 1.1 mrg ctf_container_ref arg_ctfc = dvd_arg->dvd_arg_ctfc; 214 1.1 mrg 215 1.1 mrg /* If the CTF variable corresponds to an extern variable declaration with 216 1.1 mrg a defining declaration later on, skip it. Only CTF variable 217 1.1 mrg corresponding to the defining declaration for the extern variable is 218 1.1 mrg desirable. */ 219 1.1 mrg if (ctf_dvd_ignore_lookup (arg_ctfc, var->dvd_key)) 220 1.1 mrg return 1; 221 1.1 mrg 222 1.1 mrg ctf_preprocess_var (arg_ctfc, var); 223 1.1 mrg 224 1.1 mrg /* Keep track of global objts. */ 225 1.1 mrg arg_ctfc->ctfc_gobjts_list[dvd_arg->dvd_global_obj_idx] = var; 226 1.1 mrg dvd_arg->dvd_global_obj_idx++; 227 1.1 mrg 228 1.1 mrg return 1; 229 1.1 mrg } 230 1.1 mrg 231 1.1 mrg /* CTF preprocess callback routine for CTF types. */ 232 1.1 mrg 233 1.1 mrg int 234 1.1 mrg ctf_dtd_preprocess_cb (ctf_dtdef_ref * slot, void * arg) 235 1.1 mrg { 236 1.1 mrg uint32_t kind; 237 1.1 mrg 238 1.1 mrg ctf_dtdef_ref ctftype = (ctf_dtdef_ref) *slot; 239 1.1 mrg ctf_dtd_preprocess_arg_t * dtd_arg = (ctf_dtd_preprocess_arg_t *)arg; 240 1.1 mrg ctf_container_ref arg_ctfc = dtd_arg->dtd_arg_ctfc; 241 1.1 mrg 242 1.1 mrg size_t index = ctftype->dtd_type; 243 1.1 mrg gcc_assert (index <= arg_ctfc->ctfc_types->elements ()); 244 1.1 mrg 245 1.1 mrg /* CTF types need to be output in the order of their type IDs. In other 246 1.1 mrg words, if type A is used to define type B, type ID of type A must 247 1.1 mrg appear before type ID of type B. */ 248 1.1 mrg arg_ctfc->ctfc_types_list[index] = ctftype; 249 1.1 mrg 250 1.1 mrg /* Keep track of the CTF type if it's a function type and the type 251 1.1 mrg was generated from a function object. */ 252 1.1 mrg kind = CTF_V2_INFO_KIND (ctftype->dtd_data.ctti_info); 253 1.1 mrg if (kind == CTF_K_FUNCTION && ctftype->from_global_func) 254 1.1 mrg { 255 1.1 mrg arg_ctfc->ctfc_gfuncs_list[dtd_arg->dtd_global_func_idx] = ctftype; 256 1.1 mrg dtd_arg->dtd_global_func_idx++; 257 1.1 mrg } 258 1.1 mrg 259 1.1 mrg /* Calculate the vlen bytes. */ 260 1.1 mrg arg_ctfc->ctfc_num_vlen_bytes += ctf_calc_num_vbytes (ctftype); 261 1.1 mrg 262 1.1 mrg return 1; 263 1.1 mrg } 264 1.1 mrg 265 1.1 mrg /* CTF preprocessing. 266 1.1 mrg After the CTF types for the compilation unit have been generated fully, the 267 1.1 mrg compiler writes out the asm for the CTF types. 268 1.1 mrg 269 1.1 mrg CTF writeout in the compiler requires two passes over the CTF types. In the 270 1.1 mrg first pass, the CTF preprocess pass: 271 1.1 mrg 1. CTF types are sorted in the order of their type IDs. 272 1.1 mrg 2. The variable number of bytes after each CTF type record are calculated. 273 1.1 mrg This is used to calculate the offsets in the ctf_header_t. 274 1.1 mrg 3. If the CTF type is of CTF_K_FUNCTION, the number of bytes in the 275 1.1 mrg funcinfo sub-section are calculated. This is used to calculate the 276 1.1 mrg offsets in the ctf_header_t. 277 1.1 mrg 4. Keep the list of CTF variables in ASCIIbetical order of their names. 278 1.1 mrg 279 1.1 mrg In the second pass, the CTF writeout pass, asm tags are written out using 280 1.1 mrg the compiler's afore-generated internal pre-processed CTF types. */ 281 1.1 mrg 282 1.1 mrg static void 283 1.1 mrg ctf_preprocess (ctf_container_ref ctfc) 284 1.1 mrg { 285 1.1 mrg size_t num_ctf_types = ctfc->ctfc_types->elements (); 286 1.1 mrg size_t num_ctf_vars = ctfc_get_num_ctf_vars (ctfc); 287 1.1 mrg 288 1.1 mrg /* Initialize an array to keep track of the CTF variables at global 289 1.1 mrg scope. At this time, size it conservatively. */ 290 1.1 mrg size_t num_global_objts = num_ctf_vars; 291 1.1 mrg if (num_global_objts) 292 1.1 mrg { 293 1.1 mrg ctfc->ctfc_gobjts_list = ggc_vec_alloc<ctf_dvdef_t*>(num_global_objts); 294 1.1 mrg } 295 1.1 mrg 296 1.1 mrg if (num_ctf_vars) 297 1.1 mrg { 298 1.1 mrg ctf_dvd_preprocess_arg_t dvd_arg; 299 1.1 mrg dvd_arg.dvd_global_obj_idx = 0; 300 1.1 mrg dvd_arg.dvd_arg_ctfc = ctfc; 301 1.1 mrg 302 1.1 mrg /* Allocate CTF var list. */ 303 1.1 mrg ctfc->ctfc_vars_list = ggc_vec_alloc<ctf_dvdef_ref>(num_ctf_vars); 304 1.1 mrg /* Variables appear in the sort ASCIIbetical order of their names. This 305 1.1 mrg permits binary searching in the CTF reader. Add the variables to a 306 1.1 mrg list for sorting. */ 307 1.1 mrg ctfc->ctfc_vars->traverse<void *, ctf_dvd_preprocess_cb> (&dvd_arg); 308 1.1 mrg /* Sort the list. */ 309 1.1 mrg qsort (ctfc->ctfc_vars_list, ctfc->ctfc_vars_list_count, 310 1.1 mrg sizeof (ctf_dvdef_ref), ctf_varent_compare); 311 1.1 mrg /* Update the actual number of the generated CTF variables at global 312 1.1 mrg scope. */ 313 1.1 mrg ctfc->ctfc_num_global_objts = dvd_arg.dvd_global_obj_idx; 314 1.1 mrg } 315 1.1 mrg 316 1.1 mrg /* Initialize an array to keep track of the CTF functions types for global 317 1.1 mrg functions in the CTF data section. */ 318 1.1 mrg size_t num_global_funcs = ctfc->ctfc_num_global_funcs; 319 1.1 mrg if (num_global_funcs) 320 1.1 mrg { 321 1.1 mrg ctfc->ctfc_gfuncs_list = ggc_vec_alloc<ctf_dtdef_t*>(num_global_funcs); 322 1.1 mrg gcc_assert (num_ctf_types); 323 1.1 mrg } 324 1.1 mrg 325 1.1 mrg if (num_ctf_types) 326 1.1 mrg { 327 1.1 mrg ctf_dtd_preprocess_arg_t dtd_arg; 328 1.1 mrg dtd_arg.dtd_global_func_idx = 0; 329 1.1 mrg dtd_arg.dtd_arg_ctfc = ctfc; 330 1.1 mrg /* Allocate the CTF types list. Add 1 because type ID 0 is never a valid 331 1.1 mrg CTF type ID. No CTF type record should appear at that offset, this 332 1.1 mrg eases debugging and readability. */ 333 1.1 mrg ctfc->ctfc_types_list = ggc_vec_alloc<ctf_dtdef_ref>(num_ctf_types + 1); 334 1.1 mrg /* Pre-process CTF types. */ 335 1.1 mrg ctfc->ctfc_types->traverse<void *, ctf_dtd_preprocess_cb> (&dtd_arg); 336 1.1 mrg 337 1.1 mrg gcc_assert (dtd_arg.dtd_global_func_idx == num_global_funcs); 338 1.1 mrg } 339 1.1 mrg } 340 1.1 mrg 341 1.1 mrg /* CTF asm helper routines. */ 342 1.1 mrg 343 1.1 mrg /* Asm'out the CTF preamble. */ 344 1.1 mrg 345 1.1 mrg static void 346 1.1 mrg ctf_asm_preamble (ctf_container_ref ctfc) 347 1.1 mrg { 348 1.1 mrg dw2_asm_output_data (2, ctfc->ctfc_magic, 349 1.1 mrg "CTF preamble magic number"); 350 1.1 mrg dw2_asm_output_data (1, ctfc->ctfc_version, "CTF preamble version"); 351 1.1 mrg dw2_asm_output_data (1, ctfc->ctfc_flags, "CTF preamble flags"); 352 1.1 mrg } 353 1.1 mrg 354 1.1 mrg /* Asm'out a CTF type which is represented by ctf_stype_t. */ 355 1.1 mrg 356 1.1 mrg static void 357 1.1 mrg ctf_asm_stype (ctf_dtdef_ref type) 358 1.1 mrg { 359 1.1 mrg dw2_asm_output_data (4, type->dtd_data.ctti_name, "ctt_name"); 360 1.1 mrg dw2_asm_output_data (4, type->dtd_data.ctti_info, "ctt_info"); 361 1.1 mrg /* union. */ 362 1.1 mrg dw2_asm_output_data (4, type->dtd_data.ctti_size, "ctt_size or ctt_type"); 363 1.1 mrg } 364 1.1 mrg 365 1.1 mrg /* Asm'out a CTF type which is represented by ctf_type_t. */ 366 1.1 mrg 367 1.1 mrg static void 368 1.1 mrg ctf_asm_type (ctf_dtdef_ref type) 369 1.1 mrg { 370 1.1 mrg dw2_asm_output_data (4, type->dtd_data.ctti_name, "ctt_name"); 371 1.1 mrg dw2_asm_output_data (4, type->dtd_data.ctti_info, "ctt_info"); 372 1.1 mrg /* union. */ 373 1.1 mrg dw2_asm_output_data (4, type->dtd_data.ctti_size, "ctt_size"); 374 1.1 mrg dw2_asm_output_data (4, type->dtd_data.ctti_lsizehi, "ctt_lsizehi"); 375 1.1 mrg dw2_asm_output_data (4, type->dtd_data.ctti_lsizelo, "ctt_lsizelo"); 376 1.1 mrg } 377 1.1 mrg 378 1.1 mrg /* Asm'out a CTF type of kind CTF_K_SLICE. */ 379 1.1 mrg 380 1.1 mrg static void 381 1.1 mrg ctf_asm_slice (ctf_dtdef_ref type) 382 1.1 mrg { 383 1.1 mrg dw2_asm_output_data (4, type->dtd_u.dtu_slice.cts_type, "cts_type"); 384 1.1 mrg dw2_asm_output_data (2, type->dtd_u.dtu_slice.cts_offset, "cts_offset"); 385 1.1 mrg dw2_asm_output_data (2, type->dtd_u.dtu_slice.cts_bits, "cts_bits"); 386 1.1 mrg } 387 1.1 mrg 388 1.1 mrg /* Asm'out a CTF type of kind CTF_K_ARRAY. */ 389 1.1 mrg 390 1.1 mrg static void 391 1.1 mrg ctf_asm_array (ctf_dtdef_ref dtd) 392 1.1 mrg { 393 1.1 mrg dw2_asm_output_data (4, dtd->dtd_u.dtu_arr.ctr_contents, "cta_contents"); 394 1.1 mrg dw2_asm_output_data (4, dtd->dtd_u.dtu_arr.ctr_index, "cta_index"); 395 1.1 mrg dw2_asm_output_data (4, dtd->dtd_u.dtu_arr.ctr_nelems, "cta_nelems"); 396 1.1 mrg } 397 1.1 mrg 398 1.1 mrg /* Asm'out a CTF variable. */ 399 1.1 mrg 400 1.1 mrg static void 401 1.1 mrg ctf_asm_varent (ctf_dvdef_ref var) 402 1.1 mrg { 403 1.1 mrg /* Output the reference to the name in the string table. */ 404 1.1 mrg dw2_asm_output_data (4, var->dvd_name_offset, "ctv_name"); 405 1.1 mrg /* Output the type index. */ 406 1.1 mrg dw2_asm_output_data (4, var->dvd_type, "ctv_typeidx"); 407 1.1 mrg } 408 1.1 mrg 409 1.1 mrg /* Asm'out a member of CTF struct or union, represented by ctf_lmember_t. */ 410 1.1 mrg 411 1.1 mrg static void 412 1.1 mrg ctf_asm_sou_lmember (ctf_dmdef_t * dmd) 413 1.1 mrg { 414 1.1 mrg dw2_asm_output_data (4, dmd->dmd_name_offset, "ctlm_name"); 415 1.1 mrg dw2_asm_output_data (4, CTF_OFFSET_TO_LMEMHI (dmd->dmd_offset), 416 1.1 mrg "ctlm_offsethi"); 417 1.1 mrg dw2_asm_output_data (4, dmd->dmd_type, "ctlm_type"); 418 1.1 mrg dw2_asm_output_data (4, CTF_OFFSET_TO_LMEMLO (dmd->dmd_offset), 419 1.1 mrg "ctlm_offsetlo"); 420 1.1 mrg } 421 1.1 mrg 422 1.1 mrg /* Asm'out a member of a CTF sruct or union, represented by ctf_member_t. */ 423 1.1 mrg 424 1.1 mrg static void 425 1.1 mrg ctf_asm_sou_member (ctf_dmdef_t * dmd) 426 1.1 mrg { 427 1.1 mrg dw2_asm_output_data (4, dmd->dmd_name_offset, "ctm_name"); 428 1.1 mrg dw2_asm_output_data (4, dmd->dmd_offset, "ctm_offset"); 429 1.1 mrg dw2_asm_output_data (4, dmd->dmd_type, "ctm_type"); 430 1.1 mrg } 431 1.1 mrg 432 1.1 mrg /* Asm'out an enumerator constant. */ 433 1.1 mrg 434 1.1 mrg static void 435 1.1 mrg ctf_asm_enum_const (ctf_dmdef_t * dmd) 436 1.1 mrg { 437 1.1 mrg dw2_asm_output_data (4, dmd->dmd_name_offset, "cte_name"); 438 1.1 mrg dw2_asm_output_data (4, dmd->dmd_value, "cte_value"); 439 1.1 mrg } 440 1.1 mrg 441 1.1 mrg /* Asm'out a function argument. */ 442 1.1 mrg 443 1.1 mrg static void 444 1.1 mrg ctf_asm_func_arg (ctf_func_arg_t * farg) 445 1.1 mrg { 446 1.1 mrg dw2_asm_output_data (4, farg->farg_type, "dtu_argv"); 447 1.1 mrg } 448 1.1 mrg 449 1.1 mrg /* CTF writeout to asm file. */ 450 1.1 mrg 451 1.1 mrg static void 452 1.1 mrg output_ctf_header (ctf_container_ref ctfc) 453 1.1 mrg { 454 1.1 mrg switch_to_section (ctf_info_section); 455 1.1 mrg ASM_OUTPUT_LABEL (asm_out_file, ctf_info_section_label); 456 1.1 mrg 457 1.1 mrg ctf_asm_preamble (ctfc); 458 1.1 mrg 459 1.1 mrg /* For a single compilation unit, the parent container's name and label are 460 1.1 mrg NULL. */ 461 1.1 mrg dw2_asm_output_data (4, 0, "cth_parlabel"); 462 1.1 mrg dw2_asm_output_data (4, 0, "cth_parname"); 463 1.1 mrg dw2_asm_output_data (4, ctfc->ctfc_cuname_offset, "cth_cuname"); 464 1.1 mrg 465 1.1 mrg int typeslen = 0; 466 1.1 mrg /* Initialize the offsets. The offsets are from after the CTF header. */ 467 1.1 mrg uint32_t lbloff = 0; 468 1.1 mrg uint32_t objtoff = 0; 469 1.1 mrg uint32_t funcoff = 0; 470 1.1 mrg uint32_t objtidxoff = 0; 471 1.1 mrg uint32_t funcidxoff = 0; 472 1.1 mrg uint32_t varoff = 0; 473 1.1 mrg uint32_t typeoff = 0; 474 1.1 mrg uint32_t stroff = 0; 475 1.1 mrg 476 1.1 mrg if (!ctfc_is_empty_container (ctfc)) 477 1.1 mrg { 478 1.1 mrg gcc_assert (ctfc_get_num_ctf_types (ctfc) 479 1.1 mrg == (ctfc->ctfc_num_types + ctfc->ctfc_num_stypes)); 480 1.1 mrg 481 1.1 mrg funcoff = objtoff + ctfc->ctfc_num_global_objts * sizeof (uint32_t); 482 1.1 mrg /* Object index appears after function info. */ 483 1.1 mrg objtidxoff = funcoff + ctfc->ctfc_num_global_funcs * sizeof (uint32_t); 484 1.1 mrg /* Funxtion index goes next. */ 485 1.1 mrg funcidxoff = objtidxoff + ctfc->ctfc_num_global_objts * sizeof (uint32_t); 486 1.1 mrg /* Vars appear after function index. */ 487 1.1 mrg varoff = funcidxoff + ctfc->ctfc_num_global_funcs * sizeof (uint32_t); 488 1.1 mrg /* CTF types appear after vars. */ 489 1.1 mrg typeoff = varoff + (ctfc->ctfc_vars_list_count) * sizeof (ctf_varent_t); 490 1.1 mrg /* The total number of bytes for CTF types is the sum of the number of 491 1.1 mrg times struct ctf_type_t, struct ctf_stype_t are written, plus the 492 1.1 mrg amount of variable length data after each one of these. */ 493 1.1 mrg typeslen = ctfc->ctfc_num_types * sizeof (ctf_type_t) 494 1.1 mrg + ctfc->ctfc_num_stypes * (sizeof (ctf_stype_t)) 495 1.1 mrg + ctfc_get_num_vlen_bytes (ctfc); 496 1.1 mrg 497 1.1 mrg /* Strings appear after types. */ 498 1.1 mrg stroff = typeoff + typeslen; 499 1.1 mrg } 500 1.1 mrg 501 1.1 mrg /* Offset of label section. */ 502 1.1 mrg dw2_asm_output_data (4, lbloff, "cth_lbloff"); 503 1.1 mrg /* Offset of object section. */ 504 1.1 mrg dw2_asm_output_data (4, objtoff, "cth_objtoff"); 505 1.1 mrg /* Offset of function section. */ 506 1.1 mrg dw2_asm_output_data (4, funcoff, "cth_funcoff"); 507 1.1 mrg /* Offset of object index section. */ 508 1.1 mrg dw2_asm_output_data (4, objtidxoff, "cth_objtidxoff"); 509 1.1 mrg /* Offset of function index section. */ 510 1.1 mrg dw2_asm_output_data (4, funcidxoff, "cth_funcidxoff"); 511 1.1 mrg 512 1.1 mrg /* Offset of variable section. */ 513 1.1 mrg dw2_asm_output_data (4, varoff, "cth_varoff"); 514 1.1 mrg /* Offset of type section. */ 515 1.1 mrg dw2_asm_output_data (4, typeoff, "cth_typeoff"); 516 1.1 mrg /* Offset of string section. */ 517 1.1 mrg dw2_asm_output_data (4, stroff, "cth_stroff"); 518 1.1 mrg /* Length of string section in bytes. */ 519 1.1 mrg dw2_asm_output_data (4, ctfc->ctfc_strlen, "cth_strlen"); 520 1.1 mrg } 521 1.1 mrg 522 1.1 mrg /* Output the CTF object info section. */ 523 1.1 mrg 524 1.1 mrg static void 525 1.1 mrg output_ctf_obj_info (ctf_container_ref ctfc) 526 1.1 mrg { 527 1.1 mrg uint64_t i; 528 1.1 mrg ctf_dvdef_ref var; 529 1.1 mrg 530 1.1 mrg if (!ctfc->ctfc_num_global_objts) return; 531 1.1 mrg 532 1.1 mrg /* Compiler spits out the objts (at global scope) in the CTF obj info section. 533 1.1 mrg In no specific order. In an object file, the CTF object index section is 534 1.1 mrg used to associate the objts to their corresponding names. */ 535 1.1 mrg for (i = 0; i < ctfc->ctfc_num_global_objts; i++) 536 1.1 mrg { 537 1.1 mrg var = ctfc->ctfc_gobjts_list[i]; 538 1.1 mrg 539 1.1 mrg /* CTF type ID corresponding to the type of the variable. */ 540 1.1 mrg dw2_asm_output_data (4, var->dvd_type, "objtinfo_var_type"); 541 1.1 mrg } 542 1.1 mrg 543 1.1 mrg } 544 1.1 mrg 545 1.1 mrg /* Output the CTF function info section. */ 546 1.1 mrg 547 1.1 mrg static void 548 1.1 mrg output_ctf_func_info (ctf_container_ref ctfc) 549 1.1 mrg { 550 1.1 mrg uint64_t i; 551 1.1 mrg ctf_dtdef_ref ctftype; 552 1.1 mrg 553 1.1 mrg if (!ctfc->ctfc_num_global_funcs) return; 554 1.1 mrg 555 1.1 mrg /* The CTF funcinfo section is simply an array of CTF_K_FUNCTION type IDs in 556 1.1 mrg the type section. In an object file, the CTF function index section is 557 1.1 mrg used to associate functions to their corresponding names. */ 558 1.1 mrg for (i = 0; i < ctfc->ctfc_num_global_funcs; i++) 559 1.1 mrg { 560 1.1 mrg ctftype = ctfc->ctfc_gfuncs_list[i]; 561 1.1 mrg dw2_asm_output_data (4, ctftype->dtd_type, "funcinfo_func_type"); 562 1.1 mrg } 563 1.1 mrg } 564 1.1 mrg 565 1.1 mrg /* Output the CTF object index section. */ 566 1.1 mrg 567 1.1 mrg static void 568 1.1 mrg output_ctf_objtidx (ctf_container_ref ctfc) 569 1.1 mrg { 570 1.1 mrg uint64_t i; 571 1.1 mrg ctf_dvdef_ref var; 572 1.1 mrg 573 1.1 mrg if (!ctfc->ctfc_num_global_objts) return; 574 1.1 mrg 575 1.1 mrg for (i = 0; i < ctfc->ctfc_num_global_objts; i++) 576 1.1 mrg { 577 1.1 mrg var = ctfc->ctfc_gobjts_list[i]; 578 1.1 mrg /* Offset to the name in CTF string table. */ 579 1.1 mrg dw2_asm_output_data (4, var->dvd_name_offset, "objtinfo_name"); 580 1.1 mrg } 581 1.1 mrg } 582 1.1 mrg 583 1.1 mrg /* Output the CTF function index section. */ 584 1.1 mrg 585 1.1 mrg static void 586 1.1 mrg output_ctf_funcidx (ctf_container_ref ctfc) 587 1.1 mrg { 588 1.1 mrg uint64_t i; 589 1.1 mrg ctf_dtdef_ref ctftype; 590 1.1 mrg 591 1.1 mrg if (!ctfc->ctfc_num_global_funcs) return; 592 1.1 mrg 593 1.1 mrg for (i = 0; i < ctfc->ctfc_num_global_funcs; i++) 594 1.1 mrg { 595 1.1 mrg ctftype = ctfc->ctfc_gfuncs_list[i]; 596 1.1 mrg /* Offset to the name in CTF string table. */ 597 1.1 mrg dw2_asm_output_data (4, ctftype->dtd_data.ctti_name, "funcinfo_name"); 598 1.1 mrg } 599 1.1 mrg } 600 1.1 mrg 601 1.1 mrg /* Output the CTF variables. Variables appear in the sorted ASCIIbetical 602 1.1 mrg order of their names. This permits binary searching in the CTF reader. */ 603 1.1 mrg 604 1.1 mrg static void 605 1.1 mrg output_ctf_vars (ctf_container_ref ctfc) 606 1.1 mrg { 607 1.1 mrg size_t i; 608 1.1 mrg unsigned int num_ctf_vars = ctfc->ctfc_vars_list_count; 609 1.1 mrg if (num_ctf_vars) 610 1.1 mrg { 611 1.1 mrg /* Iterate over the list of sorted vars and output the asm. */ 612 1.1 mrg for (i = 0; i < num_ctf_vars; i++) 613 1.1 mrg { 614 1.1 mrg ctf_asm_varent (ctfc->ctfc_vars_list[i]); 615 1.1 mrg /* The type of variable must be a valid one. */ 616 1.1 mrg gcc_assert (ctfc->ctfc_vars_list[i]->dvd_type != CTF_NULL_TYPEID); 617 1.1 mrg } 618 1.1 mrg } 619 1.1 mrg } 620 1.1 mrg 621 1.1 mrg /* Output the CTF string records. */ 622 1.1 mrg 623 1.1 mrg static void 624 1.1 mrg output_ctf_strs (ctf_container_ref ctfc) 625 1.1 mrg { 626 1.1 mrg ctf_string_t * ctf_string = ctfc->ctfc_strtable.ctstab_head; 627 1.1 mrg 628 1.1 mrg while (ctf_string) 629 1.1 mrg { 630 1.1 mrg dw2_asm_output_nstring (ctf_string->cts_str, -1, "ctf_string"); 631 1.1 mrg ctf_string = ctf_string->cts_next; 632 1.1 mrg } 633 1.1 mrg } 634 1.1 mrg 635 1.1 mrg /* Output the members of the CTF struct or union. */ 636 1.1 mrg 637 1.1 mrg static void 638 1.1 mrg output_asm_ctf_sou_fields (ctf_container_ref ARG_UNUSED (ctfc), 639 1.1 mrg ctf_dtdef_ref dtd) 640 1.1 mrg { 641 1.1 mrg ctf_dmdef_t * dmd; 642 1.1 mrg 643 1.1 mrg /* Function pointer to dump struct/union members. */ 644 1.1 mrg void (*ctf_asm_sou_field_func) (ctf_dmdef_t *); 645 1.1 mrg 646 1.1 mrg uint32_t size = dtd->dtd_data.ctti_size; 647 1.1 mrg 648 1.1 mrg /* The variable length data struct/union CTF types is an array of 649 1.1 mrg ctf_member or ctf_lmember, depending on size of the member. */ 650 1.1 mrg if (size >= CTF_LSTRUCT_THRESH) 651 1.1 mrg ctf_asm_sou_field_func = ctf_asm_sou_lmember; 652 1.1 mrg else 653 1.1 mrg ctf_asm_sou_field_func = ctf_asm_sou_member; 654 1.1 mrg 655 1.1 mrg for (dmd = dtd->dtd_u.dtu_members; 656 1.1 mrg dmd != NULL; dmd = (ctf_dmdef_t *) ctf_dmd_list_next (dmd)) 657 1.1 mrg { 658 1.1 mrg ctf_asm_sou_field_func (dmd); 659 1.1 mrg /* Sanity Check - Unrepresented types appear as explicit types. */ 660 1.1 mrg gcc_assert (dmd->dmd_type != CTF_NULL_TYPEID); 661 1.1 mrg } 662 1.1 mrg } 663 1.1 mrg 664 1.1 mrg /* Output the list of enumerator constants of the CTF enum type. */ 665 1.1 mrg 666 1.1 mrg static void 667 1.1 mrg output_asm_ctf_enum_list (ctf_container_ref ARG_UNUSED (ctfc), 668 1.1 mrg ctf_dtdef_ref dtd) 669 1.1 mrg { 670 1.1 mrg ctf_dmdef_t * dmd; 671 1.1 mrg 672 1.1 mrg for (dmd = dtd->dtd_u.dtu_members; 673 1.1 mrg dmd != NULL; dmd = (ctf_dmdef_t *) ctf_dmd_list_next (dmd)) 674 1.1 mrg ctf_asm_enum_const (dmd); 675 1.1 mrg } 676 1.1 mrg 677 1.1 mrg /* Output the list of function arguments of the CTF function type. */ 678 1.1 mrg 679 1.1 mrg static void 680 1.1 mrg output_asm_func_args_list (ctf_container_ref ARG_UNUSED (ctfc), 681 1.1 mrg ctf_dtdef_ref dtd) 682 1.1 mrg { 683 1.1 mrg ctf_func_arg_t * farg; 684 1.1 mrg 685 1.1 mrg for (farg = dtd->dtd_u.dtu_argv; 686 1.1 mrg farg != NULL; farg = (ctf_func_arg_t *) ctf_farg_list_next (farg)) 687 1.1 mrg ctf_asm_func_arg (farg); 688 1.1 mrg } 689 1.1 mrg 690 1.1 mrg /* Output the variable length portion of the CTF type record. */ 691 1.1 mrg 692 1.1 mrg static void 693 1.1 mrg output_asm_ctf_vlen_bytes (ctf_container_ref ctfc, ctf_dtdef_ref ctftype) 694 1.1 mrg { 695 1.1 mrg uint32_t encoding; 696 1.1 mrg uint32_t kind = CTF_V2_INFO_KIND (ctftype->dtd_data.ctti_info); 697 1.1 mrg uint32_t vlen = CTF_V2_INFO_VLEN (ctftype->dtd_data.ctti_info); 698 1.1 mrg 699 1.1 mrg switch (kind) 700 1.1 mrg { 701 1.1 mrg case CTF_K_INTEGER: 702 1.1 mrg case CTF_K_FLOAT: 703 1.1 mrg if (kind == CTF_K_INTEGER) 704 1.1 mrg { 705 1.1 mrg encoding = CTF_INT_DATA (ctftype->dtd_u.dtu_enc.cte_format, 706 1.1 mrg ctftype->dtd_u.dtu_enc.cte_offset, 707 1.1 mrg ctftype->dtd_u.dtu_enc.cte_bits); 708 1.1 mrg } 709 1.1 mrg else 710 1.1 mrg { 711 1.1 mrg encoding = CTF_FP_DATA (ctftype->dtd_u.dtu_enc.cte_format, 712 1.1 mrg ctftype->dtd_u.dtu_enc.cte_offset, 713 1.1 mrg ctftype->dtd_u.dtu_enc.cte_bits); 714 1.1 mrg } 715 1.1 mrg dw2_asm_output_data (4, encoding, "ctf_encoding_data"); 716 1.1 mrg break; 717 1.1 mrg case CTF_K_FUNCTION: 718 1.1 mrg { 719 1.1 mrg output_asm_func_args_list (ctfc, ctftype); 720 1.1 mrg /* FIXME - CTF_PADDING_FOR_ALIGNMENT. 721 1.1 mrg libctf expects this padding for alignment reasons. Expected to 722 1.1 mrg be redundant in CTF_VERSION_4. */ 723 1.1 mrg if (vlen & 1) 724 1.1 mrg dw2_asm_output_data (4, 0, "dtu_argv_padding"); 725 1.1 mrg 726 1.1 mrg break; 727 1.1 mrg } 728 1.1 mrg case CTF_K_ARRAY: 729 1.1 mrg ctf_asm_array (ctftype); 730 1.1 mrg break; 731 1.1 mrg case CTF_K_SLICE: 732 1.1 mrg { 733 1.1 mrg ctf_asm_slice (ctftype); 734 1.1 mrg /* Type of the slice must be a valid CTF type. */ 735 1.1 mrg gcc_assert (ctftype->dtd_u.dtu_slice.cts_type != CTF_NULL_TYPEID); 736 1.1 mrg break; 737 1.1 mrg } 738 1.1 mrg case CTF_K_STRUCT: 739 1.1 mrg case CTF_K_UNION: 740 1.1 mrg output_asm_ctf_sou_fields (ctfc, ctftype); 741 1.1 mrg break; 742 1.1 mrg case CTF_K_ENUM: 743 1.1 mrg output_asm_ctf_enum_list (ctfc, ctftype); 744 1.1 mrg break; 745 1.1 mrg 746 1.1 mrg default: 747 1.1 mrg /* CTF types of kind CTF_K_VOLATILE, CTF_K_CONST, CTF_K_RESTRICT, 748 1.1 mrg etc have no vlen data to write. */ 749 1.1 mrg break; 750 1.1 mrg } 751 1.1 mrg } 752 1.1 mrg 753 1.1 mrg /* Output a CTF Type. */ 754 1.1 mrg 755 1.1 mrg static void 756 1.1 mrg output_asm_ctf_type (ctf_container_ref ctfc, ctf_dtdef_ref type) 757 1.1 mrg { 758 1.1 mrg if (type->dtd_data.ctti_size <= CTF_MAX_SIZE) 759 1.1 mrg ctf_asm_stype (type); 760 1.1 mrg else 761 1.1 mrg ctf_asm_type (type); 762 1.1 mrg /* Now comes the variable-length portion for defining types completely. 763 1.1 mrg E.g., encoding follows CTF_INT_DATA, CTF_FP_DATA types, 764 1.1 mrg struct ctf_array_t follows CTF_K_ARRAY types, or a bunch of 765 1.1 mrg struct ctf_member / ctf_lmember ctf_enum sit in there for CTF_K_STRUCT or 766 1.1 mrg CTF_K_UNION. */ 767 1.1 mrg output_asm_ctf_vlen_bytes (ctfc, type); 768 1.1 mrg 769 1.1 mrg uint32_t kind = CTF_V2_INFO_KIND (type->dtd_data.ctti_info); 770 1.1 mrg /* The underlying type must be a valid CTF type. */ 771 1.1 mrg if (kind == CTF_K_POINTER || kind == CTF_K_TYPEDEF 772 1.1 mrg || kind == CTF_K_VOLATILE || kind == CTF_K_CONST 773 1.1 mrg || kind == CTF_K_RESTRICT) 774 1.1 mrg gcc_assert (type->dtd_data.ctti_type != CTF_NULL_TYPEID); 775 1.1 mrg } 776 1.1 mrg 777 1.1 mrg /* Output all CTF type records. */ 778 1.1 mrg 779 1.1 mrg static void 780 1.1 mrg output_ctf_types (ctf_container_ref ctfc) 781 1.1 mrg { 782 1.1 mrg size_t i; 783 1.1 mrg size_t num_ctf_types = ctfc->ctfc_types->elements (); 784 1.1 mrg if (num_ctf_types) 785 1.1 mrg { 786 1.1 mrg /* Type ID = 0 is used as sentinel value; not a valid type. */ 787 1.1 mrg for (i = 1; i <= num_ctf_types; i++) 788 1.1 mrg output_asm_ctf_type (ctfc, ctfc->ctfc_types_list[i]); 789 1.1 mrg } 790 1.1 mrg } 791 1.1 mrg 792 1.1 mrg /* CTF routines interfacing to the compiler. */ 793 1.1 mrg 794 1.1 mrg /* Prepare and output the CTF section. */ 795 1.1 mrg 796 1.1 mrg void 797 1.1 mrg ctf_output (const char * filename) 798 1.1 mrg { 799 1.1 mrg if (ctf_debug_info_level == CTFINFO_LEVEL_NONE) 800 1.1 mrg return; 801 1.1 mrg 802 1.1 mrg /* Get the CTF container for the current translation unit. */ 803 1.1 mrg ctf_container_ref tu_ctfc = ctf_get_tu_ctfc (); 804 1.1 mrg 805 1.1 mrg init_ctf_sections (); 806 1.1 mrg 807 1.1 mrg ctf_add_cuname (tu_ctfc, filename); 808 1.1 mrg 809 1.1 mrg /* Pre-process CTF before generating assembly. */ 810 1.1 mrg ctf_preprocess (tu_ctfc); 811 1.1 mrg output_ctf_header (tu_ctfc); 812 1.1 mrg output_ctf_obj_info (tu_ctfc); 813 1.1 mrg output_ctf_func_info (tu_ctfc); 814 1.1 mrg output_ctf_objtidx (tu_ctfc); 815 1.1 mrg output_ctf_funcidx (tu_ctfc); 816 1.1 mrg output_ctf_vars (tu_ctfc); 817 1.1 mrg output_ctf_types (tu_ctfc); 818 1.1 mrg output_ctf_strs (tu_ctfc); 819 1.1 mrg 820 1.1 mrg /* The total number of string bytes must be equal to those processed out to 821 1.1 mrg the str subsection. */ 822 1.1 mrg gcc_assert (tu_ctfc->ctfc_strlen 823 1.1 mrg == ctfc_get_strtab_len (tu_ctfc, CTF_STRTAB)); 824 1.1 mrg 825 1.1 mrg } 826 1.1 mrg 827 1.1 mrg /* Reset all state for CTF generation so that we can rerun the compiler within 828 1.1 mrg the same process. */ 829 1.1 mrg 830 1.1 mrg void 831 1.1 mrg ctf_finalize (void) 832 1.1 mrg { 833 1.1 mrg ctf_info_section = NULL; 834 1.1 mrg 835 1.1 mrg ctf_container_ref tu_ctfc = ctf_get_tu_ctfc (); 836 1.1 mrg ctfc_delete_container (tu_ctfc); 837 1.1 mrg tu_ctfc = NULL; 838 1.1 mrg } 839 1.1 mrg 840 1.1 mrg #include "gt-ctfout.h" 841