annotate libgo/runtime/go-fieldtrack.c @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* go-fieldtrack.c -- structure field data analysis.
kono
parents:
diff changeset
2
kono
parents:
diff changeset
3 Copyright 2012 The Go Authors. All rights reserved.
kono
parents:
diff changeset
4 Use of this source code is governed by a BSD-style
kono
parents:
diff changeset
5 license that can be found in the LICENSE file. */
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 #include "runtime.h"
kono
parents:
diff changeset
8
kono
parents:
diff changeset
9 /* The compiler will track fields that have the tag go:"track". Any
kono
parents:
diff changeset
10 function that refers to such a field will call this function with a
kono
parents:
diff changeset
11 string
kono
parents:
diff changeset
12 fieldtrack "package.type.field"
kono
parents:
diff changeset
13
kono
parents:
diff changeset
14 This function does not actually do anything. Instead, we gather
kono
parents:
diff changeset
15 the field tracking information by looking for strings of that form
kono
parents:
diff changeset
16 in the read-only data section. This is, of course, a horrible
kono
parents:
diff changeset
17 hack, but it's good enough for now. We can improve it, e.g., by a
kono
parents:
diff changeset
18 linker plugin, if this turns out to be useful. */
kono
parents:
diff changeset
19
kono
parents:
diff changeset
20 void
kono
parents:
diff changeset
21 __go_fieldtrack (byte *p __attribute__ ((unused)))
kono
parents:
diff changeset
22 {
kono
parents:
diff changeset
23 }
kono
parents:
diff changeset
24
kono
parents:
diff changeset
25 /* A runtime function to add all the tracked fields to a
kono
parents:
diff changeset
26 map[string]bool. */
kono
parents:
diff changeset
27
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
28 extern void *mapassign (const struct maptype *, void *hmap, const void *key)
111
kono
parents:
diff changeset
29 __asm__ (GOSYM_PREFIX "runtime.mapassign");
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 // The type descriptor for map[string] bool. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
32 extern const char map_string_bool[] __attribute__ ((weak));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
33 extern const char map_string_bool[]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
34 __asm__ (GOSYM_PREFIX "type..map.6string.7bool");
111
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 void runtime_Fieldtrack (void *) __asm__ (GOSYM_PREFIX "runtime.Fieldtrack");
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 void
kono
parents:
diff changeset
39 runtime_Fieldtrack (void *m)
kono
parents:
diff changeset
40 {
kono
parents:
diff changeset
41 const char *p;
kono
parents:
diff changeset
42 const char *pend;
kono
parents:
diff changeset
43 const char *prefix;
kono
parents:
diff changeset
44 size_t prefix_len;
kono
parents:
diff changeset
45
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
46 if (map_string_bool == NULL)
111
kono
parents:
diff changeset
47 return;
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 p = __data_start;
kono
parents:
diff changeset
50 if (p == NULL)
kono
parents:
diff changeset
51 p = __etext;
kono
parents:
diff changeset
52 if (p == NULL)
kono
parents:
diff changeset
53 p = _etext;
kono
parents:
diff changeset
54 if (p == NULL)
kono
parents:
diff changeset
55 return;
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 pend = __edata;
kono
parents:
diff changeset
58 if (pend == NULL)
kono
parents:
diff changeset
59 pend = _edata;
kono
parents:
diff changeset
60 if (pend == NULL)
kono
parents:
diff changeset
61 pend = __bss_start;
kono
parents:
diff changeset
62 if (pend == NULL)
kono
parents:
diff changeset
63 return;
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 prefix = "fieldtrack ";
kono
parents:
diff changeset
66 prefix_len = __builtin_strlen (prefix);
kono
parents:
diff changeset
67
kono
parents:
diff changeset
68 while (p < pend)
kono
parents:
diff changeset
69 {
kono
parents:
diff changeset
70 const char *q1;
kono
parents:
diff changeset
71 const char *q2;
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 q1 = __builtin_memchr (p + prefix_len, '"', pend - (p + prefix_len));
kono
parents:
diff changeset
74 if (q1 == NULL)
kono
parents:
diff changeset
75 break;
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 if (__builtin_memcmp (q1 - prefix_len, prefix, prefix_len) != 0)
kono
parents:
diff changeset
78 {
kono
parents:
diff changeset
79 p = q1 + 1;
kono
parents:
diff changeset
80 continue;
kono
parents:
diff changeset
81 }
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 q1++;
kono
parents:
diff changeset
84 q2 = __builtin_memchr (q1, '"', pend - q1);
kono
parents:
diff changeset
85 if (q2 == NULL)
kono
parents:
diff changeset
86 break;
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88 if (__builtin_memchr (q1, '\0', q2 - q1) == NULL)
kono
parents:
diff changeset
89 {
kono
parents:
diff changeset
90 String s;
kono
parents:
diff changeset
91 void *p;
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 s.str = (const byte *) q1;
kono
parents:
diff changeset
94 s.len = q2 - q1;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
95 p = mapassign((const void*) map_string_bool, m, &s);
111
kono
parents:
diff changeset
96 *(_Bool*)p = 1;
kono
parents:
diff changeset
97 }
kono
parents:
diff changeset
98
kono
parents:
diff changeset
99 p = q2;
kono
parents:
diff changeset
100 }
kono
parents:
diff changeset
101 }