Author: fijal Branch: vmprof-newstack Changeset: r80551:ea3aa700ca28 Date: 2015-11-05 17:35 +0000 http://bitbucket.org/pypy/pypy/changeset/ea3aa700ca28/
Log: progress diff --git a/rpython/rlib/rvmprof/cintf.py b/rpython/rlib/rvmprof/cintf.py --- a/rpython/rlib/rvmprof/cintf.py +++ b/rpython/rlib/rvmprof/cintf.py @@ -52,22 +52,11 @@ vmprof_register_virtual_function = rffi.llexternal( "vmprof_register_virtual_function", [rffi.CCHARP, rffi.LONG, rffi.INT], - rffi.INT, compilation_info=eci, - _nowrapper=True) + rffi.INT, compilation_info=eci) vmprof_ignore_signals = rffi.llexternal("vmprof_ignore_signals", [rffi.INT], lltype.Void, compilation_info=eci, _nowrapper=True) - vmprof_stack_new = rffi.llexternal("vmprof_stack_new", - [], rffi.VOIDP, compilation_info=eci, _nowrapper=True) - vmprof_stack_append = rffi.llexternal("vmprof_stack_append", - [rffi.VOIDP, lltype.Signed], rffi.INT, compilation_info=eci, - _nowrapper=True) - vmprof_stack_pop = rffi.llexternal("vmprof_stack_pop", - [rffi.VOIDP], lltype.Signed, compilation_info=eci, - _nowrapper=True) - vmprof_stack_free = rffi.llexternal("vmprof_stack_free", - [rffi.VOIDP], lltype.Void, compilation_info=eci, _nowrapper=True) return CInterface(locals()) @@ -106,18 +95,36 @@ assert detect_cpu.autodetect().startswith(detect_cpu.MODEL_X86_64), ( "rvmprof only supports x86-64 CPUs for now") - llargs = ", ".join([token2ctype(x) for x in token]) + llargs = ", ".join(["%s arg%d" % (token2ctype(x), i) for i, x in + enumerate(token)]) type = token2ctype(restok) target = udir.join('module_cache') target.ensure(dir=1) + argnames = ", ".join(["arg%d" % i for i in range(len(token))]) target = target.join('trampoline_%s_%s.vmprof.c' % (name, token)) target.write(""" -#include <vmprof_stack.h> +typedef struct vmprof_stack { + struct vmprof_stack* next; + long value; +}; -%(type)s %(tramp_name)s(%(llargs)s) +%(type)s %(cont_name)s(%(llargs)s); + +%(type)s %(tramp_name)s(%(llargs)s, long unique_id, void** shadowstack_base) { + %(type)s result; + struct vmprof_stack node; + + node.value = unique_id; + node.next = (struct vmprof_stack*)shadowstack_base[0]; + shadowstack_base[0] = (void*)(&node); + result = %(cont_name)s(%(argnames)s); + shadowstack_base[0] = node.next; + return result; } """ % locals()) + return finish_ll_trampoline(tramp_name, tramp_name, target, token, + restok, True) def make_trampoline_function(name, func, token, restok): from rpython.jit.backend import detect_cpu @@ -183,18 +190,19 @@ \t.cfi_endproc %(size_decl)s """ % locals()) + return finish_ll_trampoline(orig_tramp_name, tramp_name, target, token, + restok, False) - def tok2cname(tok): - if tok == 'i': - return 'long' - if tok == 'r': - return 'void *' - raise NotImplementedError(repr(tok)) +def finish_ll_trampoline(orig_tramp_name, tramp_name, target, token, restok, + accepts_shadowstack): + extra_args = ['long'] + if accepts_shadowstack: + extra_args.append("void*") header = 'RPY_EXTERN %s %s(%s);\n' % ( - tok2cname(restok), + token2ctype(restok), orig_tramp_name, - ', '.join([tok2cname(tok) for tok in token] + ['long'])) + ', '.join([token2ctype(tok) for tok in token] + extra_args)) header += """\ static int cmp_%s(void *addr) { @@ -214,9 +222,11 @@ separate_module_files = [str(target)], ) + ARGS = [token2lltype(tok) for tok in token] + [lltype.Signed] + if accepts_shadowstack: + ARGS.append(llmemory.Address) return rffi.llexternal( - orig_tramp_name, - [token2lltype(tok) for tok in token] + [lltype.Signed], + orig_tramp_name, ARGS, token2lltype(restok), compilation_info=eci, _nowrapper=True, sandboxsafe=True, diff --git a/rpython/rlib/rvmprof/rvmprof.py b/rpython/rlib/rvmprof/rvmprof.py --- a/rpython/rlib/rvmprof/rvmprof.py +++ b/rpython/rlib/rvmprof/rvmprof.py @@ -32,8 +32,7 @@ else: self._code_unique_id = 0x7000000000000000 self.cintf = cintf.setup() - self._stack = self.cintf.vmprof_stack_new() - + def _cleanup_(self): self.is_enabled = False @@ -148,7 +147,7 @@ """ def decorate(func): try: - _vmprof = _get_vmprof() + _get_vmprof() except cintf.VMProfPlatformUnsupported: return func diff --git a/rpython/rlib/rvmprof/src/vmprof_main.h b/rpython/rlib/rvmprof/src/vmprof_main.h --- a/rpython/rlib/rvmprof/src/vmprof_main.h +++ b/rpython/rlib/rvmprof/src/vmprof_main.h @@ -37,7 +37,6 @@ #include "vmprof_unwind.h" #endif #include "vmprof_mt.h" -#include "vmprof_stack.h" /************************************************************/ @@ -210,7 +209,12 @@ * ************************************************************* */ -static int get_stack_trace(void** result, int max_depth, ucontext_t *ucontext) +static int get_stack_trace(void **result, int max_depth, ucontext_t *ucontext) +{ + return 0; +} + +static int xxx_get_stack_trace(void** result, int max_depth, ucontext_t *ucontext) { void *ip; int n = 0; diff --git a/rpython/rlib/rvmprof/src/vmprof_stack.h b/rpython/rlib/rvmprof/src/vmprof_stack.h deleted file mode 100644 --- a/rpython/rlib/rvmprof/src/vmprof_stack.h +++ /dev/null @@ -1,46 +0,0 @@ - -#define STACK_SIZE 8192 -#include <stdlib.h> - -typedef stuct vmprof_stack { - -} vmprof_stack; - -typedef struct vmprof_stack { - volatile long stack_depth; - long stack_items[STACK_SIZE]; -} vmprof_stack; - -RPY_EXTERN void *vmprof_stack_new(void) -{ - vmprof_stack* stack = (vmprof_stack *)malloc(sizeof(vmprof_stack)); - stack->stack_depth = 0; - return (void*)stack; -} - -RPY_EXTERN int vmprof_stack_append(void *_stack, long item) -{ - vmprof_stack* stack = (vmprof_stack*)_stack; - if (stack->stack_depth >= STACK_SIZE - 1) - return -1; - stack->stack_items[stack->stack_depth] = item; - stack->stack_depth += 1; - return 0; -} - -RPY_EXTERN long vmprof_stack_pop(void *_stack) -{ - vmprof_stack* stack = (vmprof_stack*)_stack; - long res; - - if (stack->stack_depth <= 0) - return -1; - res = stack->stack_items[stack->stack_depth]; - stack->stack_depth -= 1; - return res; -} - -RPY_EXTERN void vmprof_stack_free(void* stack) -{ - free(stack); -} \ No newline at end of file diff --git a/rpython/rlib/rvmprof/test/test_rvmprof.py b/rpython/rlib/rvmprof/test/test_rvmprof.py --- a/rpython/rlib/rvmprof/test/test_rvmprof.py +++ b/rpython/rlib/rvmprof/test/test_rvmprof.py @@ -25,7 +25,7 @@ return 0 assert f() == 0 - fn = compile(f, []) + fn = compile(f, [], gcpolicy="minimark") assert fn() == 0 @@ -53,7 +53,7 @@ return 0 assert f() == 0 - fn = compile(f, []) + fn = compile(f, [], gcpolicy="minimark") assert fn() == 0 @@ -79,7 +79,7 @@ return 0 assert f() == 0 - fn = compile(f, []) + fn = compile(f, [], gcpolicy="minimark") assert fn() == 0 _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit