Skip unknown relocation
[deliverable/binutils-gdb.git] / gdb / guile / scm-type.c
CommitLineData
ed3ef339
DE
1/* Scheme interface to types.
2
32d0add0 3 Copyright (C) 2008-2015 Free Software Foundation, Inc.
ed3ef339
DE
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20/* See README file in this directory for implementation notes, coding
21 conventions, et.al. */
22
23#include "defs.h"
24#include "arch-utils.h"
25#include "value.h"
ed3ef339
DE
26#include "gdbtypes.h"
27#include "objfiles.h"
28#include "language.h"
29#include "vec.h"
30#include "bcache.h"
31#include "dwarf2loc.h"
32#include "typeprint.h"
33#include "guile-internal.h"
34
35/* The <gdb:type> smob.
36 The type is chained with all types associated with its objfile, if any.
37 This lets us copy the underlying struct type when the objfile is
1913f160
DE
38 deleted.
39 The typedef for this struct is in guile-internal.h. */
ed3ef339 40
1913f160 41struct _type_smob
ed3ef339
DE
42{
43 /* This always appears first.
44 eqable_gdb_smob is used so that types are eq?-able.
45 Also, a type object can be associated with an objfile. eqable_gdb_smob
46 lets us track the lifetime of all types associated with an objfile.
47 When an objfile is deleted we need to invalidate the type object. */
48 eqable_gdb_smob base;
49
50 /* The GDB type structure this smob is wrapping. */
51 struct type *type;
1913f160 52};
ed3ef339
DE
53
54/* A field smob. */
55
56typedef struct
57{
58 /* This always appears first. */
59 gdb_smob base;
60
61 /* Backlink to the containing <gdb:type> object. */
62 SCM type_scm;
63
64 /* The field number in TYPE_SCM. */
65 int field_num;
66} field_smob;
67
68static const char type_smob_name[] = "gdb:type";
69static const char field_smob_name[] = "gdb:field";
70
71static const char not_composite_error[] =
72 N_("type is not a structure, union, or enum type");
73
74/* The tag Guile knows the type smob by. */
75static scm_t_bits type_smob_tag;
76
77/* The tag Guile knows the field smob by. */
78static scm_t_bits field_smob_tag;
79
80/* The "next" procedure for field iterators. */
81static SCM tyscm_next_field_x_proc;
82
83/* Keywords used in argument passing. */
84static SCM block_keyword;
85
86static const struct objfile_data *tyscm_objfile_data_key;
87
88/* Hash table to uniquify global (non-objfile-owned) types. */
89static htab_t global_types_map;
90
91static struct type *tyscm_get_composite (struct type *type);
92
93/* Return the type field of T_SMOB.
94 This exists so that we don't have to export the struct's contents. */
95
96struct type *
97tyscm_type_smob_type (type_smob *t_smob)
98{
99 return t_smob->type;
100}
101
102/* Return the name of TYPE in expanded form.
103 Space for the result is malloc'd, caller must free.
104 If there's an error computing the name, the result is NULL and the
105 exception is stored in *EXCP. */
106
107static char *
108tyscm_type_name (struct type *type, SCM *excp)
109{
110 char *name = NULL;
111 volatile struct gdb_exception except;
112
113 TRY_CATCH (except, RETURN_MASK_ALL)
114 {
115 struct cleanup *old_chain;
116 struct ui_file *stb;
117
118 stb = mem_fileopen ();
119 old_chain = make_cleanup_ui_file_delete (stb);
120
121 LA_PRINT_TYPE (type, "", stb, -1, 0, &type_print_raw_options);
122
123 name = ui_file_xstrdup (stb, NULL);
124 do_cleanups (old_chain);
125 }
126 if (except.reason < 0)
127 {
128 *excp = gdbscm_scm_from_gdb_exception (except);
129 return NULL;
130 }
131
132 return name;
133}
134\f
135/* Administrivia for type smobs. */
136
137/* Helper function to hash a type_smob. */
138
139static hashval_t
140tyscm_hash_type_smob (const void *p)
141{
142 const type_smob *t_smob = p;
143
144 return htab_hash_pointer (t_smob->type);
145}
146
147/* Helper function to compute equality of type_smobs. */
148
149static int
150tyscm_eq_type_smob (const void *ap, const void *bp)
151{
152 const type_smob *a = ap;
153 const type_smob *b = bp;
154
155 return (a->type == b->type
156 && a->type != NULL);
157}
158
159/* Return the struct type pointer -> SCM mapping table.
160 If type is owned by an objfile, the mapping table is created if necessary.
161 Otherwise, type is not owned by an objfile, and we use
162 global_types_map. */
163
164static htab_t
165tyscm_type_map (struct type *type)
166{
167 struct objfile *objfile = TYPE_OBJFILE (type);
168 htab_t htab;
169
170 if (objfile == NULL)
171 return global_types_map;
172
173 htab = objfile_data (objfile, tyscm_objfile_data_key);
174 if (htab == NULL)
175 {
176 htab = gdbscm_create_eqable_gsmob_ptr_map (tyscm_hash_type_smob,
177 tyscm_eq_type_smob);
178 set_objfile_data (objfile, tyscm_objfile_data_key, htab);
179 }
180
181 return htab;
182}
183
ed3ef339
DE
184/* The smob "free" function for <gdb:type>. */
185
186static size_t
187tyscm_free_type_smob (SCM self)
188{
189 type_smob *t_smob = (type_smob *) SCM_SMOB_DATA (self);
190
191 if (t_smob->type != NULL)
192 {
193 htab_t htab = tyscm_type_map (t_smob->type);
194
195 gdbscm_clear_eqable_gsmob_ptr_slot (htab, &t_smob->base);
196 }
197
198 /* Not necessary, done to catch bugs. */
199 t_smob->type = NULL;
200
201 return 0;
202}
203
204/* The smob "print" function for <gdb:type>. */
205
206static int
207tyscm_print_type_smob (SCM self, SCM port, scm_print_state *pstate)
208{
209 type_smob *t_smob = (type_smob *) SCM_SMOB_DATA (self);
210 SCM exception;
211 char *name = tyscm_type_name (t_smob->type, &exception);
212
213 if (name == NULL)
214 gdbscm_throw (exception);
215
216 /* pstate->writingp = zero if invoked by display/~A, and nonzero if
217 invoked by write/~S. What to do here may need to evolve.
218 IWBN if we could pass an argument to format that would we could use
219 instead of writingp. */
220 if (pstate->writingp)
221 gdbscm_printf (port, "#<%s ", type_smob_name);
222
223 scm_puts (name, port);
224
225 if (pstate->writingp)
226 scm_puts (">", port);
227
228 scm_remember_upto_here_1 (self);
229
230 /* Non-zero means success. */
231 return 1;
232}
233
234/* The smob "equal?" function for <gdb:type>. */
235
236static SCM
237tyscm_equal_p_type_smob (SCM type1_scm, SCM type2_scm)
238{
239 type_smob *type1_smob, *type2_smob;
240 struct type *type1, *type2;
241 int result = 0;
242 volatile struct gdb_exception except;
243
244 SCM_ASSERT_TYPE (tyscm_is_type (type1_scm), type1_scm, SCM_ARG1, FUNC_NAME,
245 type_smob_name);
246 SCM_ASSERT_TYPE (tyscm_is_type (type2_scm), type2_scm, SCM_ARG2, FUNC_NAME,
247 type_smob_name);
248 type1_smob = (type_smob *) SCM_SMOB_DATA (type1_scm);
249 type2_smob = (type_smob *) SCM_SMOB_DATA (type2_scm);
250 type1 = type1_smob->type;
251 type2 = type2_smob->type;
252
253 TRY_CATCH (except, RETURN_MASK_ALL)
254 {
255 result = types_deeply_equal (type1, type2);
256 }
257 GDBSCM_HANDLE_GDB_EXCEPTION (except);
258
259 return scm_from_bool (result);
260}
261
262/* Low level routine to create a <gdb:type> object. */
263
264static SCM
265tyscm_make_type_smob (void)
266{
267 type_smob *t_smob = (type_smob *)
268 scm_gc_malloc (sizeof (type_smob), type_smob_name);
269 SCM t_scm;
270
271 /* This must be filled in by the caller. */
272 t_smob->type = NULL;
273
274 t_scm = scm_new_smob (type_smob_tag, (scm_t_bits) t_smob);
1254eefc 275 gdbscm_init_eqable_gsmob (&t_smob->base, t_scm);
ed3ef339
DE
276
277 return t_scm;
278}
279
280/* Return non-zero if SCM is a <gdb:type> object. */
281
282int
283tyscm_is_type (SCM self)
284{
285 return SCM_SMOB_PREDICATE (type_smob_tag, self);
286}
287
288/* (type? object) -> boolean */
289
290static SCM
291gdbscm_type_p (SCM self)
292{
293 return scm_from_bool (tyscm_is_type (self));
294}
295
296/* Return the existing object that encapsulates TYPE, or create a new
297 <gdb:type> object. */
298
299SCM
300tyscm_scm_from_type (struct type *type)
301{
302 htab_t htab;
303 eqable_gdb_smob **slot;
304 type_smob *t_smob, t_smob_for_lookup;
305 SCM t_scm;
306
307 /* If we've already created a gsmob for this type, return it.
308 This makes types eq?-able. */
309 htab = tyscm_type_map (type);
310 t_smob_for_lookup.type = type;
311 slot = gdbscm_find_eqable_gsmob_ptr_slot (htab, &t_smob_for_lookup.base);
312 if (*slot != NULL)
313 return (*slot)->containing_scm;
314
315 t_scm = tyscm_make_type_smob ();
316 t_smob = (type_smob *) SCM_SMOB_DATA (t_scm);
317 t_smob->type = type;
1254eefc 318 gdbscm_fill_eqable_gsmob_ptr_slot (slot, &t_smob->base);
ed3ef339
DE
319
320 return t_scm;
321}
322
323/* Returns the <gdb:type> object in SELF.
324 Throws an exception if SELF is not a <gdb:type> object. */
325
326static SCM
327tyscm_get_type_arg_unsafe (SCM self, int arg_pos, const char *func_name)
328{
329 SCM_ASSERT_TYPE (tyscm_is_type (self), self, arg_pos, func_name,
330 type_smob_name);
331
332 return self;
333}
334
335/* Returns a pointer to the type smob of SELF.
336 Throws an exception if SELF is not a <gdb:type> object. */
337
338type_smob *
339tyscm_get_type_smob_arg_unsafe (SCM self, int arg_pos, const char *func_name)
340{
341 SCM t_scm = tyscm_get_type_arg_unsafe (self, arg_pos, func_name);
342 type_smob *t_smob = (type_smob *) SCM_SMOB_DATA (t_scm);
343
344 return t_smob;
345}
346
347/* Helper function for save_objfile_types to make a deep copy of the type. */
348
349static int
350tyscm_copy_type_recursive (void **slot, void *info)
351{
352 type_smob *t_smob = (type_smob *) *slot;
353 htab_t copied_types = info;
354 struct objfile *objfile = TYPE_OBJFILE (t_smob->type);
5a1e8c7a
DE
355 htab_t htab;
356 eqable_gdb_smob **new_slot;
357 type_smob t_smob_for_lookup;
ed3ef339
DE
358
359 gdb_assert (objfile != NULL);
360
361 htab_empty (copied_types);
362 t_smob->type = copy_type_recursive (objfile, t_smob->type, copied_types);
5a1e8c7a
DE
363
364 /* The eq?-hashtab that the type lived in is going away.
365 Add the type to its new eq?-hashtab: Otherwise if/when the type is later
366 garbage collected we'll assert-fail if the type isn't in the hashtab.
367 PR 16612.
368
369 Types now live in "arch space", and things like "char" that came from
370 the objfile *could* be considered eq? with the arch "char" type.
371 However, they weren't before the objfile got deleted, so making them
372 eq? now is debatable. */
373 htab = tyscm_type_map (t_smob->type);
374 t_smob_for_lookup.type = t_smob->type;
375 new_slot = gdbscm_find_eqable_gsmob_ptr_slot (htab, &t_smob_for_lookup.base);
376 gdb_assert (*new_slot == NULL);
377 gdbscm_fill_eqable_gsmob_ptr_slot (new_slot, &t_smob->base);
378
ed3ef339
DE
379 return 1;
380}
381
382/* Called when OBJFILE is about to be deleted.
383 Make a copy of all types associated with OBJFILE. */
384
385static void
386save_objfile_types (struct objfile *objfile, void *datum)
387{
388 htab_t htab = datum;
389 htab_t copied_types;
390
391 if (!gdb_scheme_initialized)
392 return;
393
394 copied_types = create_copied_types_hash (objfile);
395
396 if (htab != NULL)
397 {
398 htab_traverse_noresize (htab, tyscm_copy_type_recursive, copied_types);
399 htab_delete (htab);
400 }
401
402 htab_delete (copied_types);
403}
404\f
405/* Administrivia for field smobs. */
406
ed3ef339
DE
407/* The smob "print" function for <gdb:field>. */
408
409static int
410tyscm_print_field_smob (SCM self, SCM port, scm_print_state *pstate)
411{
412 field_smob *f_smob = (field_smob *) SCM_SMOB_DATA (self);
413
414 gdbscm_printf (port, "#<%s ", field_smob_name);
415 scm_write (f_smob->type_scm, port);
416 gdbscm_printf (port, " %d", f_smob->field_num);
417 scm_puts (">", port);
418
419 scm_remember_upto_here_1 (self);
420
421 /* Non-zero means success. */
422 return 1;
423}
424
425/* Low level routine to create a <gdb:field> object for field FIELD_NUM
426 of type TYPE_SCM. */
427
428static SCM
429tyscm_make_field_smob (SCM type_scm, int field_num)
430{
431 field_smob *f_smob = (field_smob *)
432 scm_gc_malloc (sizeof (field_smob), field_smob_name);
433 SCM result;
434
435 f_smob->type_scm = type_scm;
436 f_smob->field_num = field_num;
437 result = scm_new_smob (field_smob_tag, (scm_t_bits) f_smob);
438 gdbscm_init_gsmob (&f_smob->base);
439
440 return result;
441}
442
443/* Return non-zero if SCM is a <gdb:field> object. */
444
445static int
446tyscm_is_field (SCM self)
447{
448 return SCM_SMOB_PREDICATE (field_smob_tag, self);
449}
450
451/* (field? object) -> boolean */
452
453static SCM
454gdbscm_field_p (SCM self)
455{
456 return scm_from_bool (tyscm_is_field (self));
457}
458
459/* Create a new <gdb:field> object that encapsulates field FIELD_NUM
460 in type TYPE_SCM. */
461
462SCM
463tyscm_scm_from_field (SCM type_scm, int field_num)
464{
465 return tyscm_make_field_smob (type_scm, field_num);
466}
467
468/* Returns the <gdb:field> object in SELF.
469 Throws an exception if SELF is not a <gdb:field> object. */
470
471static SCM
472tyscm_get_field_arg_unsafe (SCM self, int arg_pos, const char *func_name)
473{
474 SCM_ASSERT_TYPE (tyscm_is_field (self), self, arg_pos, func_name,
475 field_smob_name);
476
477 return self;
478}
479
480/* Returns a pointer to the field smob of SELF.
481 Throws an exception if SELF is not a <gdb:field> object. */
482
483static field_smob *
484tyscm_get_field_smob_arg_unsafe (SCM self, int arg_pos, const char *func_name)
485{
486 SCM f_scm = tyscm_get_field_arg_unsafe (self, arg_pos, func_name);
487 field_smob *f_smob = (field_smob *) SCM_SMOB_DATA (f_scm);
488
489 return f_smob;
490}
491
492/* Returns a pointer to the type struct in F_SMOB
493 (the type the field is in). */
494
495static struct type *
496tyscm_field_smob_containing_type (field_smob *f_smob)
497{
498 type_smob *t_smob;
499
500 gdb_assert (tyscm_is_type (f_smob->type_scm));
501 t_smob = (type_smob *) SCM_SMOB_DATA (f_smob->type_scm);
502
503 return t_smob->type;
504}
505
506/* Returns a pointer to the field struct of F_SMOB. */
507
508static struct field *
509tyscm_field_smob_to_field (field_smob *f_smob)
510{
511 struct type *type = tyscm_field_smob_containing_type (f_smob);
512
513 /* This should be non-NULL by construction. */
514 gdb_assert (TYPE_FIELDS (type) != NULL);
515
516 return &TYPE_FIELD (type, f_smob->field_num);
517}
518\f
519/* Type smob accessors. */
520
521/* (type-code <gdb:type>) -> integer
522 Return the code for this type. */
523
524static SCM
525gdbscm_type_code (SCM self)
526{
527 type_smob *t_smob
528 = tyscm_get_type_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
529 struct type *type = t_smob->type;
530
531 return scm_from_int (TYPE_CODE (type));
532}
533
534/* (type-fields <gdb:type>) -> list
535 Return a list of all fields. Each element is a <gdb:field> object.
536 This also supports arrays, we return a field list of one element,
537 the range type. */
538
539static SCM
540gdbscm_type_fields (SCM self)
541{
542 type_smob *t_smob
543 = tyscm_get_type_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
544 struct type *type = t_smob->type;
545 struct type *containing_type;
546 SCM containing_type_scm, result;
547 int i;
548
549 containing_type = tyscm_get_composite (type);
550 if (containing_type == NULL)
551 gdbscm_out_of_range_error (FUNC_NAME, SCM_ARG1, self,
552 _(not_composite_error));
553
554 /* If SELF is a typedef or reference, we want the underlying type,
555 which is what tyscm_get_composite returns. */
556 if (containing_type == type)
557 containing_type_scm = self;
558 else
559 containing_type_scm = tyscm_scm_from_type (containing_type);
560
561 result = SCM_EOL;
562 for (i = 0; i < TYPE_NFIELDS (containing_type); ++i)
563 result = scm_cons (tyscm_make_field_smob (containing_type_scm, i), result);
564
565 return scm_reverse_x (result, SCM_EOL);
566}
567
568/* (type-tag <gdb:type>) -> string
569 Return the type's tag, or #f. */
570
571static SCM
572gdbscm_type_tag (SCM self)
573{
574 type_smob *t_smob
575 = tyscm_get_type_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
576 struct type *type = t_smob->type;
577
578 if (!TYPE_TAG_NAME (type))
579 return SCM_BOOL_F;
580 return gdbscm_scm_from_c_string (TYPE_TAG_NAME (type));
581}
582
583/* (type-name <gdb:type>) -> string
584 Return the type's name, or #f. */
585
586static SCM
587gdbscm_type_name (SCM self)
588{
589 type_smob *t_smob
590 = tyscm_get_type_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
591 struct type *type = t_smob->type;
592
593 if (!TYPE_NAME (type))
594 return SCM_BOOL_F;
595 return gdbscm_scm_from_c_string (TYPE_NAME (type));
596}
597
598/* (type-print-name <gdb:type>) -> string
599 Return the print name of type.
600 TODO: template support elided for now. */
601
602static SCM
603gdbscm_type_print_name (SCM self)
604{
605 type_smob *t_smob
606 = tyscm_get_type_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
607 struct type *type = t_smob->type;
608 char *thetype;
609 SCM exception, result;
610
611 thetype = tyscm_type_name (type, &exception);
612
613 if (thetype == NULL)
614 gdbscm_throw (exception);
615
616 result = gdbscm_scm_from_c_string (thetype);
617 xfree (thetype);
618
619 return result;
620}
621
622/* (type-sizeof <gdb:type>) -> integer
623 Return the size of the type represented by SELF, in bytes. */
624
625static SCM
626gdbscm_type_sizeof (SCM self)
627{
628 type_smob *t_smob
629 = tyscm_get_type_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
630 struct type *type = t_smob->type;
631 volatile struct gdb_exception except;
632
633 TRY_CATCH (except, RETURN_MASK_ALL)
634 {
635 check_typedef (type);
636 }
637 /* Ignore exceptions. */
638
639 return scm_from_long (TYPE_LENGTH (type));
640}
641
642/* (type-strip-typedefs <gdb:type>) -> <gdb:type>
643 Return the type, stripped of typedefs. */
644
645static SCM
646gdbscm_type_strip_typedefs (SCM self)
647{
648 type_smob *t_smob
649 = tyscm_get_type_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
650 struct type *type = t_smob->type;
651 volatile struct gdb_exception except;
652
653 TRY_CATCH (except, RETURN_MASK_ALL)
654 {
655 type = check_typedef (type);
656 }
657 GDBSCM_HANDLE_GDB_EXCEPTION (except);
658
659 return tyscm_scm_from_type (type);
660}
661
662/* Strip typedefs and pointers/reference from a type. Then check that
663 it is a struct, union, or enum type. If not, return NULL. */
664
665static struct type *
666tyscm_get_composite (struct type *type)
667{
668 volatile struct gdb_exception except;
669
670 for (;;)
671 {
672 TRY_CATCH (except, RETURN_MASK_ALL)
673 {
674 type = check_typedef (type);
675 }
676 GDBSCM_HANDLE_GDB_EXCEPTION (except);
677
678 if (TYPE_CODE (type) != TYPE_CODE_PTR
679 && TYPE_CODE (type) != TYPE_CODE_REF)
680 break;
681 type = TYPE_TARGET_TYPE (type);
682 }
683
684 /* If this is not a struct, union, or enum type, raise TypeError
685 exception. */
686 if (TYPE_CODE (type) != TYPE_CODE_STRUCT
687 && TYPE_CODE (type) != TYPE_CODE_UNION
688 && TYPE_CODE (type) != TYPE_CODE_ENUM)
689 return NULL;
690
691 return type;
692}
693
694/* Helper for tyscm_array and tyscm_vector. */
695
696static SCM
697tyscm_array_1 (SCM self, SCM n1_scm, SCM n2_scm, int is_vector,
698 const char *func_name)
699{
700 type_smob *t_smob
701 = tyscm_get_type_smob_arg_unsafe (self, SCM_ARG1, func_name);
702 struct type *type = t_smob->type;
703 long n1, n2 = 0;
704 struct type *array = NULL;
705 volatile struct gdb_exception except;
706
707 gdbscm_parse_function_args (func_name, SCM_ARG2, NULL, "l|l",
708 n1_scm, &n1, n2_scm, &n2);
709
710 if (SCM_UNBNDP (n2_scm))
711 {
712 n2 = n1;
713 n1 = 0;
714 }
715
fce10a84 716 if (n2 < n1 - 1)
ed3ef339
DE
717 {
718 gdbscm_out_of_range_error (func_name, SCM_ARG3,
719 scm_cons (scm_from_long (n1),
720 scm_from_long (n2)),
721 _("Array length must not be negative"));
722 }
723
724 TRY_CATCH (except, RETURN_MASK_ALL)
725 {
726 array = lookup_array_range_type (type, n1, n2);
727 if (is_vector)
728 make_vector_type (array);
729 }
730 GDBSCM_HANDLE_GDB_EXCEPTION (except);
731
732 return tyscm_scm_from_type (array);
733}
734
735/* (type-array <gdb:type> [low-bound] high-bound) -> <gdb:type>
736 The array has indices [low-bound,high-bound].
737 If low-bound is not provided zero is used.
738 Return an array type.
739
740 IWBN if the one argument version specified a size, not the high bound.
741 It's too easy to pass one argument thinking it is the size of the array.
742 The current semantics are for compatibility with the Python version.
743 Later we can add #:size. */
744
745static SCM
746gdbscm_type_array (SCM self, SCM n1, SCM n2)
747{
748 return tyscm_array_1 (self, n1, n2, 0, FUNC_NAME);
749}
750
751/* (type-vector <gdb:type> [low-bound] high-bound) -> <gdb:type>
752 The array has indices [low-bound,high-bound].
753 If low-bound is not provided zero is used.
754 Return a vector type.
755
756 IWBN if the one argument version specified a size, not the high bound.
757 It's too easy to pass one argument thinking it is the size of the array.
758 The current semantics are for compatibility with the Python version.
759 Later we can add #:size. */
760
761static SCM
762gdbscm_type_vector (SCM self, SCM n1, SCM n2)
763{
764 return tyscm_array_1 (self, n1, n2, 1, FUNC_NAME);
765}
766
767/* (type-pointer <gdb:type>) -> <gdb:type>
768 Return a <gdb:type> object which represents a pointer to SELF. */
769
770static SCM
771gdbscm_type_pointer (SCM self)
772{
773 type_smob *t_smob
774 = tyscm_get_type_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
775 struct type *type = t_smob->type;
776 volatile struct gdb_exception except;
777
778 TRY_CATCH (except, RETURN_MASK_ALL)
779 {
780 type = lookup_pointer_type (type);
781 }
782 GDBSCM_HANDLE_GDB_EXCEPTION (except);
783
784 return tyscm_scm_from_type (type);
785}
786
787/* (type-range <gdb:type>) -> (low high)
788 Return the range of a type represented by SELF. The return type is
789 a list. The first element is the low bound, and the second element
790 is the high bound. */
791
792static SCM
793gdbscm_type_range (SCM self)
794{
795 type_smob *t_smob
796 = tyscm_get_type_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
797 struct type *type = t_smob->type;
798 SCM low_scm, high_scm;
799 /* Initialize these to appease GCC warnings. */
800 LONGEST low = 0, high = 0;
801
802 SCM_ASSERT_TYPE (TYPE_CODE (type) == TYPE_CODE_ARRAY
803 || TYPE_CODE (type) == TYPE_CODE_STRING
804 || TYPE_CODE (type) == TYPE_CODE_RANGE,
805 self, SCM_ARG1, FUNC_NAME, _("ranged type"));
806
807 switch (TYPE_CODE (type))
808 {
809 case TYPE_CODE_ARRAY:
810 case TYPE_CODE_STRING:
811 low = TYPE_LOW_BOUND (TYPE_INDEX_TYPE (type));
812 high = TYPE_HIGH_BOUND (TYPE_INDEX_TYPE (type));
813 break;
814 case TYPE_CODE_RANGE:
815 low = TYPE_LOW_BOUND (type);
816 high = TYPE_HIGH_BOUND (type);
817 break;
818 }
819
820 low_scm = gdbscm_scm_from_longest (low);
821 high_scm = gdbscm_scm_from_longest (high);
822
823 return scm_list_2 (low_scm, high_scm);
824}
825
826/* (type-reference <gdb:type>) -> <gdb:type>
827 Return a <gdb:type> object which represents a reference to SELF. */
828
829static SCM
830gdbscm_type_reference (SCM self)
831{
832 type_smob *t_smob
833 = tyscm_get_type_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
834 struct type *type = t_smob->type;
835 volatile struct gdb_exception except;
836
837 TRY_CATCH (except, RETURN_MASK_ALL)
838 {
839 type = lookup_reference_type (type);
840 }
841 GDBSCM_HANDLE_GDB_EXCEPTION (except);
842
843 return tyscm_scm_from_type (type);
844}
845
846/* (type-target <gdb:type>) -> <gdb:type>
847 Return a <gdb:type> object which represents the target type of SELF. */
848
849static SCM
850gdbscm_type_target (SCM self)
851{
852 type_smob *t_smob
853 = tyscm_get_type_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
854 struct type *type = t_smob->type;
855
856 SCM_ASSERT (TYPE_TARGET_TYPE (type), self, SCM_ARG1, FUNC_NAME);
857
858 return tyscm_scm_from_type (TYPE_TARGET_TYPE (type));
859}
860
861/* (type-const <gdb:type>) -> <gdb:type>
862 Return a const-qualified type variant. */
863
864static SCM
865gdbscm_type_const (SCM self)
866{
867 type_smob *t_smob
868 = tyscm_get_type_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
869 struct type *type = t_smob->type;
870 volatile struct gdb_exception except;
871
872 TRY_CATCH (except, RETURN_MASK_ALL)
873 {
874 type = make_cv_type (1, 0, type, NULL);
875 }
876 GDBSCM_HANDLE_GDB_EXCEPTION (except);
877
878 return tyscm_scm_from_type (type);
879}
880
881/* (type-volatile <gdb:type>) -> <gdb:type>
882 Return a volatile-qualified type variant. */
883
884static SCM
885gdbscm_type_volatile (SCM self)
886{
887 type_smob *t_smob
888 = tyscm_get_type_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
889 struct type *type = t_smob->type;
890 volatile struct gdb_exception except;
891
892 TRY_CATCH (except, RETURN_MASK_ALL)
893 {
894 type = make_cv_type (0, 1, type, NULL);
895 }
896 GDBSCM_HANDLE_GDB_EXCEPTION (except);
897
898 return tyscm_scm_from_type (type);
899}
900
901/* (type-unqualified <gdb:type>) -> <gdb:type>
902 Return an unqualified type variant. */
903
904static SCM
905gdbscm_type_unqualified (SCM self)
906{
907 type_smob *t_smob
908 = tyscm_get_type_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
909 struct type *type = t_smob->type;
910 volatile struct gdb_exception except;
911
912 TRY_CATCH (except, RETURN_MASK_ALL)
913 {
914 type = make_cv_type (0, 0, type, NULL);
915 }
916 GDBSCM_HANDLE_GDB_EXCEPTION (except);
917
918 return tyscm_scm_from_type (type);
919}
920\f
921/* Field related accessors of types. */
922
923/* (type-num-fields <gdb:type>) -> integer
924 Return number of fields. */
925
926static SCM
927gdbscm_type_num_fields (SCM self)
928{
929 type_smob *t_smob
930 = tyscm_get_type_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
931 struct type *type = t_smob->type;
932
933 type = tyscm_get_composite (type);
934 if (type == NULL)
935 gdbscm_out_of_range_error (FUNC_NAME, SCM_ARG1, self,
936 _(not_composite_error));
937
938 return scm_from_long (TYPE_NFIELDS (type));
939}
940
941/* (type-field <gdb:type> string) -> <gdb:field>
942 Return the <gdb:field> object for the field named by the argument. */
943
944static SCM
945gdbscm_type_field (SCM self, SCM field_scm)
946{
947 type_smob *t_smob
948 = tyscm_get_type_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
949 struct type *type = t_smob->type;
950 char *field;
951 int i;
952 struct cleanup *cleanups;
953
954 SCM_ASSERT_TYPE (scm_is_string (field_scm), field_scm, SCM_ARG2, FUNC_NAME,
955 _("string"));
956
957 /* We want just fields of this type, not of base types, so instead of
958 using lookup_struct_elt_type, portions of that function are
959 copied here. */
960
961 type = tyscm_get_composite (type);
962 if (type == NULL)
963 gdbscm_out_of_range_error (FUNC_NAME, SCM_ARG1, self,
964 _(not_composite_error));
965
966 field = gdbscm_scm_to_c_string (field_scm);
967 cleanups = make_cleanup (xfree, field);
968
969 for (i = 0; i < TYPE_NFIELDS (type); i++)
970 {
971 const char *t_field_name = TYPE_FIELD_NAME (type, i);
972
973 if (t_field_name && (strcmp_iw (t_field_name, field) == 0))
974 {
975 do_cleanups (cleanups);
976 return tyscm_make_field_smob (self, i);
977 }
978 }
979
980 do_cleanups (cleanups);
981
982 gdbscm_out_of_range_error (FUNC_NAME, SCM_ARG1, field_scm,
983 _("Unknown field"));
984}
985
986/* (type-has-field? <gdb:type> string) -> boolean
987 Return boolean indicating if type SELF has FIELD_SCM (a string). */
988
989static SCM
990gdbscm_type_has_field_p (SCM self, SCM field_scm)
991{
992 type_smob *t_smob
993 = tyscm_get_type_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
994 struct type *type = t_smob->type;
995 char *field;
996 int i;
997 struct cleanup *cleanups;
998
999 SCM_ASSERT_TYPE (scm_is_string (field_scm), field_scm, SCM_ARG2, FUNC_NAME,
1000 _("string"));
1001
1002 /* We want just fields of this type, not of base types, so instead of
1003 using lookup_struct_elt_type, portions of that function are
1004 copied here. */
1005
1006 type = tyscm_get_composite (type);
1007 if (type == NULL)
1008 gdbscm_out_of_range_error (FUNC_NAME, SCM_ARG1, self,
1009 _(not_composite_error));
1010
1011 field = gdbscm_scm_to_c_string (field_scm);
1012 cleanups = make_cleanup (xfree, field);
1013
1014 for (i = 0; i < TYPE_NFIELDS (type); i++)
1015 {
1016 const char *t_field_name = TYPE_FIELD_NAME (type, i);
1017
1018 if (t_field_name && (strcmp_iw (t_field_name, field) == 0))
1019 {
1020 do_cleanups (cleanups);
1021 return SCM_BOOL_T;
1022 }
1023 }
1024
1025 do_cleanups (cleanups);
1026
1027 return SCM_BOOL_F;
1028}
1029
1030/* (make-field-iterator <gdb:type>) -> <gdb:iterator>
1031 Make a field iterator object. */
1032
1033static SCM
1034gdbscm_make_field_iterator (SCM self)
1035{
1036 type_smob *t_smob
1037 = tyscm_get_type_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
1038 struct type *type = t_smob->type;
1039 struct type *containing_type;
1040 SCM containing_type_scm;
1041
1042 containing_type = tyscm_get_composite (type);
1043 if (containing_type == NULL)
1044 gdbscm_out_of_range_error (FUNC_NAME, SCM_ARG1, self,
1045 _(not_composite_error));
1046
1047 /* If SELF is a typedef or reference, we want the underlying type,
1048 which is what tyscm_get_composite returns. */
1049 if (containing_type == type)
1050 containing_type_scm = self;
1051 else
1052 containing_type_scm = tyscm_scm_from_type (containing_type);
1053
1054 return gdbscm_make_iterator (containing_type_scm, scm_from_int (0),
1055 tyscm_next_field_x_proc);
1056}
1057
1058/* (type-next-field! <gdb:iterator>) -> <gdb:field>
1059 Return the next field in the iteration through the list of fields of the
1060 type, or (end-of-iteration).
1061 SELF is a <gdb:iterator> object created by gdbscm_make_field_iterator.
1062 This is the next! <gdb:iterator> function, not exported to the user. */
1063
1064static SCM
1065gdbscm_type_next_field_x (SCM self)
1066{
1067 iterator_smob *i_smob;
1068 type_smob *t_smob;
1069 struct type *type;
1070 SCM it_scm, result, progress, object;
1071 int field, rc;
1072
1073 it_scm = itscm_get_iterator_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
1074 i_smob = (iterator_smob *) SCM_SMOB_DATA (it_scm);
1075 object = itscm_iterator_smob_object (i_smob);
1076 progress = itscm_iterator_smob_progress (i_smob);
1077
1078 SCM_ASSERT_TYPE (tyscm_is_type (object), object,
1079 SCM_ARG1, FUNC_NAME, type_smob_name);
1080 t_smob = (type_smob *) SCM_SMOB_DATA (object);
1081 type = t_smob->type;
1082
1083 SCM_ASSERT_TYPE (scm_is_signed_integer (progress,
1084 0, TYPE_NFIELDS (type)),
1085 progress, SCM_ARG1, FUNC_NAME, _("integer"));
1086 field = scm_to_int (progress);
1087
1088 if (field < TYPE_NFIELDS (type))
1089 {
1090 result = tyscm_make_field_smob (object, field);
1091 itscm_set_iterator_smob_progress_x (i_smob, scm_from_int (field + 1));
1092 return result;
1093 }
1094
1095 return gdbscm_end_of_iteration ();
1096}
1097\f
1098/* Field smob accessors. */
1099
1100/* (field-name <gdb:field>) -> string
1101 Return the name of this field or #f if there isn't one. */
1102
1103static SCM
1104gdbscm_field_name (SCM self)
1105{
1106 field_smob *f_smob
1107 = tyscm_get_field_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
1108 struct field *field = tyscm_field_smob_to_field (f_smob);
1109
1110 if (FIELD_NAME (*field))
1111 return gdbscm_scm_from_c_string (FIELD_NAME (*field));
1112 return SCM_BOOL_F;
1113}
1114
1115/* (field-type <gdb:field>) -> <gdb:type>
1116 Return the <gdb:type> object of the field or #f if there isn't one. */
1117
1118static SCM
1119gdbscm_field_type (SCM self)
1120{
1121 field_smob *f_smob
1122 = tyscm_get_field_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
1123 struct field *field = tyscm_field_smob_to_field (f_smob);
1124
1125 /* A field can have a NULL type in some situations. */
1126 if (FIELD_TYPE (*field))
1127 return tyscm_scm_from_type (FIELD_TYPE (*field));
1128 return SCM_BOOL_F;
1129}
1130
1131/* (field-enumval <gdb:field>) -> integer
1132 For enum values, return its value as an integer. */
1133
1134static SCM
1135gdbscm_field_enumval (SCM self)
1136{
1137 field_smob *f_smob
1138 = tyscm_get_field_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
1139 struct field *field = tyscm_field_smob_to_field (f_smob);
1140 struct type *type = tyscm_field_smob_containing_type (f_smob);
1141
1142 SCM_ASSERT_TYPE (TYPE_CODE (type) == TYPE_CODE_ENUM,
1143 self, SCM_ARG1, FUNC_NAME, _("enum type"));
1144
1145 return scm_from_long (FIELD_ENUMVAL (*field));
1146}
1147
1148/* (field-bitpos <gdb:field>) -> integer
1149 For bitfields, return its offset in bits. */
1150
1151static SCM
1152gdbscm_field_bitpos (SCM self)
1153{
1154 field_smob *f_smob
1155 = tyscm_get_field_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
1156 struct field *field = tyscm_field_smob_to_field (f_smob);
1157 struct type *type = tyscm_field_smob_containing_type (f_smob);
1158
1159 SCM_ASSERT_TYPE (TYPE_CODE (type) != TYPE_CODE_ENUM,
1160 self, SCM_ARG1, FUNC_NAME, _("non-enum type"));
1161
1162 return scm_from_long (FIELD_BITPOS (*field));
1163}
1164
1165/* (field-bitsize <gdb:field>) -> integer
1166 Return the size of the field in bits. */
1167
1168static SCM
1169gdbscm_field_bitsize (SCM self)
1170{
1171 field_smob *f_smob
1172 = tyscm_get_field_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
1173 struct field *field = tyscm_field_smob_to_field (f_smob);
1174
1175 return scm_from_long (FIELD_BITPOS (*field));
1176}
1177
1178/* (field-artificial? <gdb:field>) -> boolean
1179 Return #t if field is artificial. */
1180
1181static SCM
1182gdbscm_field_artificial_p (SCM self)
1183{
1184 field_smob *f_smob
1185 = tyscm_get_field_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
1186 struct field *field = tyscm_field_smob_to_field (f_smob);
1187
1188 return scm_from_bool (FIELD_ARTIFICIAL (*field));
1189}
1190
1191/* (field-baseclass? <gdb:field>) -> boolean
1192 Return #t if field is a baseclass. */
1193
1194static SCM
1195gdbscm_field_baseclass_p (SCM self)
1196{
1197 field_smob *f_smob
1198 = tyscm_get_field_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
1199 struct field *field = tyscm_field_smob_to_field (f_smob);
1200 struct type *type = tyscm_field_smob_containing_type (f_smob);
1201
4753d33b 1202 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
ed3ef339
DE
1203 return scm_from_bool (f_smob->field_num < TYPE_N_BASECLASSES (type));
1204 return SCM_BOOL_F;
1205}
1206\f
1207/* Return the type named TYPE_NAME in BLOCK.
1208 Returns NULL if not found.
1209 This routine does not throw an error. */
1210
1211static struct type *
1212tyscm_lookup_typename (const char *type_name, const struct block *block)
1213{
1214 struct type *type = NULL;
1215 volatile struct gdb_exception except;
1216
1217 TRY_CATCH (except, RETURN_MASK_ALL)
1218 {
1219 if (!strncmp (type_name, "struct ", 7))
1220 type = lookup_struct (type_name + 7, NULL);
1221 else if (!strncmp (type_name, "union ", 6))
1222 type = lookup_union (type_name + 6, NULL);
1223 else if (!strncmp (type_name, "enum ", 5))
1224 type = lookup_enum (type_name + 5, NULL);
1225 else
1226 type = lookup_typename (current_language, get_current_arch (),
1227 type_name, block, 0);
1228 }
1229 if (except.reason < 0)
1230 return NULL;
1231
1232 return type;
1233}
1234
1235/* (lookup-type name [#:block <gdb:block>]) -> <gdb:type>
1236 TODO: legacy template support left out until needed. */
1237
1238static SCM
1239gdbscm_lookup_type (SCM name_scm, SCM rest)
1240{
1241 SCM keywords[] = { block_keyword, SCM_BOOL_F };
1242 char *name;
1243 SCM block_scm = SCM_BOOL_F;
1244 int block_arg_pos = -1;
1245 const struct block *block = NULL;
1246 struct type *type;
1247
1248 gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, keywords, "s#O",
1249 name_scm, &name,
1250 rest, &block_arg_pos, &block_scm);
1251
1252 if (block_arg_pos != -1)
1253 {
1254 SCM exception;
1255
1256 block = bkscm_scm_to_block (block_scm, block_arg_pos, FUNC_NAME,
1257 &exception);
1258 if (block == NULL)
1259 {
1260 xfree (name);
1261 gdbscm_throw (exception);
1262 }
1263 }
1264 type = tyscm_lookup_typename (name, block);
1265 xfree (name);
1266
1267 if (type != NULL)
1268 return tyscm_scm_from_type (type);
1269 return SCM_BOOL_F;
1270}
1271\f
1272/* Initialize the Scheme type code. */
1273
1274
1275static const scheme_integer_constant type_integer_constants[] =
1276{
1277#define X(SYM) { #SYM, SYM }
1278 X (TYPE_CODE_BITSTRING),
1279 X (TYPE_CODE_PTR),
1280 X (TYPE_CODE_ARRAY),
1281 X (TYPE_CODE_STRUCT),
1282 X (TYPE_CODE_UNION),
1283 X (TYPE_CODE_ENUM),
1284 X (TYPE_CODE_FLAGS),
1285 X (TYPE_CODE_FUNC),
1286 X (TYPE_CODE_INT),
1287 X (TYPE_CODE_FLT),
1288 X (TYPE_CODE_VOID),
1289 X (TYPE_CODE_SET),
1290 X (TYPE_CODE_RANGE),
1291 X (TYPE_CODE_STRING),
1292 X (TYPE_CODE_ERROR),
1293 X (TYPE_CODE_METHOD),
1294 X (TYPE_CODE_METHODPTR),
1295 X (TYPE_CODE_MEMBERPTR),
1296 X (TYPE_CODE_REF),
1297 X (TYPE_CODE_CHAR),
1298 X (TYPE_CODE_BOOL),
1299 X (TYPE_CODE_COMPLEX),
1300 X (TYPE_CODE_TYPEDEF),
1301 X (TYPE_CODE_NAMESPACE),
1302 X (TYPE_CODE_DECFLOAT),
1303 X (TYPE_CODE_INTERNAL_FUNCTION),
1304#undef X
1305
1306 END_INTEGER_CONSTANTS
1307};
1308
1309static const scheme_function type_functions[] =
1310{
1311 { "type?", 1, 0, 0, gdbscm_type_p,
1312 "\
1313Return #t if the object is a <gdb:type> object." },
1314
1315 { "lookup-type", 1, 0, 1, gdbscm_lookup_type,
1316 "\
1317Return the <gdb:type> object representing string or #f if not found.\n\
1318If block is given then the type is looked for in that block.\n\
1319\n\
1320 Arguments: string [#:block <gdb:block>]" },
1321
1322 { "type-code", 1, 0, 0, gdbscm_type_code,
1323 "\
1324Return the code of the type" },
1325
1326 { "type-tag", 1, 0, 0, gdbscm_type_tag,
1327 "\
1328Return the tag name of the type, or #f if there isn't one." },
1329
1330 { "type-name", 1, 0, 0, gdbscm_type_name,
1331 "\
1332Return the name of the type as a string, or #f if there isn't one." },
1333
1334 { "type-print-name", 1, 0, 0, gdbscm_type_print_name,
1335 "\
1336Return the print name of the type as a string." },
1337
1338 { "type-sizeof", 1, 0, 0, gdbscm_type_sizeof,
1339 "\
1340Return the size of the type, in bytes." },
1341
1342 { "type-strip-typedefs", 1, 0, 0, gdbscm_type_strip_typedefs,
1343 "\
1344Return a type formed by stripping the type of all typedefs." },
1345
1346 { "type-array", 2, 1, 0, gdbscm_type_array,
1347 "\
1348Return a type representing an array of objects of the type.\n\
1349\n\
1350 Arguments: <gdb:type> [low-bound] high-bound\n\
1351 If low-bound is not provided zero is used.\n\
1352 N.B. If only the high-bound parameter is specified, it is not\n\
1353 the array size.\n\
1354 Valid bounds for array indices are [low-bound,high-bound]." },
1355
1356 { "type-vector", 2, 1, 0, gdbscm_type_vector,
1357 "\
1358Return a type representing a vector of objects of the type.\n\
1359Vectors differ from arrays in that if the current language has C-style\n\
1360arrays, vectors don't decay to a pointer to the first element.\n\
1361They are first class values.\n\
1362\n\
1363 Arguments: <gdb:type> [low-bound] high-bound\n\
1364 If low-bound is not provided zero is used.\n\
1365 N.B. If only the high-bound parameter is specified, it is not\n\
1366 the array size.\n\
1367 Valid bounds for array indices are [low-bound,high-bound]." },
1368
1369 { "type-pointer", 1, 0, 0, gdbscm_type_pointer,
1370 "\
1371Return a type of pointer to the type." },
1372
1373 { "type-range", 1, 0, 0, gdbscm_type_range,
1374 "\
1375Return (low high) representing the range for the type." },
1376
1377 { "type-reference", 1, 0, 0, gdbscm_type_reference,
1378 "\
1379Return a type of reference to the type." },
1380
1381 { "type-target", 1, 0, 0, gdbscm_type_target,
1382 "\
1383Return the target type of the type." },
1384
1385 { "type-const", 1, 0, 0, gdbscm_type_const,
1386 "\
1387Return a const variant of the type." },
1388
1389 { "type-volatile", 1, 0, 0, gdbscm_type_volatile,
1390 "\
1391Return a volatile variant of the type." },
1392
1393 { "type-unqualified", 1, 0, 0, gdbscm_type_unqualified,
1394 "\
1395Return a variant of the type without const or volatile attributes." },
1396
1397 { "type-num-fields", 1, 0, 0, gdbscm_type_num_fields,
1398 "\
1399Return the number of fields of the type." },
1400
1401 { "type-fields", 1, 0, 0, gdbscm_type_fields,
1402 "\
1403Return the list of <gdb:field> objects of fields of the type." },
1404
1405 { "make-field-iterator", 1, 0, 0, gdbscm_make_field_iterator,
1406 "\
1407Return a <gdb:iterator> object for iterating over the fields of the type." },
1408
1409 { "type-field", 2, 0, 0, gdbscm_type_field,
1410 "\
1411Return the field named by string of the type.\n\
1412\n\
1413 Arguments: <gdb:type> string" },
1414
1415 { "type-has-field?", 2, 0, 0, gdbscm_type_has_field_p,
1416 "\
1417Return #t if the type has field named string.\n\
1418\n\
1419 Arguments: <gdb:type> string" },
1420
1421 { "field?", 1, 0, 0, gdbscm_field_p,
1422 "\
1423Return #t if the object is a <gdb:field> object." },
1424
1425 { "field-name", 1, 0, 0, gdbscm_field_name,
1426 "\
1427Return the name of the field." },
1428
1429 { "field-type", 1, 0, 0, gdbscm_field_type,
1430 "\
1431Return the type of the field." },
1432
1433 { "field-enumval", 1, 0, 0, gdbscm_field_enumval,
1434 "\
1435Return the enum value represented by the field." },
1436
1437 { "field-bitpos", 1, 0, 0, gdbscm_field_bitpos,
1438 "\
1439Return the offset in bits of the field in its containing type." },
1440
1441 { "field-bitsize", 1, 0, 0, gdbscm_field_bitsize,
1442 "\
1443Return the size of the field in bits." },
1444
1445 { "field-artificial?", 1, 0, 0, gdbscm_field_artificial_p,
1446 "\
1447Return #t if the field is artificial." },
1448
1449 { "field-baseclass?", 1, 0, 0, gdbscm_field_baseclass_p,
1450 "\
1451Return #t if the field is a baseclass." },
1452
1453 END_FUNCTIONS
1454};
1455
1456void
1457gdbscm_initialize_types (void)
1458{
1459 type_smob_tag = gdbscm_make_smob_type (type_smob_name, sizeof (type_smob));
ed3ef339
DE
1460 scm_set_smob_free (type_smob_tag, tyscm_free_type_smob);
1461 scm_set_smob_print (type_smob_tag, tyscm_print_type_smob);
1462 scm_set_smob_equalp (type_smob_tag, tyscm_equal_p_type_smob);
1463
1464 field_smob_tag = gdbscm_make_smob_type (field_smob_name,
1465 sizeof (field_smob));
ed3ef339
DE
1466 scm_set_smob_print (field_smob_tag, tyscm_print_field_smob);
1467
1468 gdbscm_define_integer_constants (type_integer_constants, 1);
1469 gdbscm_define_functions (type_functions, 1);
1470
1471 /* This function is "private". */
1472 tyscm_next_field_x_proc
1473 = scm_c_define_gsubr ("%type-next-field!", 1, 0, 0,
1474 gdbscm_type_next_field_x);
1475 scm_set_procedure_property_x (tyscm_next_field_x_proc,
1476 gdbscm_documentation_symbol,
1477 gdbscm_scm_from_c_string ("\
1478Internal function to assist the type fields iterator."));
1479
1480 block_keyword = scm_from_latin1_keyword ("block");
1481
1482 /* Register an objfile "free" callback so we can properly copy types
1483 associated with the objfile when it's about to be deleted. */
1484 tyscm_objfile_data_key
1485 = register_objfile_data_with_cleanup (save_objfile_types, NULL);
1486
1487 global_types_map = gdbscm_create_eqable_gsmob_ptr_map (tyscm_hash_type_smob,
1488 tyscm_eq_type_smob);
1489}
This page took 0.165794 seconds and 4 git commands to generate.