Retro68/binutils/gprofng/src/collector_module.h
Wolfgang Thaller f485e125c4 binutils 2.39
2022-10-27 20:45:45 +02:00

235 lines
8.2 KiB
C

/* 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 */