-lib_LTLIBRARIES = libinteraspect.la
+lib_LTLIBRARIES = libinteraspect.la libtracecut.la
libinteraspect_la_SOURCES = aop-pc-assign.c aop-main.c aop-type.c aop-weave.c \
aop-pc-entry.c aop-pc-exit.c aop-pc-fun-call.c aop-header.c \
aop-pointcut.c aop-duplicate.c tracecut.c
libinteraspect_la_CFLAGS = -Wall -Werror -fvisibility=hidden -prefer-pic
libinteraspect_la_LDFLAGS = -static -prefer-pic -version-info 1:0:0
libinteraspect_la_CPPFLAGS = -DHAVE_CONFIG_H -DIN_GCC -I$(gcc_includes)
+
+libtracecut_la_SOURCES = tracecut-advice.c
+libtracecut_la_CFLAGS = -Wall -Werror -fvisibility=hidden
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+
+/* Advice functions should be externally visible. */
+#define ADVICE_FUNC __attribute__((visibility("default")))
+
+static int num_tracecuts = -1;
+
+struct tracecut {
+ int num_params;
+ int num_symbols;
+
+ const char **symbol_names;
+} *tracecut_array = NULL;
+
+static void
+fatal_tracecut_error(const char *error)
+{
+ /* Setting num_tracecuts to -1 will stop completely disable the
+ tracecut runtime. */
+ num_tracecuts = -1;
+
+ fprintf (stderr, "Fatal tracecut error: %s\n", error);
+}
+
+static struct tracecut *
+get_tracecut (int tc_index)
+{
+ if (num_tracecuts < 0)
+ {
+ /* The tracecut library hasn't been initialized yet, so tracecut
+ functions should silently do nothing. */
+ return NULL;
+ }
+ else if (tc_index >= 0 && tc_index < num_tracecuts)
+ {
+ /* The normal case. */
+ return &tracecut_array[tc_index];
+ }
+ else
+ {
+ /* Some error occured in initialization. Abort. */
+ fatal_tracecut_error ("Attempt to initialize bad tracecut");
+ return NULL;
+ }
+}
+
+ADVICE_FUNC void
+_tc_init (int _num_tracecuts)
+{
+ num_tracecuts = _num_tracecuts;
+ tracecut_array = calloc (num_tracecuts, sizeof (struct tracecut));
+ if (tracecut_array == NULL)
+ fatal_tracecut_error ("Out of memory");
+}
+
+ADVICE_FUNC void
+_tc_new_tracecut (int tc_index, int num_params, int num_symbols)
+{
+ struct tracecut *tc;
+
+ tc = get_tracecut (tc_index);
+ if (tc == NULL)
+ return;
+
+ tc->num_params = num_params;
+ tc->num_symbols = num_symbols;
+
+ if (tc->num_symbols > 0)
+ {
+ tc->symbol_names = calloc (num_symbols, sizeof (const char *));
+ if (tc->symbol_names == NULL)
+ fatal_tracecut_error ("Out of memory");
+ }
+}
+
+ADVICE_FUNC void
+_tc_name_symbol (int tc_index, int symbol_index, const char *symbol_name)
+{
+ struct tracecut *tc;
+
+ tc = get_tracecut (tc_index);
+ if (tc == NULL)
+ return;
+
+ if (symbol_index < 0 || symbol_index >= tc->num_symbols)
+ {
+ fatal_tracecut_error ("Bad symbol index at initialization.");
+ return;
+ }
+
+ tc->symbol_names[symbol_index] = symbol_name;
+}
+
+ADVICE_FUNC void
+_tc_compile_tracecut (int tc_index)
+{
+}
+
+ADVICE_FUNC void
+_tc_event_begin (int tc_index)
+{
+}
+
+ADVICE_FUNC void
+_tc_capture_pointer_param (int tc_index, int symbol, int param_index,
+ void *param_val)
+{
+}
+
+ADVICE_FUNC void
+_tc_event_transition (int tc_index, int symbol)
+{
+}