Skip to content
This repository has been archived by the owner on Apr 22, 2023. It is now read-only.

Commit

Permalink
build: add support for DTrace and postmortem
Browse files Browse the repository at this point in the history
* fixes #2110
* includes V8 postmortem metadata in Solaris builds
* adds GYP support for DTrace probes and ustack helper
* ustack helper derives constants dynamically from libv8_base.a
* build with DTrace support by default on SunOS
  • Loading branch information
Dave Pacheco authored and bnoordhuis committed Apr 1, 2012
1 parent 7bdeed2 commit cc15299
Show file tree
Hide file tree
Showing 7 changed files with 283 additions and 95 deletions.
3 changes: 3 additions & 0 deletions common.gypi
Expand Up @@ -8,6 +8,7 @@
'library%': 'static_library', # allow override to 'shared_library' for DLL/.so builds
'component%': 'static_library', # NB. these names match with what V8 expects
'msvs_multi_core_compile': '0', # we do enable multicore compiles, but not using the V8 way
'v8_postmortem_support': 'true', # V8's postmortem metadata
},

'target_defaults': {
Expand Down Expand Up @@ -42,6 +43,8 @@
}],
['OS=="solaris"', {
'cflags': [ '-fno-omit-frame-pointer' ],
# pull in V8's postmortem metadata
'ldflags': [ '-Wl,-z,allextract' ]
}],
['strict_aliasing!="true"', {
'cflags': [ '-fno-strict-aliasing' ],
Expand Down
18 changes: 16 additions & 2 deletions configure
Expand Up @@ -108,7 +108,12 @@ parser.add_option("--shared-zlib-libname",
parser.add_option("--with-dtrace",
action="store_true",
dest="with_dtrace",
help="Build with DTrace (experimental)")
help="Build with DTrace (default is true on supported systems)")

parser.add_option("--without-dtrace",
action="store_true",
dest="without_dtrace",
help="Build without DTrace")

# CHECKME does this still work with recent releases of V8?
parser.add_option("--gdb",
Expand Down Expand Up @@ -225,7 +230,6 @@ def gcc_version():
def configure_node(o):
# TODO add gdb
o['variables']['node_prefix'] = options.prefix if options.prefix else ''
o['variables']['node_use_dtrace'] = b(options.with_dtrace)
o['variables']['node_install_npm'] = b(not options.without_npm)
o['variables']['node_install_waf'] = b(not options.without_waf)
o['variables']['host_arch'] = host_arch()
Expand All @@ -242,6 +246,16 @@ def configure_node(o):
if 'clang' not in CC and gcc_version() < [False, 4, 0, 0]:
o['variables']['visibility'] = ''

# By default, enable DTrace on SunOS systems. Don't allow it on other
# systems, since it won't work. (The MacOS build process is different than
# SunOS, and we haven't implemented it.)
if sys.platform.startswith('sunos'):
o['variables']['node_use_dtrace'] = b(not options.without_dtrace);
elif b(options.with_dtrace) == 'true':
raise Exception('DTrace is currently only supported on SunOS systems.')
else:
o['variables']['node_use_dtrace'] = 'false'


def configure_libz(o):
o['variables']['node_shared_zlib'] = b(options.shared_zlib)
Expand Down
101 changes: 95 additions & 6 deletions node.gyp
Expand Up @@ -4,7 +4,7 @@
# Turn off -Werror in V8
# See http://codereview.chromium.org/8159015
'werror': '',
'node_use_dtrace': 'false',
'node_use_dtrace%': 'false',
'node_shared_v8%': 'false',
'node_shared_zlib%': 'false',
'node_use_openssl%': 'true',
Expand Down Expand Up @@ -138,14 +138,26 @@
}],

[ 'node_use_dtrace=="true"', {
'defines': [ 'HAVE_DTRACE=1' ],
'dependencies': [ 'node_dtrace_header' ],
'include_dirs': [ '<(SHARED_INTERMEDIATE_DIR)' ],
#
# node_dtrace_provider.cc and node_dtrace_ustack.cc do not actually
# exist. They're here to trick GYP into linking the corresponding
# object files into the final "node" executable. These files are
# generated by "dtrace -G" using custom actions below, and the
# GYP-generated Makefiles will properly build them when needed.
#
'sources': [
'src/node_dtrace.cc',
'src/node_dtrace.h',
# why does node_provider.h get generated into src and not
# SHARED_INTERMEDIATE_DIR?
'src/node_provider.h',
'src/node_dtrace_provider.cc'
],
}],
'conditions': [ [
'target_arch=="ia32"', {
'sources': [ 'src/node_dtrace_ustack.cc' ]
}
] ],
} ],

[ 'node_shared_v8=="true"', {
'sources': [
Expand Down Expand Up @@ -254,6 +266,83 @@
},
],
}, # end node_js2c
{
'target_name': 'node_dtrace_header',
'type': 'none',
'conditions': [
[ 'node_use_dtrace=="true"', {
'actions': [
{
'action_name': 'node_dtrace_header',
'inputs': [ 'src/node_provider.d' ],
'outputs': [ '<(SHARED_INTERMEDIATE_DIR)/node_provider.h' ],
'action': [ 'dtrace', '-h', '-xnolibs', '-s', '<@(_inputs)',
'-o', '<@(_outputs)' ]
}
]
} ]
]
},
{
'target_name': 'node_dtrace_provider',
'type': 'none',
'conditions': [
[ 'node_use_dtrace=="true"', {
'actions': [
{
'action_name': 'node_dtrace_provider_o',
'inputs': [
'src/node_provider.d',
'<(PRODUCT_DIR)/obj.target/node/src/node_dtrace.o'
],
'outputs': [
'<(PRODUCT_DIR)/obj.target/node/src/node_dtrace_provider.o'
],
'action': [ 'dtrace', '-G', '-xnolibs', '-s', '<@(_inputs)',
'-o', '<@(_outputs)' ]
}
]
} ]
]
},
{
'target_name': 'node_dtrace_ustack',
'type': 'none',
'conditions': [
[ 'node_use_dtrace=="true"', {
'actions': [
{
'action_name': 'node_dtrace_ustack_constants',
'inputs': [
'<(PRODUCT_DIR)/obj.target/deps/v8/tools/gyp/libv8_base.a'
],
'outputs': [
'<(SHARED_INTERMEDIATE_DIR)/v8constants.h'
],
'action': [
'tools/genv8constants.py',
'<@(_outputs)',
'<@(_inputs)'
]
},
{
'action_name': 'node_dtrace_ustack',
'inputs': [
'src/v8ustack.d',
'<(SHARED_INTERMEDIATE_DIR)/v8constants.h'
],
'outputs': [
'<(PRODUCT_DIR)/obj.target/node/src/node_dtrace_ustack.o'
],
'action': [
'dtrace', '-32', '-I<(SHARED_INTERMEDIATE_DIR)', '-Isrc',
'-C', '-G', '-s', 'src/v8ustack.d', '-o', '<@(_outputs)',
]
}
]
} ],
]
}
] # end targets
}

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

0 comments on commit cc15299

Please sign in to comment.