Skip to content

Commit

Permalink
ustack helper should derive constants dynamically
Browse files Browse the repository at this point in the history
  • Loading branch information
Dave Pacheco committed Mar 31, 2012
1 parent 1d44295 commit 69d9235
Show file tree
Hide file tree
Showing 5 changed files with 210 additions and 93 deletions.
47 changes: 41 additions & 6 deletions node.gyp
Expand Up @@ -137,9 +137,12 @@

[ 'node_use_dtrace=="true"', {
'defines': [ 'HAVE_DTRACE=1' ],
'dependencies': [
'node_dtrace_provider_o'
],
'dependencies': [ 'node_dtrace_provider_o' ],
'conditions': [ [
'target_arch=="ia32"', {
'dependencies': [ 'node_dtrace_ustack_o' ]
}
] ],
'libraries': [
# generated implicitly by dependency
'<(PRODUCT_DIR)/obj.target/node/src/node_dtrace.o'
Expand Down Expand Up @@ -267,9 +270,6 @@
'src/node_dtrace.cc'
'src/node_dtrace.h',
],
#'direct_dependent_settings': {
# 'libraries': [ '<(PRODUCT_DIR)/obj.target/node/src/node_dtrace.o' ]
#}
},
{
'target_name': 'node_dtrace_provider_h',
Expand Down Expand Up @@ -303,6 +303,41 @@
'-o', '<@(_outputs)' ]
}
]
},
{
'target_name': 'v8constants',
'type': 'none',
'actions': [
{
'action_name': 'v8constants',
'outputs': [ '<(SHARED_INTERMEDIATE_DIR)/v8constants.h' ],
'inputs': [ '<(PRODUCT_DIR)/obj.target/deps/v8/tools/gyp/libv8_base.a' ],
'action': [
'tools/genv8constants.py',
'<@(_outputs)',
'<@(_inputs)'
]
}
]
},
{
'target_name': 'node_dtrace_ustack_o',
'type': 'none',
'dependencies': [ 'v8constants' ],
'direct_dependent_settings': {
'libraries': [ '<(SHARED_INTERMEDIATE_DIR)/node_ustack.o' ]
},
'actions': [
{
'action_name': 'node_dtrace_ustack',
'outputs': [ '<(SHARED_INTERMEDIATE_DIR)/node_ustack.o' ],
'inputs': [ 'src/v8ustack.d' ],
'action': [
'dtrace', '-32', '-I<(SHARED_INTERMEDIATE_DIR)', '-Isrc',
'-C', '-G', '-s', '<@(_inputs)', '-o', '<@(_outputs)',
]
}
]
}
] # end targets
}
Expand Down
86 changes: 86 additions & 0 deletions src/v8abbr.h
@@ -0,0 +1,86 @@
/*
* This header defines short names for V8 constants for use by the ustack
* helper.
*/

#ifndef V8_ABBR_H
#define V8_ABBR_H

/* Frame pointer offsets */
#define V8_OFF_FP_FUNC ((uint32_t)V8DBG_OFF_FP_FUNCTION)
#define V8_OFF_FP_CONTEXT ((uint32_t)V8DBG_OFF_FP_CONTEXT)
#define V8_OFF_FP_MARKER ((uint32_t)V8DBG_OFF_FP_MARKER)

/* Stack frame types */
#define V8_FT_ENTRY V8DBG_FRAMETYPE_ENTRYFRAME
#define V8_FT_ENTRYCONSTRUCT V8DBG_FRAMETYPE_ENTRYCONSTRUCTFRAME
#define V8_FT_EXIT V8DBG_FRAMETYPE_EXITFRAME
#define V8_FT_JAVASCRIPT V8DBG_FRAMETYPE_JAVASCRIPTFRAME
#define V8_FT_OPTIMIZED V8DBG_FRAMETYPE_OPTIMIZEDFRAME
#define V8_FT_INTERNAL V8DBG_FRAMETYPE_INTERNALFRAME
#define V8_FT_CONSTRUCT V8DBG_FRAMETYPE_CONSTRUCTFRAME
#define V8_FT_ADAPTOR V8DBG_FRAMETYPE_ARGUMENTSADAPTORFRAME

/* Identification masks and tags */
#define V8_SmiTagMask V8DBG_SMITAGMASK
#define V8_SmiTag V8DBG_SMITAG
#define V8_SmiValueShift V8_SmiTagMask

#define V8_HeapObjectTagMask V8DBG_HEAPOBJECTTAGMASK
#define V8_HeapObjectTag V8DBG_HEAPOBJECTTAG

#define V8_IsNotStringMask V8DBG_ISNOTSTRINGMASK
#define V8_StringTag V8DBG_STRINGTAG

#define V8_StringEncodingMask V8DBG_STRINGENCODINGMASK
#define V8_AsciiStringTag V8DBG_ASCIISTRINGTAG

#define V8_StringRepresentationMask V8DBG_STRINGREPRESENTATIONMASK
#define V8_SeqStringTag V8DBG_SEQSTRINGTAG
#define V8_ConsStringTag V8DBG_CONSSTRINGTAG
#define V8_ExternalStringTag V8DBG_EXTERNALSTRINGTAG

/* Instance types */
#define V8_IT_FIXEDARRAY V8DBG_TYPE_FIXEDARRAY__FIXED_ARRAY_TYPE
#define V8_IT_CODE V8DBG_TYPE_CODE__CODE_TYPE

/* Node-specific offsets */
#define NODE_OFF_EXTSTR_DATA 0x4

/* Heap class->field offsets */
#define V8_OFF_HEAP(off) ((off) - 1)

#define V8_OFF_FUNC_SHARED \
V8_OFF_HEAP(V8DBG_CLASS_JSFUNCTION__SHARED__SHAREDFUNCTIONINFO)
#define V8_OFF_SHARED_NAME \
V8_OFF_HEAP(V8DBG_CLASS_SHAREDFUNCTIONINFO__NAME__OBJECT)
#define V8_OFF_SHARED_INFERRED \
V8_OFF_HEAP(V8DBG_CLASS_SHAREDFUNCTIONINFO__INFERRED_NAME__STRING)
#define V8_OFF_SHARED_SCRIPT \
V8_OFF_HEAP(V8DBG_CLASS_SHAREDFUNCTIONINFO__SCRIPT__OBJECT)
#define V8_OFF_SHARED_FUNTOK \
V8_OFF_HEAP(V8DBG_CLASS_SHAREDFUNCTIONINFO__FUNCTION_TOKEN_POSITION__SMI)
#define V8_OFF_SCRIPT_NAME \
V8_OFF_HEAP(V8DBG_CLASS_SCRIPT__NAME__OBJECT)
#define V8_OFF_SCRIPT_LENDS \
V8_OFF_HEAP(V8DBG_CLASS_SCRIPT__LINE_ENDS__OBJECT)
#define V8_OFF_STR_LENGTH \
V8_OFF_HEAP(V8DBG_CLASS_STRING__LENGTH__SMI)
#define V8_OFF_STR_CHARS \
V8_OFF_HEAP(V8DBG_CLASS_SEQASCIISTRING__CHARS__CHAR)
#define V8_OFF_CONSSTR_CAR \
V8_OFF_HEAP(V8DBG_CLASS_CONSSTRING__FIRST__STRING)
#define V8_OFF_CONSSTR_CDR \
V8_OFF_HEAP(V8DBG_CLASS_CONSSTRING__SECOND__STRING)
#define V8_OFF_EXTSTR_RSRC \
V8_OFF_HEAP(V8DBG_CLASS_EXTERNALSTRING__RESOURCE__OBJECT)
#define V8_OFF_FA_SIZE \
V8_OFF_HEAP(V8DBG_CLASS_FIXEDARRAYBASE__LENGTH__SMI)
#define V8_OFF_FA_DATA \
V8_OFF_HEAP(V8DBG_CLASS_FIXEDARRAY__DATA__UINTPTR_T)
#define V8_OFF_HEAPOBJ_MAP \
V8_OFF_HEAP(V8DBG_CLASS_HEAPOBJECT__MAP__MAP)
#define V8_OFF_MAP_ATTRS \
V8_OFF_HEAP(V8DBG_CLASS_MAP__INSTANCE_ATTRIBUTES__INT)

#endif /* V8_ABBR_H */
87 changes: 0 additions & 87 deletions src/v8constants.h

This file was deleted.

1 change: 1 addition & 0 deletions src/v8ustack.d
Expand Up @@ -11,6 +11,7 @@
*/

#include <v8constants.h>
#include <v8abbr.h>

/*
* V8 represents small integers (SMI) using the upper 31 bits of a 32-bit
Expand Down
82 changes: 82 additions & 0 deletions tools/genv8constants.py
@@ -0,0 +1,82 @@
#!/usr/bin/env python

#
# genv8constants.py output_file libv8_base.a
#
# Emits v8dbg constants stored in libv8_base.a in a format suitable for the V8
# ustack helper.
#

import re
import subprocess
import sys

if len(sys.argv) != 3:
print "usage: objsym.py outfile libv8_base.a"
sys.exit(2);

outfile = file(sys.argv[1], 'w');
pipe = subprocess.Popen([ 'objdump', '-z', '-D', sys.argv[2] ],
stdout=subprocess.PIPE).stdout;
pattern = re.compile('00000000 <(v8dbg_.*)>:');
numpattern = re.compile('[0-9a-fA-F]{2}');

outfile.write("""
/*
* File automatically generated by genv8constants. Do not edit.
*
* The following offsets are dynamically from libv8_base.a. See src/v8ustack.d
* for details on how these values are used.
*/
#ifndef V8_CONSTANTS_H
#define V8_CONSTANTS_H
#if defined(__i386)
""");

curr_sym = None;
curr_val = 0;
curr_octet = 0;

for line in pipe:
if curr_sym != None:
#
# This bit of code has nasty knowledge of the objdump text output
# format, but this is the most obvious robust approach. We could almost
# rely on looking at numbered fields, but some instructions look very
# much like hex numbers (e.g., "adc"), and we don't want to risk picking
# those up by mistake, so we look at character-based columns intead.
#
for i in range (0, 3):
# 6-character margin, 2-characters + 1 space for each field
idx = 6 + i * 3;
octetstr = line[idx:idx+2]
if not numpattern.match(octetstr):
break;

curr_val += int('0x%s' % octetstr, 16) << (curr_octet * 8);
curr_octet += 1;

if curr_octet < 4:
continue;

outfile.write("#define %s 0x%x\n" % (curr_sym.upper(), curr_val));
curr_sym = None;
curr_val = 0;
curr_octet = 0;
continue;

match = pattern.match(line)
if match == None:
continue;

curr_sym = match.group(1);

outfile.write("""
#else
#error "only i386 is supported for DTrace ustack helper"
#endif
#endif /* V8_CONSTANTS_H */
""");

0 comments on commit 69d9235

Please sign in to comment.