]> Git Repo - binutils.git/blob - gprofng/src/collector_module.h
Automatic date update in version.in
[binutils.git] / gprofng / src / collector_module.h
1 /* Copyright (C) 2021 Free Software Foundation, Inc.
2    Contributed by Oracle.
3
4    This file is part of GNU Binutils.
5
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)
9    any later version.
10
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.
15
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.  */
20
21 #ifndef _COLLECTOR_MODULE_H
22 #define _COLLECTOR_MODULE_H
23
24 #include <sys/types.h>
25 #include <stdarg.h>
26 #include <stdio.h>
27 #include <unistd.h>
28 #include <ucontext.h>
29 #include <dirent.h>
30
31 #include "gp-defs.h"
32
33 struct stat;
34 struct tm;
35
36 #define COLLECTOR_MODULE_ERR    ((CollectorModule)-1)
37
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
42 {
43   int (*access)();
44   int (*atoi)(const char *nptr);
45   void *(*calloc)(size_t nelem, size_t elsize);
46   int (*clearenv)(void);
47   int (*close)(int);
48   int (*closedir)();
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);
55   pid_t (*vfork)();
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);
60   int (*getcpuid)();
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);
68   int (*mkdir)();
69   time_t (*mktime)(struct tm *timeptr);
70   void *(*mmap)(void *, size_t, int, int, int, off_t);
71   void *(*mmap64_)();
72   int (*munmap)();
73   int (*open)(const char *, int, ...);
74   int (*open_bare)(const char *, int, ...);
75   DIR *(*opendir)();
76   int (*pclose)(FILE *stream);
77   FILE *(*popen)(const char *command, const char *mode);
78   int (*putenv)(char *string);
79   ssize_t (*pwrite)();
80   ssize_t (*pwrite64_)();
81   ssize_t (*read)();
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);
113   ssize_t (*write)();
114   double (*atof)();
115   void *n_a;
116 } CollectorUtilFuncs;
117
118 extern CollectorUtilFuncs __collector_util_funcs;
119 extern int __collector_dlsym_guard;
120
121 #define CALL_UTIL(x) __collector_util_funcs.x
122
123 /* The following constants define the meaning of the "void *arg"
124  * argument of getFrameInfo().
125  */
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
138
139 typedef struct CM_Array
140 {
141   unsigned int length;          /* in bytes, not including length */
142   void *bytes;
143 } CM_Array;
144
145 // Interface with libcollector.so:
146 typedef enum
147 {
148   SP_ORIGIN_FORK        = -1,
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
155 } sp_origin_t;
156
157 struct Heap;
158 struct Common_packet;
159 struct CM_Packet;
160 struct ModuleInterface;
161
162 typedef long long HiResTime;
163 typedef int CollectorModule;
164 typedef unsigned long long FrameInfo;
165 typedef struct CollectorInterface
166 {
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, ...);
177
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)();
185
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);
193
194   /* Thread specific data service */
195   unsigned (*createKey)(size_t sz, void (*init)(void*), void (*fini)(void*));
196   void *(*getKey)(unsigned key);
197
198   /* Debugging services */
199   void (*writeDebugInfo)(int, int, char *, ...) __attribute__ ((format (printf, 3, 4)));
200 } CollectorInterface;
201
202 typedef struct ModuleInterface
203 {
204   char *description;
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() */
211 } ModuleInterface;
212
213 typedef CollectorModule (*RegModuleFunc)(ModuleInterface*);
214 typedef void (*ModuleInitFunc)(CollectorInterface*);
215
216 #ifdef __cplusplus
217 extern "C"
218 {
219 #endif
220   CollectorModule __collector_register_module (ModuleInterface *modint);
221 #ifdef __cplusplus
222 }
223 #endif
224
225 #ifdef __has_attribute
226 # if __has_attribute (__symver__)
227 #  define SYMVER_ATTRIBUTE(sym, symver) \
228     __attribute__ ((__symver__ (#symver)))
229 # endif
230 #endif
231 #ifndef SYMVER_ATTRIBUTE
232 # define SYMVER_ATTRIBUTE(sym, symver) \
233   __asm__(".symver " #sym "," #symver);
234 #endif
235
236 #endif /* _COLLECTOR_MODULE_H */
This page took 0.037235 seconds and 4 git commands to generate.