diff options
Diffstat (limited to 'gprofng/src/collector_module.h')
-rw-r--r-- | gprofng/src/collector_module.h | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/gprofng/src/collector_module.h b/gprofng/src/collector_module.h new file mode 100644 index 00000000000..f608dab5831 --- /dev/null +++ b/gprofng/src/collector_module.h @@ -0,0 +1,234 @@ +/* Copyright (C) 2021 Free Software Foundation, Inc. + Contributed by Oracle. + + This file is part of GNU Binutils. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _COLLECTOR_MODULE_H +#define _COLLECTOR_MODULE_H + +#include <sys/types.h> +#include <stdarg.h> +#include <stdio.h> +#include <unistd.h> +#include <dirent.h> + +#include "gp-defs.h" + +struct stat; +struct tm; + +#define COLLECTOR_MODULE_ERR ((CollectorModule)-1) + +/* ------- libc interface ----------------- */ +/* the fields in this structure are in alphabetical order. + * If you add any, please put it in the right place */ +typedef struct CollectorUtilFuncs +{ + int (*access)(); + int (*atoi)(const char *nptr); + void *(*calloc)(size_t nelem, size_t elsize); + int (*clearenv)(void); + int (*close)(int); + int (*closedir)(); + int (*execv)(const char *path, char *const argv[]); + void (*exit)(int status); + int (*fclose)(FILE *stream); + int (*fcntl)(int fd, int cmd, ...); + char *(*fgets)(char *s, int n, FILE *stream); + FILE *(*fopen)(const char *filename, const char *mode); + pid_t (*vfork)(); + int (*fprintf)(FILE *stream, const char *format, ...); + void (*free)(void *ptr); + int (*fstat)(int fd, struct stat *buf); + int (*getcpuid)(); + char *(*getcwd)(char *buf, size_t size); + char *(*getenv)(const char *name); + struct tm *(*gmtime_r)(const time_t *clock, struct tm *res); + int (*ioctl)(int d, int request, ...); + off_t (*lseek)(int fd, off_t offset, int whence); + void *(*malloc)(size_t size); + void *(*memset)(void *s1, int c, size_t n); + int (*mkdir)(); + time_t (*mktime)(struct tm *timeptr); + void *(*mmap)(void *, size_t, int, int, int, off_t); + void *(*mmap64)(); + int (*munmap)(); + int (*open)(const char *, int, ...); + int (*open_bare)(const char *, int, ...); + DIR *(*opendir)(); + int (*pclose)(FILE *stream); + FILE *(*popen)(const char *command, const char *mode); + int (*putenv)(char *string); + ssize_t (*pwrite)(); + ssize_t (*pwrite64)(); + ssize_t (*read)(); + int (*setenv)(const char *name, const char *value, int overwrite); + int (*sigfillset)(sigset_t *set); + int (*sigprocmask)(int how, const sigset_t *set, sigset_t *oldset); + int (*snprintf)(char *str, size_t size, const char *format, ...); + int (*stack_getbounds)(); + char *(*strchr)(const char *name, int c); + int (*strcmp)(const char *s1, const char *s2); + int (*strcpy)(const char *s1, const char *s2); + char *(*libc_strdup)(const char *s1); // Don't use "strdup" because it is a macro in gcc + char *(*strerror)(int errnum); + int (*strerror_r)(int errnum, char *strerrbuf, size_t buflen); + size_t (*strlcat)(char *dest, const char *src, size_t dstsize); + size_t (*strlcpy)(char *dest, const char *src, size_t dstsize); + size_t (*strlen)(const char *string); + int (*strncmp)(const char *s1, const char *s2, size_t n); + size_t (*strncpy)(char *dst, const char *src, size_t dstsize); + size_t (*strspn)(const char *s1, const char *s2); + char *(*strrchr)(const char *name, int c); + char *(*strstr)(const char *s1, const char *s2); + long int (*strtol)(const char *nptr, char **endptr, int base); + long long int (*strtoll)(const char *nptr, char **endptr, int base); + unsigned long int (*strtoul)(const char *nptr, char **endptr, int base); + unsigned long long int (*strtoull)(const char *nptr, char **endptr, int base); + int (*symlink)(const char *s1, const char *s2); + int (*syscall)(int number, ...); + long (*sysconf)(int name); + long (*sysinfo)(int command, char *buf, long count); + time_t (*time)(time_t *tloc); + int (*unsetenv)(const char *name); + int (*vsnprintf)(char *str, size_t size, const char *format, va_list ap); + pid_t (*waitpid)(pid_t pid, int *stat_loc, int options); + ssize_t (*write)(); + double (*atof)(); + void *n_a; +} CollectorUtilFuncs; + +extern CollectorUtilFuncs __collector_util_funcs; +extern int __collector_dlsym_guard; + +#define CALL_UTIL(x) __collector_util_funcs.x + +/* The following constants define the meaning of the "void *arg" + * argument of getFrameInfo(). + */ +/* arg is a pointer to ucontext_t, walk the stack described by it */ +#define FRINFO_FROM_UC 1 +/* walk the current stack starting from the frame containing arg */ +#define FRINFO_FROM_STACK 2 +/* walk the current stack starting from the caller of the frame containing arg */ +#define FRINFO_FROM_STACK_ARG 3 +/* arg is a pc, process a stack containing just that pc */ +#define FRINFO_FROM_PC 4 +/* arg is of type CM_Array describing a stack image */ +#define FRINFO_FROM_ARRAY 5 +#define FRINFO_NO_OMP_INFO 0x80000000 +#define FRINFO_NO_WALK 0x40000000 + +typedef struct CM_Array +{ + unsigned int length; /* in bytes, not including length */ + void *bytes; +} CM_Array; + +// Interface with libcollector.so: +typedef enum +{ + SP_ORIGIN_FORK = -1, + SP_ORIGIN_LIBCOL_INIT = 0, + SP_ORIGIN_DBX_ATTACH = 1, + SP_ORIGIN_GENEXP = 2, + SP_ORIGIN_KERNEL = 3, + SP_ORIGIN_DTRACE = 4, + SP_ORIGIN_COLLECT = 5 +} sp_origin_t; + +struct Heap; +struct Common_packet; +struct CM_Packet; +struct ModuleInterface; + +typedef long long HiResTime; +typedef int CollectorModule; +typedef unsigned long long FrameInfo; +typedef struct CollectorInterface +{ + /* General services */ + CollectorModule (*registerModule)(struct ModuleInterface*); + const char *(*getParams)(); + const char *(*getExpDir)(); + int (*writeLog)(char *format, ...); + FrameInfo (*getFrameInfo)(CollectorModule modl, HiResTime ts, int mode, void *arg); + FrameInfo (*getUID)(CM_Array *arg); + FrameInfo (*getUID2)(CM_Array *arg, FrameInfo uid); + int (*getStackTrace)(void *buf, int size, void *bptr, void *eptr, void *arg); + int (*writeMetaData)(CollectorModule modl, char *format, ...); + + /* writeDataRecord ensures that the header is filled in, and then calls writeDataPacket */ + int (*writeDataRecord)(CollectorModule modl, struct Common_packet *pckt); + int (*writeDataPacket)(CollectorModule modl, struct CM_Packet *pckt); + void (*write_sample)(char *name); + void (*get_progspec)(char *retstr, int tmp_sz, char *namestr, int name_sz); + int (*open_experiment)(const char *exp, const char *params, sp_origin_t origin); + HiResTime (*getHiResTime)(); + + /* Dynamic memory allocation service */ + struct Heap *(*newHeap)(); + void (*deleteHeap)(struct Heap *heap); + void *(*allocCSize)(struct Heap *heap, unsigned sz, int log); + void (*freeCSize)(struct Heap *heap, void *ptr, unsigned sz); + void *(*allocVSize)(struct Heap *heap, unsigned sz); + void *(*reallocVSize)(struct Heap *heap, void *ptr, unsigned newsz); + + /* Thread specific data service */ + unsigned (*createKey)(size_t sz, void (*init)(void*), void (*fini)(void*)); + void *(*getKey)(unsigned key); + + /* Debugging services */ + void (*writeDebugInfo)(int, int, char *, ...) __attribute__ ((format (printf, 3, 4))); +} CollectorInterface; + +typedef struct ModuleInterface +{ + char *description; + int (*initInterface)(CollectorInterface*); + int (*openExperiment)(const char *); + int (*startDataCollection)(); + int (*stopDataCollection)(); + int (*closeExperiment)(); + int (*detachExperiment)(); /* called from fork-child before openExperiment() */ +} ModuleInterface; + +typedef CollectorModule (*RegModuleFunc)(ModuleInterface*); +typedef void (*ModuleInitFunc)(CollectorInterface*); + +#ifdef __cplusplus +extern "C" +{ +#endif + CollectorModule __collector_register_module (ModuleInterface *modint); +#ifdef __cplusplus +} +#endif + +#ifdef __has_attribute +# if __has_attribute (__symver__) +# define SYMVER_ATTRIBUTE(sym, symver) \ + __attribute__ ((__symver__ (#symver))) +# endif +#endif +#ifndef SYMVER_ATTRIBUTE +# define SYMVER_ATTRIBUTE(sym, symver) \ + __asm__(".symver " #sym "," #symver); +#endif + +#endif /* _COLLECTOR_MODULE_H */ |