xref: /netbsd-src/external/gpl3/gcc/dist/gcc/ctfc.cc (revision b1e838363e3c6fc78a55519254d99869742dd33c)
1 /* Generate CTF.
2    Copyright (C) 2019-2022 Free Software Foundation, Inc.
3 
4 This file is part of GCC.
5 
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10 
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19 
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "target.h"
24 #include "toplev.h"
25 #include "ctfc.h"
26 #include "diagnostic-core.h"
27 
28 /* A CTF container object - one per translation unit.  */
29 
30 ctf_container_ref tu_ctfc;
31 
32 ctf_container_ref
ctf_get_tu_ctfc(void)33 ctf_get_tu_ctfc (void)
34 {
35   return tu_ctfc;
36 }
37 
38 /* If the next ctf type id is still set to the init value, no ctf records to
39    report.  */
40 bool
ctfc_is_empty_container(ctf_container_ref ctfc)41 ctfc_is_empty_container (ctf_container_ref ctfc)
42 {
43   return ((ctfc)->ctfc_nextid == CTF_INIT_TYPEID);
44 }
45 
46 /* Get the total number of CTF types in the container.  */
47 
48 unsigned int
ctfc_get_num_ctf_types(ctf_container_ref ctfc)49 ctfc_get_num_ctf_types (ctf_container_ref ctfc)
50 {
51   return ctfc->ctfc_types->elements ();
52 }
53 
54 /* Get the total number of CTF variables in the container.  */
55 
ctfc_get_num_ctf_vars(ctf_container_ref ctfc)56 unsigned int ctfc_get_num_ctf_vars (ctf_container_ref ctfc)
57 {
58   return ctfc->ctfc_vars->elements ();
59 }
60 
61 /* Get reference to the CTF string table or the CTF auxilliary
62    string table.  */
63 
64 ctf_strtable_t *
ctfc_get_strtab(ctf_container_ref ctfc,int aux)65 ctfc_get_strtab (ctf_container_ref ctfc, int aux)
66 {
67   return aux ? &(ctfc)->ctfc_aux_strtable : &(ctfc->ctfc_strtable);
68 }
69 
70 /* Get the length of the specified string table of the CTF container.  */
71 
72 size_t
ctfc_get_strtab_len(ctf_container_ref ctfc,int aux)73 ctfc_get_strtab_len (ctf_container_ref ctfc, int aux)
74 {
75   ctf_strtable_t * strtab = ctfc_get_strtab (ctfc, aux);
76   return strtab->ctstab_len;
77 }
78 
79 /* Get the number of bytes to represent the variable length portion of all CTF
80    types in the CTF container.  */
81 
ctfc_get_num_vlen_bytes(ctf_container_ref ctfc)82 size_t ctfc_get_num_vlen_bytes (ctf_container_ref ctfc)
83 {
84   return ctfc->ctfc_num_vlen_bytes;
85 }
86 
87 /* Return which member of the union is used in CTFTYPE.  Used for garbage
88    collection.  */
89 
90 enum ctf_dtu_d_union_enum
ctf_dtu_d_union_selector(ctf_dtdef_ref ctftype)91 ctf_dtu_d_union_selector (ctf_dtdef_ref ctftype)
92 {
93   uint32_t kind = CTF_V2_INFO_KIND (ctftype->dtd_data.ctti_info);
94   switch (kind)
95     {
96     case CTF_K_UNKNOWN:
97     case CTF_K_INTEGER:
98     case CTF_K_FLOAT:
99       return CTF_DTU_D_ENCODING;
100     case CTF_K_STRUCT:
101     case CTF_K_UNION:
102     case CTF_K_ENUM:
103       return CTF_DTU_D_MEMBERS;
104     case CTF_K_ARRAY:
105       return CTF_DTU_D_ARRAY;
106     case CTF_K_FUNCTION:
107       return CTF_DTU_D_ARGUMENTS;
108     case CTF_K_SLICE:
109       return CTF_DTU_D_SLICE;
110     default:
111       /* The largest member as default.  */
112       return CTF_DTU_D_ARRAY;
113     }
114 }
115 
116 /* Insert CTF type into the CTF container.  */
117 
118 static void
ctf_dtd_insert(ctf_container_ref ctfc,ctf_dtdef_ref dtd)119 ctf_dtd_insert (ctf_container_ref ctfc, ctf_dtdef_ref dtd)
120 {
121   bool existed = false;
122   ctf_dtdef_ref entry = dtd;
123 
124   ctf_dtdef_ref * item = ctfc->ctfc_types->find_slot (entry, INSERT);
125   if (*item == NULL)
126      *item = dtd;
127   else
128     existed = true;
129   /* Duplicate CTF type records not expected to be inserted.  */
130   gcc_assert (!existed);
131 }
132 
133 /* Lookup CTF type given a DWARF die for the type.  */
134 
135 ctf_dtdef_ref
ctf_dtd_lookup(const ctf_container_ref ctfc,const dw_die_ref type)136 ctf_dtd_lookup (const ctf_container_ref ctfc, const dw_die_ref type)
137 {
138   ctf_dtdef_t entry;
139   entry.dtd_key = type;
140 
141   ctf_dtdef_ref * slot = ctfc->ctfc_types->find_slot (&entry, NO_INSERT);
142 
143   if (slot)
144     return (ctf_dtdef_ref)*slot;
145 
146   return NULL;
147 }
148 
149 /* Insert CTF variable into the CTF container.  */
150 
151 static void
ctf_dvd_insert(ctf_container_ref ctfc,ctf_dvdef_ref dvd)152 ctf_dvd_insert (ctf_container_ref ctfc, ctf_dvdef_ref dvd)
153 {
154   bool existed = false;
155   ctf_dvdef_ref entry = dvd;
156 
157   ctf_dvdef_ref * item = ctfc->ctfc_vars->find_slot (entry, INSERT);
158   if (*item == NULL)
159      *item = dvd;
160   else
161     existed = true;
162   /* Duplicate variable records not expected to be inserted.  */
163   gcc_assert (!existed);
164 }
165 
166 /* Lookup CTF variable given a DWARF die for the decl.  */
167 
168 ctf_dvdef_ref
ctf_dvd_lookup(const ctf_container_ref ctfc,dw_die_ref die)169 ctf_dvd_lookup (const ctf_container_ref ctfc, dw_die_ref die)
170 {
171   ctf_dvdef_t entry;
172   entry.dvd_key = die;
173 
174   ctf_dvdef_ref * slot = ctfc->ctfc_vars->find_slot (&entry, NO_INSERT);
175 
176   if (slot)
177     return (ctf_dvdef_ref)*slot;
178 
179   return NULL;
180 }
181 
182 /* Insert a dummy CTF variable into the list of variables to be ignored.  */
183 
184 static void
ctf_dvd_ignore_insert(ctf_container_ref ctfc,ctf_dvdef_ref dvd)185 ctf_dvd_ignore_insert (ctf_container_ref ctfc, ctf_dvdef_ref dvd)
186 {
187   bool existed = false;
188   ctf_dvdef_ref entry = dvd;
189 
190   ctf_dvdef_ref * item = ctfc->ctfc_ignore_vars->find_slot (entry, INSERT);
191   if (*item == NULL)
192      *item = dvd;
193   else
194     existed = true;
195   /* Duplicate variable records not expected to be inserted.  */
196   gcc_assert (!existed);
197 }
198 
199 /* Lookup the dummy CTF variable given the DWARF die for the non-defining
200    decl to be ignored.  */
201 
202 bool
ctf_dvd_ignore_lookup(const ctf_container_ref ctfc,dw_die_ref die)203 ctf_dvd_ignore_lookup (const ctf_container_ref ctfc, dw_die_ref die)
204 {
205   ctf_dvdef_t entry;
206   entry.dvd_key = die;
207 
208   ctf_dvdef_ref * slot = ctfc->ctfc_ignore_vars->find_slot (&entry, NO_INSERT);
209 
210   if (slot)
211     return true;
212 
213   return false;
214 }
215 
216 /* Append member definition to the list.  Member list is a singly-linked list
217    with list start pointing to the head.  */
218 
219 static void
ctf_dmd_list_append(ctf_dmdef_t ** dmd,ctf_dmdef_t * elem)220 ctf_dmd_list_append (ctf_dmdef_t ** dmd, ctf_dmdef_t * elem)
221 {
222   ctf_dmdef_t * tail = (dmd && *dmd) ? *dmd : NULL;
223   if (tail)
224     {
225       while (tail->dmd_next)
226 	tail = tail->dmd_next;
227 
228       tail->dmd_next = elem;
229     }
230   else
231     *dmd = elem;
232 
233   elem->dmd_next = NULL;
234 }
235 
236 /* Append function argument to the list.  Member list is a singly-linked list
237    with list start pointing to the head.  */
238 
239 static void
ctf_farg_list_append(ctf_func_arg_t ** farg,ctf_func_arg_t * elem)240 ctf_farg_list_append (ctf_func_arg_t ** farg, ctf_func_arg_t * elem)
241 {
242   ctf_func_arg_t * tail = (farg && *farg) ? *farg : NULL;
243   if (tail)
244     {
245       while (tail->farg_next)
246 	tail = tail->farg_next;
247 
248       tail->farg_next = elem;
249     }
250   else
251     *farg = elem;
252 
253   elem->farg_next = NULL;
254 }
255 
256 /* Append str to the CTF string table.  */
257 
258 static void
ctfc_strtable_append_str(ctf_strtable_t * str_table,const char * str)259 ctfc_strtable_append_str (ctf_strtable_t * str_table, const char * str)
260 {
261   ctf_string_t * ctf_string = ggc_cleared_alloc<ctf_string_t> ();
262   /* Keep a reference to the input STR.  */
263   ctf_string->cts_str = str;
264   ctf_string->cts_next = NULL;
265 
266   if (!str_table->ctstab_head)
267     str_table->ctstab_head = ctf_string;
268 
269   /* Append to the end of the list.  */
270   if (str_table->ctstab_tail)
271     str_table->ctstab_tail->cts_next = ctf_string;
272 
273   str_table->ctstab_tail = ctf_string;
274 }
275 
276 /* Wrapper function to add str to the CTF string table.  No de-duplication of
277    CTF strings is done by the compiler.  */
278 
279 static const char *
ctfc_strtable_add_str(ctf_strtable_t * str_table,const char * name,uint32_t * name_offset)280 ctfc_strtable_add_str (ctf_strtable_t * str_table, const char * name,
281 		      uint32_t * name_offset)
282 {
283   size_t len;
284   char * ctf_string;
285   /* Return value is the offset to the string in the string table.  */
286   uint32_t str_offset = str_table->ctstab_len;
287 
288   /* Add empty string only once at the beginning of the string table.  Also, do
289      not add null strings, return the offset to the empty string for them.  */
290   if ((!name || (name != NULL && !strcmp (name, ""))) && str_offset)
291     {
292       ctf_string = CONST_CAST (char *, str_table->ctstab_estr);
293       str_offset = 0;
294     }
295   else
296     {
297       gcc_assert (name);
298       /* Add null-terminated strings to the string table.  */
299       len = strlen (name) + 1;
300       ctf_string = CONST_CAST (char *, ggc_strdup (name));
301 
302       ctfc_strtable_append_str (str_table, ctf_string);
303       /* Add string to the string table.  Keep number of strings updated.  */
304       str_table->ctstab_num++;
305       /* Keep the number of bytes contained in the string table updated.  */
306       str_table->ctstab_len += len;
307     }
308 
309   *name_offset = str_offset;
310 
311   return (const char *) ctf_string;
312 
313 }
314 
315 /* Add string to the appropriate string table in the CTF container.  */
316 
317 const char *
ctf_add_string(ctf_container_ref ctfc,const char * name,uint32_t * name_offset,int aux_str=CTF_STRTAB)318 ctf_add_string (ctf_container_ref ctfc, const char * name,
319 		uint32_t * name_offset, int aux_str = CTF_STRTAB)
320 {
321   /* Get the CTF string table or the CTF auxilliary string table,
322      as applicable.  */
323   ctf_strtable_t *str_table = ctfc_get_strtab (ctfc, aux_str);
324   return ctfc_strtable_add_str (str_table, name, name_offset);
325 }
326 
327 /* Add the compilation unit (CU) name string to the the CTF string table.  The
328    CU name has a prepended pwd string if it is a relative path.  Also set the
329    CU name offset in the CTF container.  */
330 
331 void
ctf_add_cuname(ctf_container_ref ctfc,const char * filename)332 ctf_add_cuname (ctf_container_ref ctfc, const char * filename)
333 {
334   char * cuname = NULL;
335 
336   /* (filename at this point of compilation cannot be null).  */
337 
338   if (!IS_DIR_SEPARATOR (filename[0]))
339     {
340       /* Filename is a relative path.  */
341       const char * cu_pwd = get_src_pwd ();
342       const int cu_pwd_len = strlen (cu_pwd);
343 
344       /* Add a DIR_SEPARATOR char before the filename.  */
345       const int len = cu_pwd_len + 2 + strlen (filename);
346 
347       cuname = (char *) ggc_alloc_atomic (len);
348       memset (cuname, 0, len);
349 
350       strcpy (cuname, cu_pwd);
351       cuname[cu_pwd_len] = DIR_SEPARATOR;
352       cuname[cu_pwd_len+1] = 0;
353       strcat (cuname, filename);
354     }
355   else
356     /* Filename is an absolute path.  */
357     cuname = CONST_CAST (char *, ggc_strdup (filename));
358 
359   ctf_add_string (ctfc, cuname, &(ctfc->ctfc_cuname_offset));
360   /* Add 1 as CTF strings in the CTF string table are null-terminated
361      strings.  */
362   ctfc->ctfc_strlen += strlen (cuname) + 1;
363 
364   /* Mark cuname for garbage collection.  */
365   cuname = NULL;
366 }
367 
368 /* Functions to create CTF types.
369 
370    These functions perform the task of adding CTF types to the CTF container.
371    No de-duplication is done by them; the onus is on the calling function to do
372    so.  The caller must first do a lookup via ctf_dtd_lookup or
373    ctf_dvd_lookup, as applicable, to ascertain that the CTF type or the CTF
374    variable respectively does not already exist, and then add it.  */
375 
376 static ctf_id_t
ctf_add_generic(ctf_container_ref ctfc,uint32_t flag,const char * name,ctf_dtdef_ref * rp,dw_die_ref die)377 ctf_add_generic (ctf_container_ref ctfc, uint32_t flag, const char * name,
378 		 ctf_dtdef_ref * rp, dw_die_ref die)
379 {
380   ctf_dtdef_ref dtd;
381   ctf_id_t type;
382 
383   gcc_assert (flag == CTF_ADD_NONROOT || flag == CTF_ADD_ROOT);
384 
385   dtd = ggc_cleared_alloc<ctf_dtdef_t> ();
386 
387   type = ctfc->ctfc_nextid++;
388   gcc_assert (type < CTF_MAX_TYPE); /* CTF type ID overflow.  */
389 
390   /* Buffer the strings in the CTF string table.  */
391   dtd->dtd_name = ctf_add_string (ctfc, name, &(dtd->dtd_data.ctti_name));
392   dtd->dtd_type = type;
393   dtd->dtd_key = die;
394 
395   if ((name != NULL) && strcmp (name, ""))
396     ctfc->ctfc_strlen += strlen (name) + 1;
397 
398   ctf_dtd_insert (ctfc, dtd);
399 
400   *rp = dtd;
401   return type;
402 }
403 
404 static ctf_id_t
ctf_add_encoded(ctf_container_ref ctfc,uint32_t flag,const char * name,const ctf_encoding_t * ep,uint32_t kind,dw_die_ref die)405 ctf_add_encoded (ctf_container_ref ctfc, uint32_t flag, const char * name,
406 		 const ctf_encoding_t * ep, uint32_t kind, dw_die_ref die)
407 {
408   ctf_dtdef_ref dtd;
409   ctf_id_t type;
410 
411   type = ctf_add_generic (ctfc, flag, name, &dtd, die);
412 
413   dtd->dtd_data.ctti_info = CTF_TYPE_INFO (kind, flag, 0);
414 
415   uint32_t roundup_nbytes = (ROUND_UP (ep->cte_bits, BITS_PER_UNIT)
416 				    / BITS_PER_UNIT);
417 
418   /* FIXME, stay close to what libctf does.  But by getting next power of two,
419      aren't we conveying less precise information.  E.g. floating point mode
420      XF has a size of 12 bytes.  */
421   dtd->dtd_data.ctti_size = roundup_nbytes ? (1 << ceil_log2 (roundup_nbytes))
422 			   : roundup_nbytes;
423   dtd->dtd_u.dtu_enc = *ep;
424 
425   ctfc->ctfc_num_stypes++;
426 
427   return type;
428 }
429 
430 ctf_id_t
ctf_add_reftype(ctf_container_ref ctfc,uint32_t flag,ctf_id_t ref,uint32_t kind,dw_die_ref die)431 ctf_add_reftype (ctf_container_ref ctfc, uint32_t flag, ctf_id_t ref,
432 		 uint32_t kind, dw_die_ref die)
433 {
434   ctf_dtdef_ref dtd;
435   ctf_id_t type;
436 
437   gcc_assert (ref <= CTF_MAX_TYPE);
438 
439   type = ctf_add_generic (ctfc, flag, NULL, &dtd, die);
440   dtd->dtd_data.ctti_info = CTF_TYPE_INFO (kind, flag, 0);
441   /* Caller of this API must guarantee that a CTF type with id = ref already
442      exists.  This will also be validated for us at link-time.  */
443   dtd->dtd_data.ctti_type = (uint32_t) ref;
444 
445   ctfc->ctfc_num_stypes++;
446 
447   return type;
448 }
449 
450 ctf_id_t
ctf_add_forward(ctf_container_ref ctfc,uint32_t flag,const char * name,uint32_t kind,dw_die_ref die)451 ctf_add_forward (ctf_container_ref ctfc, uint32_t flag, const char * name,
452 		 uint32_t kind, dw_die_ref die)
453 {
454   ctf_dtdef_ref dtd;
455   ctf_id_t type = 0;
456 
457   type = ctf_add_generic (ctfc, flag, name, &dtd, die);
458 
459   dtd->dtd_data.ctti_info = CTF_TYPE_INFO (CTF_K_FORWARD, flag, 0);
460   dtd->dtd_data.ctti_type = kind;
461 
462   ctfc->ctfc_num_stypes++;
463 
464   return type;
465 }
466 
467 ctf_id_t
ctf_add_typedef(ctf_container_ref ctfc,uint32_t flag,const char * name,ctf_id_t ref,dw_die_ref die)468 ctf_add_typedef (ctf_container_ref ctfc, uint32_t flag, const char * name,
469 		 ctf_id_t ref, dw_die_ref die)
470 {
471   ctf_dtdef_ref dtd;
472   ctf_id_t type;
473 
474   gcc_assert (ref <= CTF_MAX_TYPE);
475   /* Nameless Typedefs are not expected.  */
476   gcc_assert ((name != NULL) && strcmp (name, ""));
477 
478   type = ctf_add_generic (ctfc, flag, name, &dtd, die);
479   dtd->dtd_data.ctti_info = CTF_TYPE_INFO (CTF_K_TYPEDEF, flag, 0);
480   /* Caller of this API must guarantee that a CTF type with id = ref already
481      exists.  This will also be validated for us at link-time.  */
482   dtd->dtd_data.ctti_type = (uint32_t) ref;
483 
484   gcc_assert (dtd->dtd_type != dtd->dtd_data.ctti_type);
485 
486   ctfc->ctfc_num_stypes++;
487 
488   return type;
489 }
490 
491 ctf_id_t
ctf_add_slice(ctf_container_ref ctfc,uint32_t flag,ctf_id_t ref,uint32_t bit_offset,uint32_t bit_size,dw_die_ref die)492 ctf_add_slice (ctf_container_ref ctfc, uint32_t flag, ctf_id_t ref,
493 	       uint32_t bit_offset, uint32_t bit_size, dw_die_ref die)
494 {
495   ctf_dtdef_ref dtd;
496   ctf_id_t type;
497   uint32_t roundup_nbytes;
498 
499   gcc_assert ((bit_size <= 255) && (bit_offset <= 255));
500 
501   gcc_assert (ref <= CTF_MAX_TYPE);
502 
503   type = ctf_add_generic (ctfc, flag, NULL, &dtd, die);
504 
505   dtd->dtd_data.ctti_info = CTF_TYPE_INFO (CTF_K_SLICE, flag, 0);
506 
507   roundup_nbytes = (ROUND_UP (bit_size, BITS_PER_UNIT) / BITS_PER_UNIT);
508   /* FIXME, stay close to what libctf does.  But by getting next power of two,
509      aren't we conveying less precise information, especially for bitfields.
510      For example, cte_bits = 33, roundup_nbytes = 5, ctti_size = 8 in the
511      implementation below.  */
512   dtd->dtd_data.ctti_size = roundup_nbytes ? (1 << ceil_log2 (roundup_nbytes))
513 					   : 0;
514 
515   /* Caller of this API must guarantee that a CTF type with id = ref already
516      exists.  This will also be validated for us at link-time.  */
517   dtd->dtd_u.dtu_slice.cts_type = (uint32_t) ref;
518   dtd->dtd_u.dtu_slice.cts_bits = bit_size;
519   dtd->dtd_u.dtu_slice.cts_offset = bit_offset;
520 
521   ctfc->ctfc_num_stypes++;
522 
523   return type;
524 }
525 
526 ctf_id_t
ctf_add_float(ctf_container_ref ctfc,uint32_t flag,const char * name,const ctf_encoding_t * ep,dw_die_ref die)527 ctf_add_float (ctf_container_ref ctfc, uint32_t flag,
528 	       const char * name, const ctf_encoding_t * ep, dw_die_ref die)
529 {
530   return (ctf_add_encoded (ctfc, flag, name, ep, CTF_K_FLOAT, die));
531 }
532 
533 ctf_id_t
ctf_add_integer(ctf_container_ref ctfc,uint32_t flag,const char * name,const ctf_encoding_t * ep,dw_die_ref die)534 ctf_add_integer (ctf_container_ref ctfc, uint32_t flag,
535 		 const char * name, const ctf_encoding_t * ep, dw_die_ref die)
536 {
537   return (ctf_add_encoded (ctfc, flag, name, ep, CTF_K_INTEGER, die));
538 }
539 
540 ctf_id_t
ctf_add_unknown(ctf_container_ref ctfc,uint32_t flag,const char * name,const ctf_encoding_t * ep,dw_die_ref die)541 ctf_add_unknown (ctf_container_ref ctfc, uint32_t flag,
542 		 const char * name, const ctf_encoding_t * ep, dw_die_ref die)
543 {
544   return (ctf_add_encoded (ctfc, flag, name, ep, CTF_K_UNKNOWN, die));
545 }
546 
547 ctf_id_t
ctf_add_pointer(ctf_container_ref ctfc,uint32_t flag,ctf_id_t ref,dw_die_ref die)548 ctf_add_pointer (ctf_container_ref ctfc, uint32_t flag, ctf_id_t ref,
549 		 dw_die_ref die)
550 {
551   return (ctf_add_reftype (ctfc, flag, ref, CTF_K_POINTER, die));
552 }
553 
554 ctf_id_t
ctf_add_array(ctf_container_ref ctfc,uint32_t flag,const ctf_arinfo_t * arp,dw_die_ref die)555 ctf_add_array (ctf_container_ref ctfc, uint32_t flag, const ctf_arinfo_t * arp,
556 	       dw_die_ref die)
557 {
558   ctf_dtdef_ref dtd;
559   ctf_id_t type;
560 
561   gcc_assert (arp);
562 
563   /* Caller of this API must make sure CTF type for arp->ctr_contents and
564      arp->ctr_index are already added.  This will also be validated for us at
565      link-time.  */
566 
567   type = ctf_add_generic (ctfc, flag, NULL, &dtd, die);
568 
569   dtd->dtd_data.ctti_info = CTF_TYPE_INFO (CTF_K_ARRAY, flag, 0);
570   dtd->dtd_data.ctti_size = 0;
571   dtd->dtd_u.dtu_arr = *arp;
572 
573   ctfc->ctfc_num_stypes++;
574 
575   return type;
576 }
577 
578 ctf_id_t
ctf_add_enum(ctf_container_ref ctfc,uint32_t flag,const char * name,HOST_WIDE_INT size,dw_die_ref die)579 ctf_add_enum (ctf_container_ref ctfc, uint32_t flag, const char * name,
580 	      HOST_WIDE_INT size, dw_die_ref die)
581 {
582   ctf_dtdef_ref dtd;
583   ctf_id_t type;
584 
585   /* In the compiler, no need to handle the case of promoting forwards to
586      enums.  This comment is simply to note a divergence from libctf.  */
587 
588   /* The compiler does, however, update any previously existing forward types
589      to non-root.  CTF does not allow existence of two root types with the same
590      name.  */
591   ctf_dtdef_ref enum_fwd_type = ctf_dtd_lookup (ctfc, die);
592   if (enum_fwd_type)
593     {
594       enum_fwd_type->dtd_data.ctti_info
595 	= CTF_TYPE_INFO (CTF_K_FORWARD, CTF_ADD_NONROOT, 0);
596     }
597 
598   type = ctf_add_generic (ctfc, flag, name, &dtd, die);
599 
600   dtd->dtd_data.ctti_info = CTF_TYPE_INFO (CTF_K_ENUM, flag, 0);
601 
602   /* Size in bytes should always fit, of course.
603      TBD WARN - warn instead?  */
604   gcc_assert (size <= CTF_MAX_SIZE);
605 
606   dtd->dtd_data.ctti_size = size;
607 
608   ctfc->ctfc_num_stypes++;
609 
610   return type;
611 }
612 
613 int
ctf_add_enumerator(ctf_container_ref ctfc,ctf_id_t enid,const char * name,HOST_WIDE_INT value,dw_die_ref die)614 ctf_add_enumerator (ctf_container_ref ctfc, ctf_id_t enid, const char * name,
615 		    HOST_WIDE_INT value, dw_die_ref die)
616 {
617   ctf_dmdef_t * dmd;
618   uint32_t kind, vlen, root;
619 
620   /* Callers of this API must make sure that CTF_K_ENUM with enid has been
621      addded.  This will also be validated for us at link-time.  */
622   ctf_dtdef_ref dtd = ctf_dtd_lookup (ctfc, die);
623   gcc_assert (dtd);
624   gcc_assert (dtd->dtd_type == enid);
625   gcc_assert (name);
626 
627   kind = CTF_V2_INFO_KIND (dtd->dtd_data.ctti_info);
628   root = CTF_V2_INFO_ISROOT (dtd->dtd_data.ctti_info);
629   vlen = CTF_V2_INFO_VLEN (dtd->dtd_data.ctti_info);
630 
631   gcc_assert (kind == CTF_K_ENUM && vlen < CTF_MAX_VLEN);
632 
633   /* Enum value is of type HOST_WIDE_INT in the compiler, dmd_value is int32_t
634      on the other hand.  Check bounds and skip adding this enum value if out of
635      bounds.  */
636   if ((value > INT_MAX) || (value < INT_MIN))
637     {
638       /* FIXME - Note this TBD_CTF_REPRESENTATION_LIMIT.  */
639       return (1);
640     }
641 
642   dmd = ggc_cleared_alloc<ctf_dmdef_t> ();
643 
644   /* Buffer the strings in the CTF string table.  */
645   dmd->dmd_name = ctf_add_string (ctfc, name, &(dmd->dmd_name_offset));
646   dmd->dmd_type = CTF_NULL_TYPEID;
647   dmd->dmd_offset = 0;
648 
649   dmd->dmd_value = value;
650 
651   dtd->dtd_data.ctti_info = CTF_TYPE_INFO (kind, root, vlen + 1);
652   ctf_dmd_list_append (&dtd->dtd_u.dtu_members, dmd);
653 
654   if ((name != NULL) && strcmp (name, ""))
655     ctfc->ctfc_strlen += strlen (name) + 1;
656 
657   return (0);
658 }
659 
660 int
ctf_add_member_offset(ctf_container_ref ctfc,dw_die_ref sou,const char * name,ctf_id_t type,uint64_t bit_offset)661 ctf_add_member_offset (ctf_container_ref ctfc, dw_die_ref sou,
662 		       const char * name, ctf_id_t type,
663 		       uint64_t bit_offset)
664 {
665   ctf_dtdef_ref dtd = ctf_dtd_lookup (ctfc, sou);
666   ctf_dmdef_t * dmd;
667 
668   uint32_t kind, vlen, root;
669 
670   /* The type of the member being added must already exist.  */
671   gcc_assert (dtd);
672 
673   kind = CTF_V2_INFO_KIND (dtd->dtd_data.ctti_info);
674   root = CTF_V2_INFO_ISROOT (dtd->dtd_data.ctti_info);
675   vlen = CTF_V2_INFO_VLEN (dtd->dtd_data.ctti_info);
676 
677   gcc_assert (kind == CTF_K_STRUCT || kind == CTF_K_UNION);
678   gcc_assert (vlen < CTF_MAX_VLEN);
679 
680   dmd = ggc_cleared_alloc<ctf_dmdef_t> ();
681 
682   /* Buffer the strings in the CTF string table.  */
683   dmd->dmd_name = ctf_add_string (ctfc, name, &(dmd->dmd_name_offset));
684   dmd->dmd_type = type;
685   dmd->dmd_value = -1;
686 
687   if (kind == CTF_K_STRUCT && vlen != 0)
688     dmd->dmd_offset = bit_offset;
689   else
690     dmd->dmd_offset = 0;
691 
692   dtd->dtd_data.ctti_info = CTF_TYPE_INFO (kind, root, vlen + 1);
693   ctf_dmd_list_append (&dtd->dtd_u.dtu_members, dmd);
694 
695   if ((name != NULL) && strcmp (name, ""))
696     ctfc->ctfc_strlen += strlen (name) + 1;
697 
698   return 0;
699 }
700 
701 int
ctf_add_variable(ctf_container_ref ctfc,const char * name,ctf_id_t ref,dw_die_ref die,unsigned int external_vis,dw_die_ref die_var_decl)702 ctf_add_variable (ctf_container_ref ctfc, const char * name, ctf_id_t ref,
703 		  dw_die_ref die, unsigned int external_vis,
704 		  dw_die_ref die_var_decl)
705 {
706   ctf_dvdef_ref dvd, dvd_ignore;
707 
708   gcc_assert (name);
709 
710   if (name != NULL)
711     {
712       dvd = ggc_cleared_alloc<ctf_dvdef_t> ();
713       dvd->dvd_key = die;
714       /* Buffer the strings in the CTF string table.  */
715       dvd->dvd_name = ctf_add_string (ctfc, name, &(dvd->dvd_name_offset));
716       dvd->dvd_visibility = external_vis;
717       dvd->dvd_type = ref;
718 
719       /* If DW_AT_specification attribute exists, keep track of it as this is
720 	 the non-defining declaration corresponding to the variable.  We will
721 	 skip emitting CTF variable for such incomplete, non-defining
722 	 declarations.
723 	 There could be some non-defining declarations, however, for which a
724 	 defining declaration does not show up in the same CU.  For such
725 	 cases, the compiler continues to emit CTF variable record as
726 	 usual.  */
727       if (die_var_decl)
728 	{
729 	  dvd_ignore = ggc_cleared_alloc<ctf_dvdef_t> ();
730 	  dvd_ignore->dvd_key = die_var_decl;
731 	  /* It's alright to leave other fields as zero.  No valid CTF
732 	     variable will be added for these DW_TAG_variable DIEs.  */
733 	  ctf_dvd_ignore_insert (ctfc, dvd_ignore);
734 	}
735 
736       ctf_dvd_insert (ctfc, dvd);
737 
738       if (strcmp (name, ""))
739 	ctfc->ctfc_strlen += strlen (name) + 1;
740     }
741 
742   return 0;
743 }
744 
745 int
ctf_add_function_arg(ctf_container_ref ctfc,dw_die_ref func,const char * name,ctf_id_t type)746 ctf_add_function_arg (ctf_container_ref ctfc, dw_die_ref func,
747 		      const char * name, ctf_id_t type)
748 {
749   ctf_dtdef_ref dtd = ctf_dtd_lookup (ctfc, func);
750   ctf_func_arg_t * farg;
751   uint32_t vlen;
752 
753   /* The function to which argument is being added must already exist.  */
754   gcc_assert (dtd);
755   /* The number of args must have been non-zero.  */
756   vlen = CTF_V2_INFO_VLEN (dtd->dtd_data.ctti_info);
757   gcc_assert (vlen);
758 
759   farg = ggc_cleared_alloc<ctf_func_arg_t> ();
760 
761   /* Buffer the strings in the auxilliary string table.  CTF V3 format does not
762      require function argument names.  Use auxilliary string table to keep
763      these strings to avoid unnecessary bloat in CTF section in CTF V3.  */
764   farg->farg_name = ctf_add_string (ctfc, name, &(farg->farg_name_offset),
765 				    CTF_AUX_STRTAB);
766   farg->farg_type = type;
767 
768   ctf_farg_list_append (&dtd->dtd_u.dtu_argv, farg);
769 
770   /* For aux_str, keep ctfc_aux_strlen updated for debugging.  */
771   if ((name != NULL) && strcmp (name, ""))
772     ctfc->ctfc_aux_strlen += strlen (name) + 1;
773 
774   return 0;
775 }
776 
777 ctf_id_t
ctf_add_function(ctf_container_ref ctfc,uint32_t flag,const char * name,const ctf_funcinfo_t * ctc,dw_die_ref die,bool from_global_func)778 ctf_add_function (ctf_container_ref ctfc, uint32_t flag, const char * name,
779 		  const ctf_funcinfo_t * ctc, dw_die_ref die,
780 		  bool from_global_func)
781 {
782   ctf_dtdef_ref dtd;
783   ctf_id_t type;
784   uint32_t vlen;
785 
786   gcc_assert (ctc);
787 
788   vlen = ctc->ctc_argc;
789   gcc_assert (vlen <= CTF_MAX_VLEN);
790 
791   type = ctf_add_generic (ctfc, flag, name, &dtd, die);
792 
793   dtd->from_global_func = from_global_func;
794   dtd->dtd_data.ctti_info = CTF_TYPE_INFO (CTF_K_FUNCTION, flag, vlen);
795   /* Caller must make sure CTF types for ctc->ctc_return are already added.  */
796   dtd->dtd_data.ctti_type = (uint32_t) ctc->ctc_return;
797   /* Caller must make sure CTF types for function arguments are already added
798      via ctf_add_function_arg () API.  */
799 
800   ctfc->ctfc_num_stypes++;
801 
802   return type;
803 }
804 
805 ctf_id_t
ctf_add_sou(ctf_container_ref ctfc,uint32_t flag,const char * name,uint32_t kind,size_t size,dw_die_ref die)806 ctf_add_sou (ctf_container_ref ctfc, uint32_t flag, const char * name,
807 	     uint32_t kind, size_t size, dw_die_ref die)
808 {
809   ctf_dtdef_ref dtd;
810   ctf_id_t type = 0;
811 
812   gcc_assert ((kind == CTF_K_STRUCT) || (kind == CTF_K_UNION));
813 
814   /* In the compiler, no need to handle the case of promoting forwards to
815      structs.  This comment is simply to note a divergence from libctf.  */
816 
817   /* The compiler does, however, update any previously existing forward types
818      to non-root.  CTF does not allow existence of two root types with the same
819      name.  */
820   ctf_dtdef_ref sou_fwd_type = ctf_dtd_lookup (ctfc, die);
821   if (sou_fwd_type)
822     {
823       sou_fwd_type->dtd_data.ctti_info
824 	= CTF_TYPE_INFO (CTF_K_FORWARD, CTF_ADD_NONROOT, 0);
825     }
826 
827   type = ctf_add_generic (ctfc, flag, name, &dtd, die);
828 
829   dtd->dtd_data.ctti_info = CTF_TYPE_INFO (kind, flag, 0);
830 
831   if (size > CTF_MAX_SIZE)
832     {
833       dtd->dtd_data.ctti_size = CTF_LSIZE_SENT;
834       dtd->dtd_data.ctti_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
835       dtd->dtd_data.ctti_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
836       ctfc->ctfc_num_types++;
837     }
838   else
839     {
840       dtd->dtd_data.ctti_size = (uint32_t) size;
841       ctfc->ctfc_num_stypes++;
842     }
843 
844   return type;
845 }
846 
847 /* Given a TREE_TYPE node, return the CTF type ID for that type.  */
848 
849 ctf_id_t
ctf_lookup_tree_type(ctf_container_ref ctfc,const tree type)850 ctf_lookup_tree_type (ctf_container_ref ctfc, const tree type)
851 {
852   dw_die_ref die = lookup_type_die (type);
853   if (die == NULL)
854     return CTF_NULL_TYPEID;
855 
856   ctf_dtdef_ref dtd = ctf_dtd_lookup (ctfc, die);
857   if (dtd == NULL)
858     return CTF_NULL_TYPEID;
859 
860   return dtd->dtd_type;
861 }
862 
863 /* Check if CTF for TYPE has already been generated.  Mainstay for
864    de-duplication.  If CTF type already exists, returns TRUE and updates
865    the TYPE_ID for the caller.  */
866 
867 bool
ctf_type_exists(ctf_container_ref ctfc,dw_die_ref type,ctf_id_t * type_id)868 ctf_type_exists (ctf_container_ref ctfc, dw_die_ref type,
869 		 ctf_id_t * type_id)
870 {
871   bool exists = false;
872   ctf_dtdef_ref ctf_type_seen = ctf_dtd_lookup (ctfc, type);
873 
874   if (ctf_type_seen)
875     {
876       exists = true;
877       /* CTF type for this type exists.  */
878       *type_id = ctf_type_seen->dtd_type;
879     }
880 
881   return exists;
882 }
883 
884 /* Location information for CTF Types and CTF Variables.  CTF section does not
885    emit location information; at this time, location information is needed for
886    BTF CO-RE use-cases.  */
887 
888 int
ctfc_get_dtd_srcloc(ctf_dtdef_ref dtd,ctf_srcloc_ref loc)889 ctfc_get_dtd_srcloc (ctf_dtdef_ref dtd, ctf_srcloc_ref loc)
890 {
891   loc->ctsloc_file = ctf_get_die_loc_file (dtd->dtd_key);
892   loc->ctsloc_line = ctf_get_die_loc_line (dtd->dtd_key);
893   loc->ctsloc_col = ctf_get_die_loc_col (dtd->dtd_key);
894 
895   if (loc->ctsloc_file == NULL)
896     return 1;
897 
898   return 0;
899 }
900 
901 int
ctfc_get_dvd_srcloc(ctf_dvdef_ref dvd,ctf_srcloc_ref loc)902 ctfc_get_dvd_srcloc (ctf_dvdef_ref dvd, ctf_srcloc_ref loc)
903 {
904   loc->ctsloc_file = ctf_get_die_loc_file (dvd->dvd_key);
905   loc->ctsloc_line = ctf_get_die_loc_line (dvd->dvd_key);
906   loc->ctsloc_col = ctf_get_die_loc_col (dvd->dvd_key);
907 
908   if (loc->ctsloc_file == NULL)
909     return 1;
910 
911   return 0;
912 }
913 
914 /* CTF container setup and teardown routines.  */
915 
916 /* Initialize the CTF string table.
917    The first entry in the CTF string table (empty string) is added.  */
918 
919 static void
init_ctf_strtable(ctf_strtable_t * strtab)920 init_ctf_strtable (ctf_strtable_t * strtab)
921 {
922   strtab->ctstab_head = NULL;
923   strtab->ctstab_tail = NULL;
924   strtab->ctstab_num = 0;
925   strtab->ctstab_len = 0;
926 
927   /* The first entry in the CTF string table is an empty string.  E.g., CTF
928      type records with no name (like CTF_K_CONST, CTF_K_VOLATILE etc) point to
929      this string.  */
930   uint32_t estr_offset = 0;
931   strtab->ctstab_estr = ctfc_strtable_add_str (strtab, "", &estr_offset);
932 }
933 
934 /* Initialize the string tables in the CTF container.  */
935 
936 static void
init_ctf_string_table(ctf_container_ref ctfc)937 init_ctf_string_table (ctf_container_ref ctfc)
938 {
939   init_ctf_strtable (&ctfc->ctfc_strtable);
940   ctfc->ctfc_strlen++;
941 
942   init_ctf_strtable (&ctfc->ctfc_aux_strtable);
943   ctfc->ctfc_aux_strlen++;
944 }
945 
946 /* Allocate a new CTF container with the desired flags.  */
947 
948 static inline ctf_container_ref
new_ctf_container(void)949 new_ctf_container (void)
950 {
951   tu_ctfc = ggc_cleared_alloc<ctf_container_t> ();
952   tu_ctfc->ctfc_types
953     = hash_table<ctfc_dtd_hasher>::create_ggc (100);
954   tu_ctfc->ctfc_vars
955     = hash_table<ctfc_dvd_hasher>::create_ggc (100);
956   tu_ctfc->ctfc_ignore_vars
957     = hash_table<ctfc_dvd_hasher>::create_ggc (10);
958 
959   return tu_ctfc;
960 }
961 
962 /* Initialize a CTF container per translation unit.  */
963 
964 static void
init_ctf_container(void)965 init_ctf_container (void)
966 {
967   tu_ctfc = new_ctf_container ();
968 
969   tu_ctfc->ctfc_magic = CTF_MAGIC;
970   tu_ctfc->ctfc_version = CTF_VERSION;
971   tu_ctfc->ctfc_flags = CTF_F_NEWFUNCINFO;
972   tu_ctfc->ctfc_nextid = CTF_INIT_TYPEID;
973 
974   init_ctf_string_table (tu_ctfc);
975 }
976 
977 void
ctfc_delete_strtab(ctf_strtable_t * strtab)978 ctfc_delete_strtab (ctf_strtable_t * strtab)
979 {
980   ctf_string_t * str = NULL;
981   ctf_string_t * next_str = NULL;
982 
983   str = strtab->ctstab_head;
984   next_str = str;
985   while (next_str != NULL)
986     {
987       next_str = str->cts_next;
988       ggc_free (str);
989       str = next_str;
990     }
991 
992   strtab->ctstab_head = NULL;
993   strtab->ctstab_tail = NULL;
994   strtab->ctstab_estr = NULL;
995 }
996 
997 /* Delete the CTF container's resources.  */
998 
999 void
ctfc_delete_container(ctf_container_ref ctfc)1000 ctfc_delete_container (ctf_container_ref ctfc)
1001 {
1002   if (ctfc)
1003     {
1004       ctfc->ctfc_types->empty ();
1005       ctfc->ctfc_types = NULL;
1006 
1007       ctfc->ctfc_vars->empty ();
1008       ctfc->ctfc_types = NULL;
1009 
1010       ctfc->ctfc_ignore_vars->empty ();
1011       ctfc->ctfc_ignore_vars = NULL;
1012 
1013       ctfc_delete_strtab (&ctfc->ctfc_strtable);
1014       ctfc_delete_strtab (&ctfc->ctfc_aux_strtable);
1015       if (ctfc->ctfc_vars_list)
1016 	{
1017 	  ggc_free (ctfc->ctfc_vars_list);
1018 	  ctfc->ctfc_vars_list = NULL;
1019 	}
1020       if (ctfc->ctfc_types_list)
1021 	{
1022 	  ggc_free (ctfc->ctfc_types_list);
1023 	  ctfc->ctfc_types_list = NULL;
1024 	}
1025       if (ctfc->ctfc_gfuncs_list)
1026 	{
1027 	  ggc_free (ctfc->ctfc_gfuncs_list);
1028 	  ctfc->ctfc_gfuncs_list = NULL;
1029 	}
1030       if (ctfc->ctfc_gobjts_list)
1031 	{
1032 	  ggc_free (ctfc->ctfc_gobjts_list);
1033 	  ctfc->ctfc_gobjts_list = NULL;
1034 	}
1035 
1036       ctfc= NULL;
1037     }
1038 }
1039 
1040 /* CTF routines interfacing to the compiler.  */
1041 
1042 void
ctf_init(void)1043 ctf_init (void)
1044 {
1045   init_ctf_container ();
1046 }
1047