types defined in .conf files now take precedence over DWARF types
[platform/upstream/ltrace.git] / lens_default.c
1 /*
2  * This file is part of ltrace.
3  * Copyright (C) 2011,2012,2013 Petr Machata, Red Hat Inc.
4  * Copyright (C) 1998,2004,2007,2008,2009 Juan Cespedes
5  * Copyright (C) 2006 Ian Wienand
6  * Copyright (C) 2006 Steve Fink
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License as
10  * published by the Free Software Foundation; either version 2 of the
11  * License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
21  * 02110-1301 USA
22  */
23
24 #define _XOPEN_SOURCE /* For wcwidth from wchar.h.  */
25
26 #include <ctype.h>
27 #include <stdlib.h>
28 #include <assert.h>
29 #include <inttypes.h>
30 #include <stdarg.h>
31 #include <stdio.h>
32 #include <string.h>
33 #include <wchar.h>
34
35 #include "bits.h"
36 #include "expr.h"
37 #include "lens_default.h"
38 #include "options.h"
39 #include "output.h"
40 #include "type.h"
41 #include "value.h"
42 #include "zero.h"
43
44 #define READER(NAME, TYPE)                                              \
45         static int                                                      \
46         NAME(struct value *value, TYPE *ret, struct value_dict *arguments) \
47         {                                                               \
48                 union {                                                 \
49                         TYPE val;                                       \
50                         unsigned char buf[0];                           \
51                 } u;                                                    \
52                 if (value_extract_buf(value, u.buf, arguments) < 0)     \
53                         return -1;                                      \
54                 *ret = u.val;                                           \
55                 return 0;                                               \
56         }
57
58 READER(read_float, float)
59 READER(read_double, double)
60
61 #undef READER
62
63 #define HANDLE_WIDTH(BITS)                                              \
64         do {                                                            \
65                 long l;                                                 \
66                 if (value_extract_word(value, &l, arguments) < 0)       \
67                         return -1;                                      \
68                 int##BITS##_t i = l;                                    \
69                 uint64_t v = (uint64_t)(uint##BITS##_t)i;               \
70                 switch (format) {                                       \
71                 case INT_FMT_unknown:                                   \
72                         if (l < -10000 || l > 10000)                    \
73                 case INT_FMT_x:                                         \
74                         return fprintf(stream, "%#"PRIx64, v);          \
75                 case INT_FMT_i:                                         \
76                 case INT_FMT_default:                                   \
77                         return fprintf(stream, "%"PRIi##BITS, i);       \
78                 case INT_FMT_u:                                         \
79                         return fprintf(stream, "%"PRIu64, v);           \
80                 case INT_FMT_o:                                         \
81                         return fprintf(stream, "0%"PRIo64, v);          \
82                 }                                                       \
83         } while (0)
84
85 enum int_fmt_t
86 {
87         INT_FMT_i,
88         INT_FMT_u,
89         INT_FMT_o,
90         INT_FMT_x,
91         INT_FMT_unknown,
92         INT_FMT_default,
93 };
94
95 static int
96 format_integer(FILE *stream, struct value *value, enum int_fmt_t format,
97                struct value_dict *arguments)
98 {
99         switch (type_sizeof(value->inferior, value->type)) {
100
101         case 1: HANDLE_WIDTH(8);
102         case 2: HANDLE_WIDTH(16);
103         case 4: HANDLE_WIDTH(32);
104         case 8: HANDLE_WIDTH(64);
105
106         default:
107                 assert(!"unsupported integer width");
108                 abort();
109
110         case -1:
111                 return -1;
112         }
113 }
114
115 #undef HANDLE_WIDTH
116
117 static int
118 acc_fprintf(int *countp, FILE *stream, const char *format, ...)
119 {
120         va_list pa;
121         va_start(pa, format);
122         int i = account_output(countp, vfprintf(stream, format, pa));
123         va_end(pa);
124
125         return i;
126 }
127
128 static int
129 print_char(FILE *stream, int c)
130 {
131         const char *fmt;
132         switch (c) {
133         case -1:
134                 fmt = "EOF";
135                 break;
136         case 0:
137                 fmt = "\\0";
138                 break;
139         case '\a':
140                 fmt = "\\a";
141                 break;
142         case '\b':
143                 fmt = "\\b";
144                 break;
145         case '\t':
146                 fmt = "\\t";
147                 break;
148         case '\n':
149                 fmt = "\\n";
150                 break;
151         case '\v':
152                 fmt = "\\v";
153                 break;
154         case '\f':
155                 fmt = "\\f";
156                 break;
157         case '\r':
158                 fmt = "\\r";
159                 break;
160         case '\\':
161                 fmt = "\\\\";
162                 break;
163         default:
164                 if (isprint(c) || c == ' ')
165                         fmt = "%c";
166                 else
167                         fmt = "\\%03o";
168         }
169
170         return fprintf(stream, fmt, c);
171 }
172
173 static int
174 format_char(FILE *stream, struct value *value, struct value_dict *arguments)
175 {
176         long lc;
177         if (value_extract_word(value, &lc, arguments) < 0)
178                 return -1;
179         return print_char(stream, (int) lc);
180 }
181
182 static int
183 format_naked(FILE *stream, struct value *value,
184              struct value_dict *arguments,
185              int (*what)(FILE *, struct value *, struct value_dict *))
186 {
187         int written = 0;
188         if (acc_fprintf(&written, stream, "'") < 0
189             || account_output(&written,
190                               what(stream, value, arguments)) < 0
191             || acc_fprintf(&written, stream, "'") < 0)
192                 return -1;
193
194         return written;
195 }
196
197 static int
198 format_double(FILE *stream, double value, enum int_fmt_t format)
199 {
200         if (format == INT_FMT_x)
201                 return fprintf(stream, "%a", value);
202         else
203                 return fprintf(stream, "%f", value);
204 }
205
206 static int
207 format_floating(FILE *stream, struct value *value, struct value_dict *arguments,
208                 enum int_fmt_t format)
209 {
210         switch (value->type->type) {
211                 float f;
212                 double d;
213         case ARGTYPE_FLOAT:
214                 if (read_float(value, &f, arguments) < 0)
215                         return -1;
216                 return format_double(stream, f, format);
217         case ARGTYPE_DOUBLE:
218                 if (read_double(value, &d, arguments) < 0)
219                         return -1;
220                 return format_double(stream, d, format);
221         default:
222                 abort();
223         }
224 }
225
226 struct format_argument_data
227 {
228         struct value *value;
229         struct value_dict *arguments;
230 };
231
232 static int
233 format_argument_cb(FILE *stream, void *ptr)
234 {
235         struct format_argument_data *data = ptr;
236         return format_argument(stream, data->value, data->arguments);
237 }
238
239 static int
240 format_struct(FILE *stream, struct value *value, struct value_dict *arguments)
241 {
242         int written = 0;
243         if (acc_fprintf(&written, stream, "{ ") < 0)
244                 return -1;
245
246         int need_delim = 0;
247         size_t i;
248         for (i = 0; i < type_struct_size(value->type); ++i) {
249                 struct value element;
250                 if (value_init_element(&element, value, i) < 0)
251                         return -1;
252
253                 struct format_argument_data data = { &element, arguments };
254                 int o = delim_output(stream, &need_delim,
255                                      format_argument_cb, &data);
256                 value_destroy(&element);
257                 if (o < 0)
258                         return -1;
259
260                 written += o;
261         }
262         if (acc_fprintf(&written, stream, " }") < 0)
263                 return -1;
264         return written;
265 }
266
267 static const char null_message[] = "nil";
268 int
269 format_pointer(FILE *stream, struct value *value, struct value_dict *arguments)
270 {
271         if (value_is_zero(value, arguments))
272                 return fprintf(stream, null_message);
273
274         /* The following is for detecting recursion.  We keep track of
275          * the values that were already displayed.  Each time a
276          * pointer should be dereferenced, we compare its value to the
277          * value of each of the pointers dereferenced so far.  If one
278          * of them matches, instead of recursing, we just printf which
279          * superstructure this pointer recurses to.  */
280         static struct vect pointers = {};
281         if (pointers.elt_size == 0)
282                 VECT_INIT(&pointers, struct value *);
283
284         /* Trim number of expanded structures of the same type.  Even
285          * for non-recursive structure, we don't want to expand all of
286          * it if it's huge.  */
287         size_t i;
288         size_t len = vect_size(&pointers);
289         assert(value->type->type == ARGTYPE_POINTER);
290         struct arg_type_info *pointee = value->type->u.ptr_info.info;
291         if (pointee->type == ARGTYPE_STRUCT) {
292                 size_t depth = 0;
293                 for (i = 0; i < len; ++i) {
294                         struct value *old
295                                 = *VECT_ELEMENT(&pointers, struct value *, i);
296                         assert(old->type->type == ARGTYPE_POINTER);
297                         struct arg_type_info *old_pointee
298                                 = old->type->u.ptr_info.info;
299                         if (old_pointee == pointee)
300                                 depth++;
301                 }
302                 if (depth >= options.arraylen)
303                         return fprintf(stream, "...");
304         }
305
306         for (i = len; i-- > 0 ;) {
307                 struct value **old = VECT_ELEMENT(&pointers, struct value *, i);
308                 int rc = value_equal(value, *old, arguments);
309                 if (rc < 0)
310                         return -1;
311                 if (rc > 0) {
312                         size_t reclevel = len - i - 1;
313                         char buf[reclevel + 1];
314                         memset(buf, '^', sizeof buf);
315                         buf[reclevel] = 0;
316                         return fprintf(stream, "recurse%s", buf);
317                 }
318         }
319
320         /* OK, not a recursion.  Remember this value for tracking.  */
321         if (VECT_PUSHBACK(&pointers, &value) < 0)
322                 return -1;
323
324         struct value element;
325         int o;
326         if (value_init_deref(&element, value) < 0) {
327                 o = -1;
328                 goto done;
329         }
330         o = format_argument(stream, &element, arguments);
331         value_destroy(&element);
332
333 done:
334         VECT_POPBACK(&pointers, struct value *, NULL, NULL);
335         return o;
336 }
337
338 /*
339  * LENGTH is an expression whose evaluation will yield the actual
340  *    length of the array.
341  *
342  * MAXLEN is the actual maximum length that we care about
343  *
344  * BEFORE if LENGTH>MAXLEN, we display ellipsis.  We display it before
345  *    the closing parenthesis if BEFORE, otherwise after it.
346  *
347  * OPEN, CLOSE, DELIM are opening and closing parenthesis and element
348  *    delimiter.
349  */
350 static int
351 format_array(FILE *stream, struct value *value, struct value_dict *arguments,
352              struct expr_node *length, size_t maxlen, int before,
353              const char *open, const char *close, const char *delim)
354 {
355         /* We need "long" to be long enough to cover the whole address
356          * space.  */
357         (void)sizeof(char[1 - 2*(sizeof(long) < sizeof(void *))]);
358         long l;
359         if (expr_eval_word(length, value, arguments, &l) < 0)
360                 return -1;
361         size_t len = (size_t)l;
362
363         int written = 0;
364         if (acc_fprintf(&written, stream, "%s", open) < 0)
365                 return -1;
366
367         size_t i;
368         for (i = 0; i < len && i <= maxlen; ++i) {
369                 if (i == maxlen) {
370                         if (before && acc_fprintf(&written, stream, "...") < 0)
371                                 return -1;
372                         break;
373                 }
374
375                 if (i > 0 && acc_fprintf(&written, stream, "%s", delim) < 0)
376                         return -1;
377
378                 struct value element;
379                 if (value_init_element(&element, value, i) < 0)
380                         return -1;
381                 int o = format_argument(stream, &element, arguments);
382                 value_destroy(&element);
383                 if (o < 0)
384                         return -1;
385                 written += o;
386         }
387         if (acc_fprintf(&written, stream, "%s", close) < 0)
388                 return -1;
389         if (i == maxlen && !before && acc_fprintf(&written, stream, "...") < 0)
390                 return -1;
391
392         return written;
393 }
394
395 static int
396 toplevel_format_lens(struct lens *lens, FILE *stream,
397                      struct value *value, struct value_dict *arguments,
398                      enum int_fmt_t int_fmt)
399 {
400         switch (value->type->type) {
401         case ARGTYPE_VOID:
402                 return fprintf(stream, "<void>");
403
404         case ARGTYPE_SHORT:
405         case ARGTYPE_INT:
406         case ARGTYPE_LONG:
407                 return format_integer(stream, value, int_fmt, arguments);
408
409         case ARGTYPE_USHORT:
410         case ARGTYPE_UINT:
411         case ARGTYPE_ULONG:
412                 if (int_fmt == INT_FMT_i || int_fmt == INT_FMT_default)
413                         int_fmt = INT_FMT_u;
414                 return format_integer(stream, value, int_fmt, arguments);
415
416         case ARGTYPE_CHAR:
417                 if (int_fmt == INT_FMT_default)
418                         return format_naked(stream, value, arguments,
419                                             &format_char);
420                 return format_integer(stream, value, int_fmt, arguments);
421
422         case ARGTYPE_FLOAT:
423         case ARGTYPE_DOUBLE:
424                 return format_floating(stream, value, arguments, int_fmt);
425
426         case ARGTYPE_STRUCT:
427                 return format_struct(stream, value, arguments);
428
429         case ARGTYPE_POINTER:
430                 if (value_is_zero(value, arguments))
431                         return fprintf(stream, null_message);
432                 if (value->type->u.ptr_info.info->type != ARGTYPE_VOID)
433                         return format_pointer(stream, value, arguments);
434                 return format_integer(stream, value, INT_FMT_x, arguments);
435
436         case ARGTYPE_ARRAY:
437                 return format_array(stream, value, arguments,
438                                     value->type->u.array_info.length,
439                                     options.arraylen, 1, "[ ", " ]", ", ");
440         }
441         abort();
442 }
443
444 static int
445 default_lens_format_cb(struct lens *lens, FILE *stream,
446                        struct value *value, struct value_dict *arguments)
447 {
448         return toplevel_format_lens(lens, stream, value, arguments,
449                                     INT_FMT_default);
450 }
451
452 struct lens default_lens = {
453         .format_cb = default_lens_format_cb,
454 };
455
456
457 static int
458 blind_lens_format_cb(struct lens *lens, FILE *stream,
459                      struct value *value, struct value_dict *arguments)
460 {
461         return 0;
462 }
463
464 struct lens blind_lens = {
465         .format_cb = blind_lens_format_cb,
466 };
467
468
469 static int
470 octal_lens_format_cb(struct lens *lens, FILE *stream,
471                      struct value *value, struct value_dict *arguments)
472 {
473         return toplevel_format_lens(lens, stream, value, arguments, INT_FMT_o);
474 }
475
476 struct lens octal_lens = {
477         .format_cb = octal_lens_format_cb,
478 };
479
480
481 static int
482 hex_lens_format_cb(struct lens *lens, FILE *stream,
483                    struct value *value, struct value_dict *arguments)
484 {
485         return toplevel_format_lens(lens, stream, value, arguments, INT_FMT_x);
486 }
487
488 struct lens hex_lens = {
489         .format_cb = hex_lens_format_cb,
490 };
491
492
493 static int
494 dec_lens_format_cb(struct lens *lens, FILE *stream,
495                    struct value *value, struct value_dict *arguments)
496 {
497         return toplevel_format_lens(lens, stream, value, arguments, INT_FMT_u);
498 }
499
500 struct lens dec_lens = {
501         .format_cb = dec_lens_format_cb,
502 };
503
504
505 static int
506 guess_lens_format_cb(struct lens *lens, FILE *stream,
507                      struct value *value, struct value_dict *arguments)
508 {
509         return toplevel_format_lens(lens, stream, value, arguments,
510                                     INT_FMT_unknown);
511 }
512
513 struct lens guess_lens = {
514         .format_cb = guess_lens_format_cb,
515 };
516
517
518 static int
519 bool_lens_format_cb(struct lens *lens, FILE *stream,
520                     struct value *value, struct value_dict *arguments)
521 {
522         switch (value->type->type) {
523         case ARGTYPE_VOID:
524         case ARGTYPE_FLOAT:
525         case ARGTYPE_DOUBLE:
526         case ARGTYPE_STRUCT:
527         case ARGTYPE_POINTER:
528         case ARGTYPE_ARRAY:
529                 return toplevel_format_lens(lens, stream, value,
530                                             arguments, INT_FMT_default);
531
532                 int zero;
533         case ARGTYPE_SHORT:
534         case ARGTYPE_INT:
535         case ARGTYPE_LONG:
536         case ARGTYPE_USHORT:
537         case ARGTYPE_UINT:
538         case ARGTYPE_ULONG:
539         case ARGTYPE_CHAR:
540                 if ((zero = value_is_zero(value, arguments)) < 0)
541                         return -1;
542                 if (zero)
543                         return fprintf(stream, "false");
544                 else
545                         return fprintf(stream, "true");
546         }
547         abort();
548 }
549
550 struct lens bool_lens = {
551         .format_cb = bool_lens_format_cb,
552 };
553
554 static int
555 redispatch_as_array(struct lens *lens, FILE *stream,
556                     struct value *value, struct value_dict *arguments,
557                     int (*cb)(struct lens *, FILE *,
558                               struct value *, struct value_dict *))
559 {
560         struct arg_type_info info[2];
561         type_init_array(&info[1], value->type->u.ptr_info.info, 0,
562                         expr_node_zero(), 0);
563         type_init_pointer(&info[0], &info[1], 0);
564         info->lens = lens;
565         info->own_lens = 0;
566         struct value tmp;
567         if (value_clone(&tmp, value) < 0)
568                 return -1;
569         value_set_type(&tmp, info, 0);
570         int ret = cb(lens, stream, &tmp, arguments);
571         type_destroy(&info[0]);
572         type_destroy(&info[1]);
573         value_destroy(&tmp);
574         return ret;
575 }
576
577 static int
578 format_wchar(FILE *stream, struct value *value, struct value_dict *arguments)
579 {
580         long l;
581         if (value_extract_word(value, &l, arguments) < 0)
582                 return -1;
583         wchar_t wc = (wchar_t) l;
584         char buf[MB_CUR_MAX + 1];
585
586         int c = wctomb(buf, wc);
587         if (c < 0)
588                 return -1;
589         if (c == 1)
590                 return print_char(stream, buf[0]);
591
592         buf[c] = 0;
593         if (fprintf(stream, "%s", buf) < 0)
594                 return -1;
595
596         c = wcwidth(wc);
597         return c >= 0 ? c : 0;
598 }
599
600 static int
601 string_lens_format_cb(struct lens *lens, FILE *stream,
602                       struct value *value, struct value_dict *arguments)
603 {
604         switch (value->type->type) {
605         case ARGTYPE_POINTER:
606                 /* This should really be written as either "string",
607                  * or, if lens, then string(array(char, zero)*).  But
608                  * I suspect people are so used to the char * C idiom,
609                  * that string(char *) might actually turn up.  So
610                  * let's just support it.  */
611                 switch ((int) value->type->u.ptr_info.info->type)
612                 case ARGTYPE_CHAR:
613                 case ARGTYPE_SHORT:
614                 case ARGTYPE_USHORT:
615                 case ARGTYPE_INT:
616                 case ARGTYPE_UINT:
617                 case ARGTYPE_LONG:
618                 case ARGTYPE_ULONG:
619                         return redispatch_as_array(lens, stream, value,
620                                                    arguments,
621                                                    &string_lens_format_cb);
622
623                 /* Otherwise dispatch to whatever the default for the
624                  * pointee is--most likely this will again be us.  */
625                 /* Fall through.  */
626         case ARGTYPE_VOID:
627         case ARGTYPE_FLOAT:
628         case ARGTYPE_DOUBLE:
629         case ARGTYPE_STRUCT:
630                 return toplevel_format_lens(lens, stream, value,
631                                             arguments, INT_FMT_default);
632
633         case ARGTYPE_SHORT:
634         case ARGTYPE_INT:
635         case ARGTYPE_LONG:
636         case ARGTYPE_USHORT:
637         case ARGTYPE_UINT:
638         case ARGTYPE_ULONG:
639                 if (value->parent != NULL && value->type->lens == NULL)
640                         return format_wchar(stream, value, arguments);
641                 else
642                         return format_naked(stream, value, arguments,
643                                             &format_wchar);
644
645         case ARGTYPE_CHAR:
646                 return format_char(stream, value, arguments);
647
648         case ARGTYPE_ARRAY:
649                 return format_array(stream, value, arguments,
650                                     value->type->u.array_info.length,
651                                     options.strlen, 0, "\"", "\"", "");
652         }
653         abort();
654 }
655
656 struct lens string_lens = {
657         .format_cb = string_lens_format_cb,
658 };
659
660 static int
661 out_bits(FILE *stream, size_t low, size_t high)
662 {
663         if (low == high)
664                 return fprintf(stream, "%zd", low);
665         else
666                 return fprintf(stream, "%zd-%zd", low, high);
667 }
668
669 static int
670 bitvect_lens_format_cb(struct lens *lens, FILE *stream,
671                        struct value *value, struct value_dict *arguments)
672 {
673         unsigned char *data = value_get_data(value, arguments);
674         if (data == NULL)
675                 return -1;
676         size_t sz = type_sizeof(value->inferior, value->type);
677         if (sz == (size_t)-1)
678                 return -1;
679
680         size_t i;
681         unsigned char buf[sz];
682         switch ((int)value->type->type) {
683                 union bitvect_integral_64
684                 {
685                         uint8_t u8;
686                         uint16_t u16;
687                         uint32_t u32;
688                         uint64_t u64;
689                         unsigned char buf[0];
690                 } bv;
691
692         case ARGTYPE_POINTER:
693                 return format_pointer(stream, value, arguments);
694
695         case ARGTYPE_STRUCT:
696         case ARGTYPE_ARRAY:
697                 break;
698
699         default:
700                 assert(sz <= sizeof(bv));
701                 memmove(bv.buf, data, sz);
702
703                 if (sz == 1)
704                         bv.u64 = bv.u8;
705                 else if (sz == 2)
706                         bv.u64 = bv.u16;
707                 else if (sz == 4)
708                         bv.u64 = bv.u32;
709
710                 for (i = 0; i < sz; ++i) {
711                         buf[i] = bv.u64 & 0xff;
712                         bv.u64 >>= 8;
713                 }
714                 data = buf;
715         }
716
717         size_t bits = 0;
718         for (i = 0; i < sz; ++i)
719                 bits += bitcount(data[i]);
720
721         /* If there's more 1's than 0's, show inverse.  */
722         unsigned neg = bits > sz * 4 ? 0xff : 0x00;
723
724         int o = 0;
725         if (acc_fprintf(&o, stream, "%s<", &"~"[neg == 0x00]) < 0)
726                 return -1;
727
728         size_t bitno = 0;
729         ssize_t low = -1;
730         for (i = 0; i < sz; ++i) {
731                 unsigned char m;
732                 unsigned char d = data[i] ^ neg;
733                 for (m = 0x01; m != 0; m <<= 1) {
734                         int bit = !!(m & d);
735                         if (low < 0) {
736                                 if (bit) {
737                                         if (low == -2
738                                             && acc_fprintf(&o, stream, ",") < 0)
739                                                 return -1;
740                                         low = bitno;
741                                 }
742                         } else if (!bit) {
743                                 if (account_output(&o, out_bits(stream, low,
744                                                                 bitno-1)) < 0)
745                                         return -1;
746                                 low = -2;
747                         }
748                         bitno++;
749                 }
750         }
751         if (low >= 0 && account_output(&o, out_bits(stream, low, bitno-1)) < 0)
752                 return -1;
753
754         if (fputc('>', stream) < 0)
755                 return -1;
756         o += 1;
757
758         return o;
759 }
760
761 struct lens bitvect_lens = {
762         .format_cb = bitvect_lens_format_cb,
763 };