Added -fvisibility=hidden to Linux builds, with export macros added in appropriate...
[dyninst.git] / dyninstAPI_RT / h / dyninstRTExport.h
1 /*
2  * See the dyninst/COPYRIGHT file for copyright information.
3  * 
4  * We provide the Paradyn Tools (below described as "Paradyn")
5  * on an AS IS basis, and do not warrant its validity or performance.
6  * We reserve the right to update, modify, or discontinue this
7  * software at any time.  We shall have no obligation to supply such
8  * updates or modifications or any other form of support to you.
9  * 
10  * By your use of Paradyn, you understand and agree that we (or any
11  * other person or entity with proprietary rights in Paradyn) are
12  * under no obligation to provide either maintenance services,
13  * update services, notices of latent defects, or correction of
14  * defects for Paradyn.
15  * 
16  * This library is free software; you can redistribute it and/or
17  * modify it under the terms of the GNU Lesser General Public
18  * License as published by the Free Software Foundation; either
19  * version 2.1 of the License, or (at your option) any later version.
20  * 
21  * This library is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
24  * Lesser General Public License for more details.
25  * 
26  * You should have received a copy of the GNU Lesser General Public
27  * License along with this library; if not, write to the Free Software
28  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29  */
30 #ifndef _DYNINST_RT_EXPORT_H_
31 #define _DYNINST_RT_EXPORT_H_
32 #ifndef ASSEMBLER
33   /*  This file contains function prototypes that may be useful for 
34       dyninst users to directly have access to from their own runtime
35       libraries.
36   */
37
38 #if !defined(DLLEXPORT)
39 #if defined (_MSC_VER)
40 /* If we're on Windows, we need to explicetely export these functions: */
41 #define DLLEXPORT __declspec(dllexport) 
42 #else
43 #define DLLEXPORT  __attribute__ ((visibility ("default")))
44 #endif
45 #endif
46   /*
47     DYNINSTuserMessage(void *msg, unsigned int msg_size) may be used 
48     in conjunction with the dyninstAPI method 
49     BPatch_process::registerUserMessageCallback(), to implement a generic
50     user-defined, asynchronous communications protocol from the mutatee
51     (via this runtime library) to the mutator.
52
53     Calls to DYNINSTuserMessage() will result in <msg> (of <msg_size> bytes)
54     being sent to the mutator, and then passed to the callback function
55     provided by the API user via registerUserMessageCallback().
56
57     Returns zero on success, nonzero on failure.
58   */
59 DLLEXPORT int DYNINSTuserMessage(void *msg, unsigned int msg_size);
60
61 /* Returns the number of threads DYNINST currently knows about.  (Which
62    may differ at certain times from the number of threads actually present.) */
63 DLLEXPORT int DYNINSTthreadCount();
64
65 /**
66  * These function implement a locking mechanism that can be used by 
67  * a user's runtime library.
68  * 
69  * Be sure to always check for DYNINST_LIVE_LOCK and DYNINST_DEAD_LOCK.
70  * When instrumenting multithread or signal-based application as these error
71  * conditions can trigger even on simple synchronization mechanisms.
72  **/
73
74 /* The contents of this structure are subject to change between
75    dyninst versions.  Don't rely on it. */
76 typedef void * dyntid_t;
77 #define DYNINST_INITIAL_LOCK_PID ((void *)-129)
78
79 typedef struct {
80    volatile int mutex;
81    dyntid_t tid;
82 } dyninst_lock_t;
83
84 /* Return values for 'dyninst_lock' */
85 #define DYNINST_LIVE_LOCK      -1
86 #define DYNINST_DEAD_LOCK      -2
87
88 /* Declare a lock already initialized */
89 #define DECLARE_DYNINST_LOCK(lck) dyninst_lock_t lck = {0, DYNINST_INITIAL_LOCK_PID}
90
91 DLLEXPORT void dyninst_init_lock(dyninst_lock_t *lock);
92 DLLEXPORT void dyninst_free_lock(dyninst_lock_t *lock);
93 DLLEXPORT int dyninst_lock(dyninst_lock_t *lock);
94 DLLEXPORT void dyninst_unlock(dyninst_lock_t *lock);
95
96 /**
97  * Functions for retrieving information about threads
98  **/
99 DLLEXPORT unsigned dyninst_maxNumOfThreads();
100 DLLEXPORT unsigned dyninst_threadIndex();
101
102 /**
103  * Internal functions that we export to ensure they show up.
104  **/
105
106 DLLEXPORT void DYNINSTinit(int, int, int, int);
107 DLLEXPORT void DYNINST_snippetBreakpoint();
108 DLLEXPORT void DYNINST_stopThread(void *, void *, void *, void *);
109 DLLEXPORT void DYNINST_stopInterProc(void *, void *, void *, void *, void *, void *);
110 DLLEXPORT void RThandleShadow(void *, void *, void *, void *, void *);
111 DLLEXPORT unsigned long RTtranslateMemory(unsigned long, unsigned long, unsigned long);
112 DLLEXPORT unsigned long RTtranslateMemoryShift(unsigned long, unsigned long, unsigned long);
113 DLLEXPORT int DYNINSTthreadIndex();
114 DLLEXPORT void *DYNINSTos_malloc(size_t, void *, void *); 
115
116 /** 
117  * And variables
118  **/
119
120 DLLEXPORT extern dyntid_t (*DYNINST_pthread_self)(void);
121 DLLEXPORT extern unsigned int DYNINSTobsCostLow;
122 DLLEXPORT extern int libdyninstAPI_RT_init_maxthreads;
123 DLLEXPORT extern int libdyninstAPI_RT_init_localCause;
124 DLLEXPORT extern int libdyninstAPI_RT_init_localPid;
125 DLLEXPORT extern int libdyninstAPI_RT_init_debug_flag;
126 DLLEXPORT extern struct DYNINST_bootstrapStruct DYNINST_bootstrap_info;
127 DLLEXPORT extern unsigned *DYNINST_tramp_guards;
128
129 #endif
130 #endif