diff options
author | Jiri Olsa <Jiri Olsa jolsa@redhat.com> | 2010-08-05 16:39:27 +0200 |
---|---|---|
committer | Jiri Olsa <Jiri Olsa jolsa@redhat.com> | 2010-08-05 16:39:27 +0200 |
commit | 6a8dec3f9357024a29feb5b7607342c01f8dd55f (patch) | |
tree | 54a9ecbe7acb056c5ecaa3286dd772454c1ddd5e /src | |
parent | 52aaa69c1ba666c91dda62e51173b773fd2a3176 (diff) | |
download | latrace-6a8dec3f9357024a29feb5b7607342c01f8dd55f.tar.gz latrace-6a8dec3f9357024a29feb5b7607342c01f8dd55f.tar.xz latrace-6a8dec3f9357024a29feb5b7607342c01f8dd55f.zip |
separate arguments display code, so it could be
disabled for not supported architectures
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile | 10 | ||||
-rw-r--r-- | src/args.h | 159 | ||||
-rw-r--r-- | src/audit-init.c | 2 | ||||
-rw-r--r-- | src/audit.c | 8 | ||||
-rw-r--r-- | src/autoconf.h.in | 11 | ||||
-rw-r--r-- | src/autoconf.make.in | 45 | ||||
-rw-r--r-- | src/config.c | 17 | ||||
-rw-r--r-- | src/config.h | 136 | ||||
-rw-r--r-- | src/output.c | 2 | ||||
-rw-r--r-- | src/run.c | 3 |
10 files changed, 223 insertions, 170 deletions
diff --git a/src/Makefile b/src/Makefile index 0208d6f..003eb39 100644 --- a/src/Makefile +++ b/src/Makefile @@ -18,7 +18,7 @@ # libltaudit.so -AUDIT_BIN=libltaudit.so.$(LT_VER) +AUDIT_BIN=libltaudit.so.$(CONFIG_VERSION) AUDIT_LDFLAGS="-Wl,-init=audit_init" "-Wl,-soname,$(AUDIT_BIN)" -fPIC -shared AUDIT_LIBS=$(LIBS) $(LEXLIB) @@ -26,12 +26,16 @@ AUDIT_OBJS=\ src/audit.o \ src/audit-init.o \ src/fifo.o \ + src/output.o \ + src/objsearch.o + +ifeq ($(CONFIG_ARCH_HAVE_ARGS),y) +AUDIT_OBJS+=\ src/args-bison.o \ src/args-flex.o \ src/args.o \ - src/output.o \ - src/objsearch.o \ src/sysdeps/$(CONFIG_SYSDEP_DIR)/stack.o +endif OBJS+=$(AUDIT_OBJS) PROGRAMS+= $(AUDIT_BIN) diff --git a/src/args.h b/src/args.h new file mode 100644 index 0000000..fa2d930 --- /dev/null +++ b/src/args.h @@ -0,0 +1,159 @@ +/* + Copyright (C) 2008, 2009 Jiri Olsa <olsajiri@gmail.com> + + This file is part of the latrace. + + The latrace 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 of the License, or + (at your option) any later version. + + The latrace 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 the latrace (file COPYING). If not, see + <http://www.gnu.org/licenses/>. +*/ + + +#ifndef ARGS_H +#define ARGS_H + +struct lt_config_shared; + +enum { + LT_ARGS_DTYPE_POD = 1, + LT_ARGS_DTYPE_STRUCT, +}; + +enum { + LT_ARGS_TYPEID_VOID = 1, + LT_ARGS_TYPEID_SHORT, + LT_ARGS_TYPEID_USHORT, + LT_ARGS_TYPEID_INT, + LT_ARGS_TYPEID_UINT, + LT_ARGS_TYPEID_LONG, + LT_ARGS_TYPEID_ULONG, + LT_ARGS_TYPEID_CHAR, + LT_ARGS_TYPEID_UCHAR, + LT_ARGS_TYPEID_LLONG, + LT_ARGS_TYPEID_ULLONG, + LT_ARGS_TYPEID_DOUBLE, + LT_ARGS_TYPEID_FLOAT, + + LT_ARGS_TYPEID_CUSTOM = 1000 +}; + +struct lt_enum_elem { + char *name; + char *strval; + long val; + int undef; + struct lt_list_head list; +}; + +struct lt_enum { + char *name; + int cnt; + struct lt_enum_elem *elems; +}; + +struct lt_arg { + /* argument type */ + int dtype; + + /* argument type properties */ + int type_id; + u_int type_len; + char *type_name; + + /* argument value properties */ + int pointer; + char *name; + + /* for structures only */ + int mmbcnt; + + /* architecture dependent */ + void *arch; + + /* enum record */ + struct lt_enum *en; + + /* struct arguments head */ + struct lt_list_head *args_head; + /* nested arguments list if present */ + struct lt_list_head args_list; +}; + +struct lt_args_sym { + char *name; + + int argcnt; +#define LT_ARGS_RET 0 + struct lt_arg **args; +}; + +struct lt_args_include { + FILE *yyin; + void *yybuf; + char *file; + int lineno; +}; + +/* used in lt_args_cb_struct for argument type */ +enum { + LT_ARGS_STRUCT_ITSELF = 0, + LT_ARGS_STRUCT_ARG +}; + +struct lt_args_data { + int arglen; + + /* function arguments */ + char *args_buf; + int args_len; + int args_totlen; + + /* detailed structs */ + char *argsd_buf; + int argsd_len; + int argsd_totlen; +}; + +/* arguments */ +int lt_args_init(struct lt_config_shared *cfg); +int lt_args_sym_entry(struct lt_config_shared *cfg, char *sym, La_regs *regs, + char **argbuf, char **argdbuf); +int lt_args_sym_exit(struct lt_config_shared *cfg, char *sym, La_regs *inregs, + La_retval *outregs, char **argbuf, char **argdbuf); +int lt_args_add_enum(struct lt_config_shared *cfg, char *name, + struct lt_list_head *h); +struct lt_enum_elem* lt_args_get_enum(struct lt_config_shared *cfg, char *name, char *val); +int lt_args_add_struct(struct lt_config_shared *cfg, char *type_name, + struct lt_list_head *h); +int lt_args_add_sym(struct lt_config_shared *cfg, struct lt_arg *sym, + struct lt_list_head *h); +int lt_args_add_typedef(struct lt_config_shared *cfg, char *base, + char *new, int pointer); +int lt_args_buf_open(struct lt_config_shared *cfg, char *file); +int lt_args_buf_close(struct lt_config_shared *cfg); +struct lt_arg* lt_args_getarg(struct lt_config_shared *cfg, char *type, + char *name, int pointer, int create, char *enum_name); +int lt_args_cb_arg(struct lt_config_shared *cfg, struct lt_arg *arg, + void *pval, struct lt_args_data *data, int last, + int dspname); +int lt_args_cb_struct(struct lt_config_shared *cfg, int type, + struct lt_arg *arg, void *pval, + struct lt_args_data *data, int last); + +/* stack handling */ +int lt_stack_process(struct lt_config_shared *cfg, struct lt_args_sym *asym, + La_regs *regs, struct lt_args_data *data); +int lt_stack_process_ret(struct lt_config_shared *cfg, struct lt_args_sym *asym, + La_retval *regs, struct lt_args_data *data); + +#endif /* ARGS_H */ diff --git a/src/audit-init.c b/src/audit-init.c index 0f60cc3..3c57ef9 100644 --- a/src/audit-init.c +++ b/src/audit-init.c @@ -155,9 +155,11 @@ int audit_init(int argc, char **argv, char **env) if (-1 == read_config(getenv("LT_DIR"))) return -1; +#ifdef CONFIG_ARCH_HAVE_ARGS /* -Aa */ if (lt_sh(&cfg, args_enabled) && lt_args_init(cfg.sh)) return -1; +#endif /* -t */ if ((*lt_sh(&cfg, libs_to)) && diff --git a/src/audit.c b/src/audit.c index 475dd47..fb65997 100644 --- a/src/audit.c +++ b/src/audit.c @@ -72,7 +72,7 @@ static int check_flow_below(const char *symname, int in) static int sym_entry(const char *symname, char *lib_from, char *lib_to, La_regs *regs) { - int argret; + int argret = -1; char *argbuf = "", *argdbuf = ""; struct timeval tv; @@ -84,8 +84,10 @@ static int sym_entry(const char *symname, char *lib_from, char *lib_to, if (lt_sh(&cfg, timestamp) || lt_sh(&cfg, counts)) gettimeofday(&tv, NULL); +#ifdef CONFIG_ARCH_HAVE_ARGS argret = lt_sh(&cfg, args_enabled) ? lt_args_sym_entry(cfg.sh, (char*) symname, regs, &argbuf, &argdbuf) : -1; +#endif if (lt_sh(&cfg, pipe)) { char buf[FIFO_MSG_MAXLEN]; @@ -119,7 +121,7 @@ static int sym_entry(const char *symname, char *lib_from, char *lib_to, static int sym_exit(const char *symname, char *lib_from, char *lib_to, const La_regs *inregs, La_retval *outregs) { - int argret; + int argret = -1; char *argbuf = "", *argdbuf = ""; struct timeval tv; @@ -131,9 +133,11 @@ static int sym_exit(const char *symname, char *lib_from, char *lib_to, if (lt_sh(&cfg, timestamp) || lt_sh(&cfg, counts)) gettimeofday(&tv, NULL); +#ifdef CONFIG_ARCH_HAVE_ARGS argret = lt_sh(&cfg, args_enabled) ? lt_args_sym_exit(cfg.sh, (char*) symname, (La_regs*) inregs, outregs, &argbuf, &argdbuf) : -1; +#endif if (lt_sh(&cfg, pipe)) { char buf[FIFO_MSG_MAXLEN]; diff --git a/src/autoconf.h.in b/src/autoconf.h.in index bf6ed9d..2df3e65 100644 --- a/src/autoconf.h.in +++ b/src/autoconf.h.in @@ -25,15 +25,12 @@ #undef CONFIG_LT_CONFIG /* Version define. */ -#undef LT_VER +#undef CONFIG_VERSION -/* x86 define. */ -#undef LT_ARCH_X86 - -/* x86_64 define. */ -#undef LT_ARCH_X86_64 +/* Argument display support. */ +#undef CONFIG_ARCH_HAVE_ARGS /* liberty */ -#undef LT_LIBERTY +#undef CONFIG_LIBERTY #endif diff --git a/src/autoconf.make.in b/src/autoconf.make.in index fa0f479..09579a3 100644 --- a/src/autoconf.make.in +++ b/src/autoconf.make.in @@ -19,29 +19,30 @@ # @configure_input@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ -bindir = @bindir@ -libdir = @libdir@ -datadir = @datadir@ -mandir = @mandir@ -datarootdir = @datarootdir@ -sysconfdir = @sysconfdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +libdir = @libdir@ +datadir = @datadir@ +mandir = @mandir@ +datarootdir = @datarootdir@ +sysconfdir = @sysconfdir@ -RM = rm -FIND = find -CC = @CC@ -LEX = @LEX@ -LEXLIB = @LEXLIB@ -YACC = @YACC@ -CPPFLAGS = @CPPFLAGS@ -CFLAGS = @CFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ +RM = rm +FIND = find +CC = @CC@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +YACC = @YACC@ +CPPFLAGS = @CPPFLAGS@ +CFLAGS = @CFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ -ASCIIDOC = @ASCIIDOC@ -XMLTO = @XMLTO@ +ASCIIDOC = @ASCIIDOC@ +XMLTO = @XMLTO@ -CONFIG_SYSDEP_DIR = @CONFIG_SYSDEP_DIR@ +CONFIG_SYSDEP_DIR = @CONFIG_SYSDEP_DIR@ -LT_VER = @LT_VER@ +CONFIG_VERSION = @CONFIG_VERSION@ +CONFIG_ARCH_HAVE_ARGS = @CONFIG_ARCH_HAVE_ARGS@ diff --git a/src/config.c b/src/config.c index 52904f0..700a475 100644 --- a/src/config.c +++ b/src/config.c @@ -42,9 +42,13 @@ static void usage() printf(" -p, --pipe use pipe to latrace process to send audit data\n"); printf(" latrace app is then the one displaying the output\n"); printf("\n"); +#ifndef CONFIG_ARCH_HAVE_ARGS + printf(" -[ADa] arguments display support not compiled in\n"); +#else printf(" -A, --enable-args enable arguments output (definitions from /etc/latrace.conf)\n"); printf(" -D, --detail-args display struct arguments in more detail\n"); printf(" -a, --args file arguments definition file, implies \'-A\'\n"); +#endif printf("\n"); printf(" -y, --framesize number framesize for storing the stack before pltexit (default 1000)\n"); printf(" -F, --not-follow-fork dont follow fork calls - childs\n"); @@ -73,7 +77,7 @@ static void usage() static void version() NORETURN; static void version() { - printf("latrace version " LT_VER "\n"); + printf("latrace version " CONFIG_VERSION "\n"); exit(0); } @@ -221,7 +225,7 @@ int lt_config(struct lt_config_app *cfg, int argc, char **argv) break; case 'd': - #ifndef LT_LIBERTY + #ifndef CONFIG_LIBERTY printf("demangle support not compiled in," \ " liberty not found\n"); break; @@ -257,16 +261,25 @@ int lt_config(struct lt_config_app *cfg, int argc, char **argv) lt_sh(cfg, pipe) = 1; break; + #ifndef CONFIG_ARCH_HAVE_ARGS + case 'a': + case 'A': + case 'D': + printf("Arguments display support not compiled in"); + break; + #else case 'a': strcpy(lt_sh(cfg, args_def), optarg); /* falling through */ case 'A': + lt_sh(cfg, args_enabled) = 1; break; case 'D': lt_sh(cfg, args_detailed) = 1; break; + #endif /* CONFIG_ARCH_HAVE_ARGS */ case 'o': strcpy(lt_sh(cfg, output), optarg); diff --git a/src/config.h b/src/config.h index 5eec433..367b2d3 100644 --- a/src/config.h +++ b/src/config.h @@ -33,6 +33,10 @@ #include "list.h" #include "autoconf.h" +#ifdef CONFIG_ARCH_HAVE_ARGS +#include "args.h" +#endif + #ifdef __GNUC__ #define NORETURN __attribute__((__noreturn__)) #else @@ -251,106 +255,6 @@ struct lt_thread { struct lt_thread *next; }; -enum { - LT_ARGS_DTYPE_POD = 1, - LT_ARGS_DTYPE_STRUCT, -}; - -enum { - LT_ARGS_TYPEID_VOID = 1, - LT_ARGS_TYPEID_SHORT, - LT_ARGS_TYPEID_USHORT, - LT_ARGS_TYPEID_INT, - LT_ARGS_TYPEID_UINT, - LT_ARGS_TYPEID_LONG, - LT_ARGS_TYPEID_ULONG, - LT_ARGS_TYPEID_CHAR, - LT_ARGS_TYPEID_UCHAR, - LT_ARGS_TYPEID_LLONG, - LT_ARGS_TYPEID_ULLONG, - LT_ARGS_TYPEID_DOUBLE, - LT_ARGS_TYPEID_FLOAT, - - LT_ARGS_TYPEID_CUSTOM = 1000 -}; - -struct lt_enum_elem { - char *name; - char *strval; - long val; - int undef; - struct lt_list_head list; -}; - -struct lt_enum { - char *name; - int cnt; - struct lt_enum_elem *elems; -}; - -struct lt_arg { - /* argument type */ - int dtype; - - /* argument type properties */ - int type_id; - u_int type_len; - char *type_name; - - /* argument value properties */ - int pointer; - char *name; - - /* for structures only */ - int mmbcnt; - - /* architecture dependent */ - void *arch; - - /* enum record */ - struct lt_enum *en; - - /* struct arguments head */ - struct lt_list_head *args_head; - /* nested arguments list if present */ - struct lt_list_head args_list; -}; - -struct lt_args_sym { - char *name; - - int argcnt; -#define LT_ARGS_RET 0 - struct lt_arg **args; -}; - -struct lt_args_include { - FILE *yyin; - void *yybuf; - char *file; - int lineno; -}; - -/* used in lt_args_cb_struct for argument type */ -enum { - LT_ARGS_STRUCT_ITSELF = 0, - LT_ARGS_STRUCT_ARG -}; - -struct lt_args_data { - int arglen; - - /* function arguments */ - char *args_buf; - int args_len; - int args_totlen; - - /* detailed structs */ - char *argsd_buf; - int argsd_len; - int argsd_totlen; -}; - /* ctl */ int main_ctl(int argc, char **argv); @@ -380,32 +284,6 @@ struct lt_thread *lt_thread_add(struct lt_config_app *cfg, int fd, pid_t pid); struct lt_thread *lt_thread_first(struct lt_config_app *cfg); struct lt_thread *lt_thread_next(struct lt_config_app *cfg); -/* arguments */ -int lt_args_init(struct lt_config_shared *cfg); -int lt_args_sym_entry(struct lt_config_shared *cfg, char *sym, La_regs *regs, - char **argbuf, char **argdbuf); -int lt_args_sym_exit(struct lt_config_shared *cfg, char *sym, La_regs *inregs, - La_retval *outregs, char **argbuf, char **argdbuf); -int lt_args_add_enum(struct lt_config_shared *cfg, char *name, - struct lt_list_head *h); -struct lt_enum_elem* lt_args_get_enum(struct lt_config_shared *cfg, char *name, char *val); -int lt_args_add_struct(struct lt_config_shared *cfg, char *type_name, - struct lt_list_head *h); -int lt_args_add_sym(struct lt_config_shared *cfg, struct lt_arg *sym, - struct lt_list_head *h); -int lt_args_add_typedef(struct lt_config_shared *cfg, char *base, - char *new, int pointer); -int lt_args_buf_open(struct lt_config_shared *cfg, char *file); -int lt_args_buf_close(struct lt_config_shared *cfg); -struct lt_arg* lt_args_getarg(struct lt_config_shared *cfg, char *type, - char *name, int pointer, int create, char *enum_name); -int lt_args_cb_arg(struct lt_config_shared *cfg, struct lt_arg *arg, - void *pval, struct lt_args_data *data, int last, - int dspname); -int lt_args_cb_struct(struct lt_config_shared *cfg, int type, - struct lt_arg *arg, void *pval, - struct lt_args_data *data, int last); - /* output */ int lt_out_entry(struct lt_config_shared *cfg, struct timeval *tv, pid_t tid, int indent_depth, @@ -416,12 +294,6 @@ int lt_out_exit(struct lt_config_shared *cfg, struct timeval *tv, const char *symname, char *lib_to, char *argbuf, char *argdbuf); -/* stack handling */ -int lt_stack_process(struct lt_config_shared *cfg, struct lt_args_sym *asym, - La_regs *regs, struct lt_args_data *data); -int lt_stack_process_ret(struct lt_config_shared *cfg, struct lt_args_sym *asym, - La_retval *regs, struct lt_args_data *data); - /* la_objsearch */ int lt_objsearch_init(struct lt_config_audit *cfg, char **ptr, int cnt); char* lt_objsearch(struct lt_config_audit *cfg, const char *name, diff --git a/src/output.c b/src/output.c index e504503..dd03382 100644 --- a/src/output.c +++ b/src/output.c @@ -56,7 +56,7 @@ do { \ /* libiberty external */ extern char* cplus_demangle(const char *mangled, int options); -#ifdef LT_LIBERTY +#ifdef CONFIG_LIBERTY #define DEMANGLE(sym, d) \ do { \ char *dem; \ @@ -289,7 +289,8 @@ int lt_run(struct lt_config_app *cfg) if (0 == (child_pid = fork())) { char str_audit[100]; - sprintf(str_audit, "%s/libltaudit.so.%s", CONFIG_LIBDIR, LT_VER); + sprintf(str_audit, "%s/libltaudit.so.%s", CONFIG_LIBDIR, + CONFIG_VERSION); setenv("LD_AUDIT", str_audit, 1); setenv("LT_DIR", str_dir, 1); |