Skip to content

Commit

Permalink
perf-map: add support for performance counters
Browse files Browse the repository at this point in the history
This patch adds preliminary support for integrating with Linux kernel
performance counters. The perf tool is expected to pick up the
anonymous memory [address, size, symbol] mappings when producing reports
that we generate.

Signed-off-by: Pekka Enberg <penberg@cs.helsinki.fi>
  • Loading branch information
Pekka Enberg committed Jun 8, 2009
1 parent 864b493 commit 73ad868
Show file tree
Hide file tree
Showing 7 changed files with 97 additions and 1 deletion.
3 changes: 2 additions & 1 deletion Makefile
Expand Up @@ -82,7 +82,8 @@ JIT_OBJS = \
jit/bc-offset-mapping.o \
jit/cu-mapping.o \
jit/method.o \
jit/nop-bc.o
jit/nop-bc.o \
jit/perf-map.o

VM_OBJS = \
vm/bitset.o \
Expand Down
17 changes: 17 additions & 0 deletions include/jit/compiler.h
Expand Up @@ -66,6 +66,23 @@ void free_fixup_site(struct fixup_site *);
void trampoline_add_fixup_site(struct jit_trampoline *, struct fixup_site *);
unsigned char *fixup_site_addr(struct fixup_site *);

const char *method_symbol(struct methodblock *method, char *symbol, size_t len);

static inline const char *cu_symbol(struct compilation_unit *cu, char *symbol, size_t len)
{
return method_symbol(cu->method, symbol, len);
}

static inline void *cu_native_ptr(struct compilation_unit *cu)
{
return buffer_ptr(cu->objcode);
}

static inline unsigned long cu_native_size(struct compilation_unit *cu)
{
return buffer_offset(cu->objcode);
}

static inline void *method_native_ptr(struct methodblock *method)
{
return buffer_ptr(method->compilation_unit->objcode);
Expand Down
7 changes: 7 additions & 0 deletions include/jit/perf-map.h
@@ -0,0 +1,7 @@
#ifndef JATO_PERF_MAP_H
#define JATO_PERF_MAP_H

void perf_map_open(void);
void perf_map_append(const char *symbol, unsigned long addr, unsigned long size);

#endif /* JATO_PERF_MAP_H */
5 changes: 5 additions & 0 deletions jit/compiler.c
Expand Up @@ -12,6 +12,7 @@
#include <jit/statement.h>
#include <jit/bc-offset-mapping.h>
#include <jit/exception.h>
#include <jit/perf-map.h>

#include <errno.h>
#include <stdlib.h>
Expand All @@ -26,8 +27,11 @@ static void compile_error(struct compilation_unit *cu, int err)
__func__, cu->method->name, cb->name, err);
}

#define SYMBOL_LEN 128

int compile(struct compilation_unit *cu)
{
char symbol[SYMBOL_LEN];
int err;

if (opt_trace_method)
Expand Down Expand Up @@ -89,6 +93,7 @@ int compile(struct compilation_unit *cu)

cu->is_compiled = true;

perf_map_append(cu_symbol(cu, symbol, SYMBOL_LEN), (unsigned long) cu_native_ptr(cu), cu_native_size(cu));
out:
if (err)
compile_error(cu, err);
Expand Down
7 changes: 7 additions & 0 deletions jit/method.c
Expand Up @@ -44,3 +44,10 @@ bool is_jit_method(unsigned long eip)
{
return eip >= (unsigned long)&etext;
}

const char *method_symbol(struct methodblock *method, char *symbol, size_t size)
{
snprintf(symbol, size, "%s.%s%s", CLASS_CB(method->class)->name, method->name, method->type);

return symbol;
}
56 changes: 56 additions & 0 deletions jit/perf-map.c
@@ -0,0 +1,56 @@
/*
* Copyright (c) 2009 Pekka Enberg
*
* This file is released under the GPL version 2 with the following
* clarification and special exception:
*
* Linking this library statically or dynamically with other modules is
* making a combined work based on this library. Thus, the terms and
* conditions of the GNU General Public License cover the whole
* combination.
*
* As a special exception, the copyright holders of this library give you
* permission to link this library with independent modules to produce an
* executable, regardless of the license terms of these independent
* modules, and to copy and distribute the resulting executable under terms
* of your choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module. An
* independent module is a module which is not derived from or based on
* this library. If you modify this library, you may extend this exception
* to your version of the library, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
* Please refer to the file LICENSE for details.
*/

#include <jit/perf-map.h>
#include <vm/die.h>

#include <sys/types.h>
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>

static pthread_mutex_t perf_mutex = PTHREAD_MUTEX_INITIALIZER;
static FILE *perf_file;

void perf_map_open(void)
{
char filename[32];
pid_t pid;

pid = getpid();
sprintf(filename, "perf-%d.map", pid);

perf_file = fopen(filename, "w");
if (!perf_file)
die("fopen");
}

void perf_map_append(const char *symbol, unsigned long addr, unsigned long size)
{
pthread_mutex_lock(&perf_mutex);
fprintf(perf_file, "%lx %lx %s\n", addr, size, symbol);
pthread_mutex_unlock(&perf_mutex);
}
3 changes: 3 additions & 0 deletions vm/jato.c
Expand Up @@ -32,6 +32,7 @@
#include <jit/cu-mapping.h>
#include <jit/exception.h>
#include <jit/compiler.h>
#include <jit/perf-map.h>

#ifdef USE_ZIP
#define BCP_MESSAGE "<jar/zip files and directories separated by :>"
Expand Down Expand Up @@ -300,6 +301,8 @@ int main(int argc, char *argv[]) {

exe_name = argv[0];

perf_map_open();

setup_signal_handlers();
init_cu_mapping();
init_exceptions();
Expand Down

0 comments on commit 73ad868

Please sign in to comment.