1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3 4""" 5Simple built-in backend. 6""" 7 8__author__ = "Lluís Vilanova <vilanova@ac.upc.edu>" 9__copyright__ = "Copyright 2012-2014, Lluís Vilanova <vilanova@ac.upc.edu>" 10__license__ = "GPL version 2 or (at your option) any later version" 11 12__maintainer__ = "Stefan Hajnoczi" 13__email__ = "stefanha@linux.vnet.ibm.com" 14 15 16from tracetool import out 17 18 19PUBLIC = True 20 21 22def is_string(arg): 23 strtype = ('const char*', 'char*', 'const char *', 'char *') 24 if arg.lstrip().startswith(strtype): 25 return True 26 else: 27 return False 28 29 30def generate_h_begin(events): 31 for event in events: 32 out('void _simple_%(api)s(%(args)s);', 33 api=event.api(), 34 args=event.args) 35 out('') 36 37 38def generate_h(event): 39 out(' _simple_%(api)s(%(args)s);', 40 api=event.api(), 41 args=", ".join(event.args.names())) 42 43 44def generate_c_begin(events): 45 out('#include "trace.h"', 46 '#include "trace/control.h"', 47 '#include "trace/simple.h"', 48 '') 49 50 51def generate_c(event): 52 out('void _simple_%(api)s(%(args)s)', 53 '{', 54 ' TraceBufferRecord rec;', 55 api=event.api(), 56 args=event.args) 57 sizes = [] 58 for type_, name in event.args: 59 if is_string(type_): 60 out(' size_t arg%(name)s_len = %(name)s ? MIN(strlen(%(name)s), MAX_TRACE_STRLEN) : 0;', 61 name=name) 62 strsizeinfo = "4 + arg%s_len" % name 63 sizes.append(strsizeinfo) 64 else: 65 sizes.append("8") 66 sizestr = " + ".join(sizes) 67 if len(event.args) == 0: 68 sizestr = '0' 69 70 71 out('', 72 ' if (!trace_event_get_state(%(event_id)s)) {', 73 ' return;', 74 ' }', 75 '', 76 ' if (trace_record_start(&rec, %(event_id)s, %(size_str)s)) {', 77 ' return; /* Trace Buffer Full, Event Dropped ! */', 78 ' }', 79 event_id='TRACE_' + event.name.upper(), 80 size_str=sizestr) 81 82 if len(event.args) > 0: 83 for type_, name in event.args: 84 # string 85 if is_string(type_): 86 out(' trace_record_write_str(&rec, %(name)s, arg%(name)s_len);', 87 name=name) 88 # pointer var (not string) 89 elif type_.endswith('*'): 90 out(' trace_record_write_u64(&rec, (uintptr_t)(uint64_t *)%(name)s);', 91 name=name) 92 # primitive data type 93 else: 94 out(' trace_record_write_u64(&rec, (uint64_t)%(name)s);', 95 name=name) 96 97 out(' trace_record_finish(&rec);', 98 '}', 99 '') 100