1 /* Copyright (C) 2021 Free Software Foundation, Inc.
4 This file is part of GNU Binutils.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
21 #ifndef _COLLECTOR_MODULE_H
22 #define _COLLECTOR_MODULE_H
24 #include <sys/types.h>
36 #define COLLECTOR_MODULE_ERR ((CollectorModule)-1)
38 /* ------- libc interface ----------------- */
39 /* the fields in this structure are in alphabetical order.
40 * If you add any, please put it in the right place */
41 typedef struct CollectorUtilFuncs
44 int (*atoi)(const char *nptr);
45 void *(*calloc)(size_t nelem, size_t elsize);
46 int (*clearenv)(void);
49 int (*execv)(const char *path, char *const argv[]);
50 void (*exit)(int status);
51 int (*fclose)(FILE *stream);
52 int (*fcntl)(int fd, int cmd, ...);
53 char *(*fgets)(char *s, int n, FILE *stream);
54 FILE *(*fopen)(const char *filename, const char *mode);
56 int (*fprintf)(FILE *stream, const char *format, ...);
57 void (*free)(void *ptr);
58 int (*fstat)(int fd, struct stat *buf);
59 int (*getcontext)(ucontext_t *ucp);
61 char *(*getcwd)(char *buf, size_t size);
62 char *(*getenv)(const char *name);
63 struct tm *(*gmtime_r)(const time_t *clock, struct tm *res);
64 int (*ioctl)(int d, int request, ...);
65 off_t (*lseek)(int fd, off_t offset, int whence);
66 void *(*malloc)(size_t size);
67 void *(*memset)(void *s1, int c, size_t n);
69 time_t (*mktime)(struct tm *timeptr);
70 void *(*mmap)(void *, size_t, int, int, int, off_t);
73 int (*open)(const char *, int, ...);
74 int (*open_bare)(const char *, int, ...);
76 int (*pclose)(FILE *stream);
77 FILE *(*popen)(const char *command, const char *mode);
78 int (*putenv)(char *string);
80 ssize_t (*pwrite64_)();
82 int (*setenv)(const char *name, const char *value, int overwrite);
83 int (*sigfillset)(sigset_t *set);
84 int (*sigprocmask)(int how, const sigset_t *set, sigset_t *oldset);
85 int (*snprintf)(char *str, size_t size, const char *format, ...);
86 int (*stack_getbounds)();
87 char *(*strchr)(const char *name, int c);
88 int (*strcmp)(const char *s1, const char *s2);
89 int (*strcpy)(const char *s1, const char *s2);
90 char *(*libc_strdup)(const char *s1); // Don't use "strdup" because it is a macro in gcc
91 char *(*strerror)(int errnum);
92 int (*strerror_r)(int errnum, char *strerrbuf, size_t buflen);
93 size_t (*strlcat)(char *dest, const char *src, size_t dstsize);
94 size_t (*strlcpy)(char *dest, const char *src, size_t dstsize);
95 size_t (*strlen)(const char *string);
96 int (*strncmp)(const char *s1, const char *s2, size_t n);
97 size_t (*strncpy)(char *dst, const char *src, size_t dstsize);
98 size_t (*strspn)(const char *s1, const char *s2);
99 char *(*strrchr)(const char *name, int c);
100 char *(*strstr)(const char *s1, const char *s2);
101 long int (*strtol)(const char *nptr, char **endptr, int base);
102 long long int (*strtoll)(const char *nptr, char **endptr, int base);
103 unsigned long int (*strtoul)(const char *nptr, char **endptr, int base);
104 unsigned long long int (*strtoull)(const char *nptr, char **endptr, int base);
105 int (*symlink)(const char *s1, const char *s2);
106 int (*syscall)(int number, ...);
107 long (*sysconf)(int name);
108 long (*sysinfo)(int command, char *buf, long count);
109 time_t (*time)(time_t *tloc);
110 int (*unsetenv)(const char *name);
111 int (*vsnprintf)(char *str, size_t size, const char *format, va_list ap);
112 pid_t (*waitpid)(pid_t pid, int *stat_loc, int options);
116 } CollectorUtilFuncs;
118 extern CollectorUtilFuncs __collector_util_funcs;
119 extern int __collector_dlsym_guard;
121 #define CALL_UTIL(x) __collector_util_funcs.x
123 /* The following constants define the meaning of the "void *arg"
124 * argument of getFrameInfo().
126 /* arg is a pointer to ucontext_t, walk the stack described by it */
127 #define FRINFO_FROM_UC 1
128 /* walk the current stack starting from the frame containing arg */
129 #define FRINFO_FROM_STACK 2
130 /* walk the current stack starting from the caller of the frame containing arg */
131 #define FRINFO_FROM_STACK_ARG 3
132 /* arg is a pc, process a stack containing just that pc */
133 #define FRINFO_FROM_PC 4
134 /* arg is of type CM_Array describing a stack image */
135 #define FRINFO_FROM_ARRAY 5
136 #define FRINFO_NO_OMP_INFO 0x80000000
137 #define FRINFO_NO_WALK 0x40000000
139 typedef struct CM_Array
141 unsigned int length; /* in bytes, not including length */
145 // Interface with libcollector.so:
149 SP_ORIGIN_LIBCOL_INIT = 0,
150 SP_ORIGIN_DBX_ATTACH = 1,
151 SP_ORIGIN_GENEXP = 2,
152 SP_ORIGIN_KERNEL = 3,
153 SP_ORIGIN_DTRACE = 4,
154 SP_ORIGIN_COLLECT = 5
158 struct Common_packet;
160 struct ModuleInterface;
162 typedef long long HiResTime;
163 typedef int CollectorModule;
164 typedef unsigned long long FrameInfo;
165 typedef struct CollectorInterface
167 /* General services */
168 CollectorModule (*registerModule)(struct ModuleInterface*);
169 const char *(*getParams)();
170 const char *(*getExpDir)();
171 int (*writeLog)(char *format, ...);
172 FrameInfo (*getFrameInfo)(CollectorModule modl, HiResTime ts, int mode, void *arg);
173 FrameInfo (*getUID)(CM_Array *arg);
174 FrameInfo (*getUID2)(CM_Array *arg, FrameInfo uid);
175 int (*getStackTrace)(void *buf, int size, void *bptr, void *eptr, void *arg);
176 int (*writeMetaData)(CollectorModule modl, char *format, ...);
178 /* writeDataRecord ensures that the header is filled in, and then calls writeDataPacket */
179 int (*writeDataRecord)(CollectorModule modl, struct Common_packet *pckt);
180 int (*writeDataPacket)(CollectorModule modl, struct CM_Packet *pckt);
181 void (*write_sample)(char *name);
182 void (*get_progspec)(char *retstr, int tmp_sz, char *namestr, int name_sz);
183 int (*open_experiment)(const char *exp, const char *params, sp_origin_t origin);
184 HiResTime (*getHiResTime)();
186 /* Dynamic memory allocation service */
187 struct Heap *(*newHeap)();
188 void (*deleteHeap)(struct Heap *heap);
189 void *(*allocCSize)(struct Heap *heap, unsigned sz, int log);
190 void (*freeCSize)(struct Heap *heap, void *ptr, unsigned sz);
191 void *(*allocVSize)(struct Heap *heap, unsigned sz);
192 void *(*reallocVSize)(struct Heap *heap, void *ptr, unsigned newsz);
194 /* Thread specific data service */
195 unsigned (*createKey)(size_t sz, void (*init)(void*), void (*fini)(void*));
196 void *(*getKey)(unsigned key);
198 /* Debugging services */
199 void (*writeDebugInfo)(int, int, char *, ...) __attribute__ ((format (printf, 3, 4)));
200 } CollectorInterface;
202 typedef struct ModuleInterface
205 int (*initInterface)(CollectorInterface*);
206 int (*openExperiment)(const char *);
207 int (*startDataCollection)();
208 int (*stopDataCollection)();
209 int (*closeExperiment)();
210 int (*detachExperiment)(); /* called from fork-child before openExperiment() */
213 typedef CollectorModule (*RegModuleFunc)(ModuleInterface*);
214 typedef void (*ModuleInitFunc)(CollectorInterface*);
220 CollectorModule __collector_register_module (ModuleInterface *modint);
225 #ifdef __has_attribute
226 # if __has_attribute (__symver__)
227 # define SYMVER_ATTRIBUTE(sym, symver) \
228 __attribute__ ((__symver__ (#symver)))
231 #ifndef SYMVER_ATTRIBUTE
232 # define SYMVER_ATTRIBUTE(sym, symver) \
233 __asm__(".symver " #sym "," #symver);
236 #endif /* _COLLECTOR_MODULE_H */