1 /* go-fieldtrack.c -- structure field data analysis.
3 Copyright 2012 The Go Authors. All rights reserved.
4 Use of this source code is governed by a BSD-style
5 license that can be found in the LICENSE file. */
10 /* The compiler will track fields that have the tag go:"track". Any
11 function that refers to such a field will call this function with a
13 fieldtrack "package.type.field"
15 This function does not actually do anything. Instead, we gather
16 the field tracking information by looking for strings of that form
17 in the read-only data section. This is, of course, a horrible
18 hack, but it's good enough for now. We can improve it, e.g., by a
19 linker plugin, if this turns out to be useful. */
22 __go_fieldtrack (byte
*p
__attribute__ ((unused
)))
26 /* A runtime function to add all the tracked fields to a
29 extern const char _etext
[] __attribute__ ((weak
));
30 extern const char _edata
[] __attribute__ ((weak
));
32 // Following symbols do not exist on AIX
33 const char *__etext
= NULL
;
34 const char *__data_start
= NULL
;
35 const char *__edata
= NULL
;
36 const char *__bss_start
= NULL
;
38 extern const char __etext
[] __attribute__ ((weak
));
39 extern const char __data_start
[] __attribute__ ((weak
));
40 extern const char __edata
[] __attribute__ ((weak
));
41 extern const char __bss_start
[] __attribute__ ((weak
));
44 extern void *mapassign (const struct __go_map_type
*, void *hmap
,
46 __asm__ (GOSYM_PREFIX
"runtime.mapassign");
48 // The type descriptor for map[string] bool. */
49 extern const char __go_td_MN6_string__N4_bool
[] __attribute__ ((weak
));
51 void runtime_Fieldtrack (void *) __asm__ (GOSYM_PREFIX
"runtime.Fieldtrack");
54 runtime_Fieldtrack (void *m
)
61 if (__go_td_MN6_string__N4_bool
== NULL
)
80 prefix
= "fieldtrack ";
81 prefix_len
= __builtin_strlen (prefix
);
88 q1
= __builtin_memchr (p
+ prefix_len
, '"', pend
- (p
+ prefix_len
));
92 if (__builtin_memcmp (q1
- prefix_len
, prefix
, prefix_len
) != 0)
99 q2
= __builtin_memchr (q1
, '"', pend
- q1
);
103 if (__builtin_memchr (q1
, '\0', q2
- q1
) == NULL
)
108 s
.str
= (const byte
*) q1
;
110 p
= mapassign((const void*) __go_td_MN6_string__N4_bool
, m
, &s
);