summaryrefslogtreecommitdiff
path: root/gprofng/src/collector_module.h
diff options
context:
space:
mode:
Diffstat (limited to 'gprofng/src/collector_module.h')
-rw-r--r--gprofng/src/collector_module.h234
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 */