v8  3.11.10(node0.8.26)
V8 is Google's open source JavaScript engine
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
test-log-stack-tracer.cc
Go to the documentation of this file.
1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are
4 // met:
5 //
6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided
11 // with the distribution.
12 // * Neither the name of Google Inc. nor the names of its
13 // contributors may be used to endorse or promote products derived
14 // from this software without specific prior written permission.
15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 //
28 // Tests of profiler-related functions from log.h
29 
30 #include <stdlib.h>
31 
32 #include "v8.h"
33 
34 #include "api.h"
35 #include "codegen.h"
36 #include "log.h"
37 #include "isolate.h"
38 #include "cctest.h"
39 #include "disassembler.h"
40 #include "vm-state-inl.h"
41 
42 using v8::Function;
43 using v8::Local;
44 using v8::Object;
45 using v8::Script;
46 using v8::String;
47 using v8::Value;
48 
49 using v8::internal::byte;
56 
57 
59 
60 
61 static struct {
63 } trace_env = { NULL };
64 
65 
66 static void InitTraceEnv(TickSample* sample) {
67  trace_env.sample = sample;
68 }
69 
70 
71 static void DoTrace(Address fp) {
72  trace_env.sample->fp = fp;
73  // sp is only used to define stack high bound
74  trace_env.sample->sp =
75  reinterpret_cast<Address>(trace_env.sample) - 10240;
76  StackTracer::Trace(Isolate::Current(), trace_env.sample);
77 }
78 
79 
80 // Hide c_entry_fp to emulate situation when sampling is done while
81 // pure JS code is being executed
82 static void DoTraceHideCEntryFPAddress(Address fp) {
83  v8::internal::Address saved_c_frame_fp =
84  *(Isolate::Current()->c_entry_fp_address());
85  CHECK(saved_c_frame_fp);
86  *(Isolate::Current()->c_entry_fp_address()) = 0;
87  DoTrace(fp);
88  *(Isolate::Current()->c_entry_fp_address()) = saved_c_frame_fp;
89 }
90 
91 
92 // --- T r a c e E x t e n s i o n ---
93 
94 class TraceExtension : public v8::Extension {
95  public:
96  TraceExtension() : v8::Extension("v8/trace", kSource) { }
99  static v8::Handle<v8::Value> Trace(const v8::Arguments& args);
100  static v8::Handle<v8::Value> JSTrace(const v8::Arguments& args);
101  static v8::Handle<v8::Value> JSEntrySP(const v8::Arguments& args);
103  private:
104  static Address GetFP(const v8::Arguments& args);
105  static const char* kSource;
106 };
107 
108 
109 const char* TraceExtension::kSource =
110  "native function trace();"
111  "native function js_trace();"
112  "native function js_entry_sp();"
113  "native function js_entry_sp_level2();";
114 
117  if (name->Equals(String::New("trace"))) {
119  } else if (name->Equals(String::New("js_trace"))) {
121  } else if (name->Equals(String::New("js_entry_sp"))) {
123  } else if (name->Equals(String::New("js_entry_sp_level2"))) {
125  } else {
126  CHECK(false);
128  }
129 }
130 
131 
132 Address TraceExtension::GetFP(const v8::Arguments& args) {
133  // Convert frame pointer from encoding as smis in the arguments to a pointer.
134  CHECK_EQ(2, args.Length()); // Ignore second argument on 32-bit platform.
135 #if defined(V8_HOST_ARCH_32_BIT)
136  Address fp = *reinterpret_cast<Address*>(*args[0]);
137 #elif defined(V8_HOST_ARCH_64_BIT)
138  int64_t low_bits = *reinterpret_cast<uint64_t*>(*args[0]) >> 32;
139  int64_t high_bits = *reinterpret_cast<uint64_t*>(*args[1]);
140  Address fp = reinterpret_cast<Address>(high_bits | low_bits);
141 #else
142 #error Host architecture is neither 32-bit nor 64-bit.
143 #endif
144  printf("Trace: %p\n", fp);
145  return fp;
146 }
147 
148 
150  DoTrace(GetFP(args));
151  return v8::Undefined();
152 }
153 
154 
156  DoTraceHideCEntryFPAddress(GetFP(args));
157  return v8::Undefined();
158 }
159 
160 
161 static Address GetJsEntrySp() {
162  CHECK_NE(NULL, i::Isolate::Current()->thread_local_top());
163  return Isolate::js_entry_sp(i::Isolate::Current()->thread_local_top());
164 }
165 
166 
168  CHECK_NE(0, GetJsEntrySp());
169  return v8::Undefined();
170 }
171 
172 
174  const v8::Arguments& args) {
175  v8::HandleScope scope;
176  const Address js_entry_sp = GetJsEntrySp();
177  CHECK_NE(0, js_entry_sp);
178  CompileRun("js_entry_sp();");
179  CHECK_EQ(js_entry_sp, GetJsEntrySp());
180  return v8::Undefined();
181 }
182 
183 
184 static TraceExtension kTraceExtension;
185 v8::DeclareExtension kTraceExtensionDeclaration(&kTraceExtension);
186 
187 
188 static void InitializeVM() {
189  if (env.IsEmpty()) {
190  v8::HandleScope scope;
191  const char* extensions[] = { "v8/trace" };
192  v8::ExtensionConfiguration config(1, extensions);
193  env = v8::Context::New(&config);
194  }
195  v8::HandleScope scope;
196  env->Enter();
197 }
198 
199 
200 static bool IsAddressWithinFuncCode(JSFunction* function, Address addr) {
201  i::Code* code = function->code();
202  return code->contains(addr);
203 }
204 
205 static bool IsAddressWithinFuncCode(const char* func_name, Address addr) {
206  v8::Local<v8::Value> func = env->Global()->Get(v8_str(func_name));
207  CHECK(func->IsFunction());
208  JSFunction* js_func = JSFunction::cast(*v8::Utils::OpenHandle(*func));
209  return IsAddressWithinFuncCode(js_func, addr);
210 }
211 
212 
213 // This C++ function is called as a constructor, to grab the frame pointer
214 // from the calling function. When this function runs, the stack contains
215 // a C_Entry frame and a Construct frame above the calling function's frame.
216 static v8::Handle<Value> construct_call(const v8::Arguments& args) {
217  i::StackFrameIterator frame_iterator;
218  CHECK(frame_iterator.frame()->is_exit());
219  frame_iterator.Advance();
220  CHECK(frame_iterator.frame()->is_construct());
221  frame_iterator.Advance();
222  i::StackFrame* calling_frame = frame_iterator.frame();
223  CHECK(calling_frame->is_java_script());
224 
225 #if defined(V8_HOST_ARCH_32_BIT)
226  int32_t low_bits = reinterpret_cast<int32_t>(calling_frame->fp());
227  args.This()->Set(v8_str("low_bits"), v8_num(low_bits >> 1));
228 #elif defined(V8_HOST_ARCH_64_BIT)
229  uint64_t fp = reinterpret_cast<uint64_t>(calling_frame->fp());
230  int32_t low_bits = static_cast<int32_t>(fp & 0xffffffff);
231  int32_t high_bits = static_cast<int32_t>(fp >> 32);
232  args.This()->Set(v8_str("low_bits"), v8_num(low_bits));
233  args.This()->Set(v8_str("high_bits"), v8_num(high_bits));
234 #else
235 #error Host architecture is neither 32-bit nor 64-bit.
236 #endif
237  return args.This();
238 }
239 
240 
241 // Use the API to create a JSFunction object that calls the above C++ function.
242 void CreateFramePointerGrabberConstructor(const char* constructor_name) {
243  Local<v8::FunctionTemplate> constructor_template =
244  v8::FunctionTemplate::New(construct_call);
245  constructor_template->SetClassName(v8_str("FPGrabber"));
246  Local<Function> fun = constructor_template->GetFunction();
247  env->Global()->Set(v8_str(constructor_name), fun);
248 }
249 
250 
251 // Creates a global function named 'func_name' that calls the tracing
252 // function 'trace_func_name' with an actual EBP register value,
253 // encoded as one or two Smis.
254 static void CreateTraceCallerFunction(const char* func_name,
255  const char* trace_func_name) {
256  i::EmbeddedVector<char, 256> trace_call_buf;
257  i::OS::SNPrintF(trace_call_buf,
258  "function %s() {"
259  " fp = new FPGrabber();"
260  " %s(fp.low_bits, fp.high_bits);"
261  "}",
262  func_name, trace_func_name);
263 
264  // Create the FPGrabber function, which grabs the caller's frame pointer
265  // when called as a constructor.
267 
268  // Compile the script.
269  CompileRun(trace_call_buf.start());
270 }
271 
272 
273 // This test verifies that stack tracing works when called during
274 // execution of a native function called from JS code. In this case,
275 // StackTracer uses Isolate::c_entry_fp as a starting point for stack
276 // walking.
277 TEST(CFromJSStackTrace) {
278  // BUG(1303) Inlining of JSFuncDoTrace() in JSTrace below breaks this test.
279  i::FLAG_use_inlining = false;
280 
282  InitTraceEnv(&sample);
283 
284  InitializeVM();
285  v8::HandleScope scope;
286  // Create global function JSFuncDoTrace which calls
287  // extension function trace() with the current frame pointer value.
288  CreateTraceCallerFunction("JSFuncDoTrace", "trace");
289  Local<Value> result = CompileRun(
290  "function JSTrace() {"
291  " JSFuncDoTrace();"
292  "};\n"
293  "JSTrace();\n"
294  "true;");
295  CHECK(!result.IsEmpty());
296  // When stack tracer is invoked, the stack should look as follows:
297  // script [JS]
298  // JSTrace() [JS]
299  // JSFuncDoTrace() [JS] [captures EBP value and encodes it as Smi]
300  // trace(EBP) [native (extension)]
301  // DoTrace(EBP) [native]
302  // StackTracer::Trace
303 
306 
307  // Stack tracing will start from the first JS function, i.e. "JSFuncDoTrace"
308  int base = 0;
309  CHECK_GT(sample.frames_count, base + 1);
310 
311  CHECK(IsAddressWithinFuncCode("JSFuncDoTrace", sample.stack[base + 0]));
312  CHECK(IsAddressWithinFuncCode("JSTrace", sample.stack[base + 1]));
313 }
314 
315 
316 // This test verifies that stack tracing works when called during
317 // execution of JS code. However, as calling StackTracer requires
318 // entering native code, we can only emulate pure JS by erasing
319 // Isolate::c_entry_fp value. In this case, StackTracer uses passed frame
320 // pointer value as a starting point for stack walking.
321 TEST(PureJSStackTrace) {
322  // This test does not pass with inlining enabled since inlined functions
323  // don't appear in the stack trace.
324  i::FLAG_use_inlining = false;
325 
327  InitTraceEnv(&sample);
328 
329  InitializeVM();
330  v8::HandleScope scope;
331  // Create global function JSFuncDoTrace which calls
332  // extension function js_trace() with the current frame pointer value.
333  CreateTraceCallerFunction("JSFuncDoTrace", "js_trace");
334  Local<Value> result = CompileRun(
335  "function JSTrace() {"
336  " JSFuncDoTrace();"
337  "};\n"
338  "function OuterJSTrace() {"
339  " JSTrace();"
340  "};\n"
341  "OuterJSTrace();\n"
342  "true;");
343  CHECK(!result.IsEmpty());
344  // When stack tracer is invoked, the stack should look as follows:
345  // script [JS]
346  // OuterJSTrace() [JS]
347  // JSTrace() [JS]
348  // JSFuncDoTrace() [JS]
349  // js_trace(EBP) [native (extension)]
350  // DoTraceHideCEntryFPAddress(EBP) [native]
351  // StackTracer::Trace
352  //
353 
356 
357  // Stack sampling will start from the caller of JSFuncDoTrace, i.e. "JSTrace"
358  int base = 0;
359  CHECK_GT(sample.frames_count, base + 1);
360  CHECK(IsAddressWithinFuncCode("JSTrace", sample.stack[base + 0]));
361  CHECK(IsAddressWithinFuncCode("OuterJSTrace", sample.stack[base + 1]));
362 }
363 
364 
365 static void CFuncDoTrace(byte dummy_parameter) {
366  Address fp;
367 #ifdef __GNUC__
368  fp = reinterpret_cast<Address>(__builtin_frame_address(0));
369 #elif defined _MSC_VER
370  // Approximate a frame pointer address. We compile without base pointers,
371  // so we can't trust ebp/rbp.
372  fp = &dummy_parameter - 2 * sizeof(void*); // NOLINT
373 #else
374 #error Unexpected platform.
375 #endif
376  DoTrace(fp);
377 }
378 
379 
380 static int CFunc(int depth) {
381  if (depth <= 0) {
382  CFuncDoTrace(0);
383  return 0;
384  } else {
385  return CFunc(depth - 1) + 1;
386  }
387 }
388 
389 
390 // This test verifies that stack tracing doesn't crash when called on
391 // pure native code. StackTracer only unrolls JS code, so we can't
392 // get any meaningful info here.
393 TEST(PureCStackTrace) {
395  InitTraceEnv(&sample);
396  InitializeVM();
397  // Check that sampler doesn't crash
398  CHECK_EQ(10, CFunc(10));
399 }
400 
401 
402 TEST(JsEntrySp) {
403  InitializeVM();
404  v8::HandleScope scope;
405  CHECK_EQ(0, GetJsEntrySp());
406  CompileRun("a = 1; b = a + 1;");
407  CHECK_EQ(0, GetJsEntrySp());
408  CompileRun("js_entry_sp();");
409  CHECK_EQ(0, GetJsEntrySp());
410  CompileRun("js_entry_sp_level2();");
411  CHECK_EQ(0, GetJsEntrySp());
412 }
byte * Address
Definition: globals.h:172
unsigned char byte
Definition: disasm.h:33
#define CHECK_EQ(expected, value)
Definition: checks.h:219
static Local< FunctionTemplate > New(InvocationCallback callback=0, Handle< Value > data=Handle< Value >(), Handle< Signature > signature=Handle< Signature >())
Definition: api.cc:943
Extension(const char *name, const char *source=0, int dep_count=0, const char **deps=0, int source_length=-1)
Definition: api.cc:531
Definition: v8.h:863
#define CHECK_GT(a, b)
Definition: checks.h:227
value format" "after each garbage collection") DEFINE_bool(print_cumulative_gc_stat, false, "print cumulative GC statistics in name=value format on exit") DEFINE_bool(trace_gc_verbose, false, "print more details following each garbage collection") DEFINE_bool(trace_fragmentation, false, "report fragmentation for old pointer and data pages") DEFINE_bool(collect_maps, true, "garbage collect maps from which no objects can be reached") DEFINE_bool(flush_code, true, "flush code that we expect not to use again before full gc") DEFINE_bool(incremental_marking, true, "use incremental marking") DEFINE_bool(incremental_marking_steps, true, "do incremental marking steps") DEFINE_bool(trace_incremental_marking, false, "trace progress of the incremental marking") DEFINE_bool(use_idle_notification, true, "Use idle notification to reduce memory footprint.") DEFINE_bool(send_idle_notification, false, "Send idle notifcation between stress runs.") DEFINE_bool(use_ic, true, "use inline caching") DEFINE_bool(native_code_counters, false, "generate extra code for manipulating stats counters") DEFINE_bool(always_compact, false, "Perform compaction on every full GC") DEFINE_bool(lazy_sweeping, true, "Use lazy sweeping for old pointer and data spaces") DEFINE_bool(never_compact, false, "Never perform compaction on full GC-testing only") DEFINE_bool(compact_code_space, true, "Compact code space on full non-incremental collections") DEFINE_bool(cleanup_code_caches_at_gc, true, "Flush inline caches prior to mark compact collection and" "flush code caches in maps during mark compact cycle.") DEFINE_int(random_seed, 0, "Default seed for initializing random generator" "(0, the default, means to use system random).") DEFINE_bool(use_verbose_printer, true, "allows verbose printing") DEFINE_bool(allow_natives_syntax, false, "allow natives syntax") DEFINE_bool(trace_sim, false, "Trace simulator execution") DEFINE_bool(check_icache, false, "Check icache flushes in ARM and MIPS simulator") DEFINE_int(stop_sim_at, 0, "Simulator stop after x number of instructions") DEFINE_int(sim_stack_alignment, 8, "Stack alingment in bytes in simulator(4 or 8, 8 is default)") DEFINE_bool(trace_exception, false, "print stack trace when throwing exceptions") DEFINE_bool(preallocate_message_memory, false, "preallocate some memory to build stack traces.") DEFINE_bool(randomize_hashes, true, "randomize hashes to avoid predictable hash collisions" "(with snapshots this option cannot override the baked-in seed)") DEFINE_int(hash_seed, 0, "Fixed seed to use to hash property keys(0 means random)" "(with snapshots this option cannot override the baked-in seed)") DEFINE_bool(preemption, false, "activate a 100ms timer that switches between V8 threads") DEFINE_bool(regexp_optimization, true, "generate optimized regexp code") DEFINE_bool(testing_bool_flag, true, "testing_bool_flag") DEFINE_int(testing_int_flag, 13, "testing_int_flag") DEFINE_float(testing_float_flag, 2.5, "float-flag") DEFINE_string(testing_string_flag, "Hello, world!", "string-flag") DEFINE_int(testing_prng_seed, 42, "Seed used for threading test randomness") DEFINE_string(testing_serialization_file, "/tmp/serdes", "file in which to serialize heap") DEFINE_bool(help, false, "Print usage message, including flags, on console") DEFINE_bool(dump_counters, false, "Dump counters on exit") DEFINE_string(map_counters, "", "Map counters to a file") DEFINE_args(js_arguments, JSARGUMENTS_INIT, "Pass all remaining arguments to the script.Alias for\"--\".") DEFINE_bool(debug_compile_events, true,"Enable debugger compile events") DEFINE_bool(debug_script_collected_events, true,"Enable debugger script collected events") DEFINE_bool(gdbjit, false,"enable GDBJIT interface (disables compacting GC)") DEFINE_bool(gdbjit_full, false,"enable GDBJIT interface for all code objects") DEFINE_bool(gdbjit_dump, false,"dump elf objects with debug info to disk") DEFINE_string(gdbjit_dump_filter,"","dump only objects containing this substring") DEFINE_bool(force_marking_deque_overflows, false,"force overflows of marking deque by reducing it's size ""to 64 words") DEFINE_bool(stress_compaction, false,"stress the GC compactor to flush out bugs (implies ""--force_marking_deque_overflows)")#define FLAG DEFINE_bool(enable_slow_asserts, false,"enable asserts that are slow to execute") DEFINE_bool(trace_codegen, false,"print name of functions for which code is generated") DEFINE_bool(print_source, false,"pretty print source code") DEFINE_bool(print_builtin_source, false,"pretty print source code for builtins") DEFINE_bool(print_ast, false,"print source AST") DEFINE_bool(print_builtin_ast, false,"print source AST for builtins") DEFINE_string(stop_at,"","function name where to insert a breakpoint") DEFINE_bool(print_builtin_scopes, false,"print scopes for builtins") DEFINE_bool(print_scopes, false,"print scopes") DEFINE_bool(trace_contexts, false,"trace contexts operations") DEFINE_bool(gc_greedy, false,"perform GC prior to some allocations") DEFINE_bool(gc_verbose, false,"print stuff during garbage collection") DEFINE_bool(heap_stats, false,"report heap statistics before and after GC") DEFINE_bool(code_stats, false,"report code statistics after GC") DEFINE_bool(verify_heap, false,"verify heap pointers before and after GC") DEFINE_bool(print_handles, false,"report handles after GC") DEFINE_bool(print_global_handles, false,"report global handles after GC") DEFINE_bool(trace_ic, false,"trace inline cache state transitions") DEFINE_bool(print_interfaces, false,"print interfaces") DEFINE_bool(print_interface_details, false,"print interface inference details") DEFINE_int(print_interface_depth, 5,"depth for printing interfaces") DEFINE_bool(trace_normalization, false,"prints when objects are turned into dictionaries.") DEFINE_bool(trace_lazy, false,"trace lazy compilation") DEFINE_bool(collect_heap_spill_statistics, false,"report heap spill statistics along with heap_stats ""(requires heap_stats)") DEFINE_bool(trace_isolates, false,"trace isolate state changes") DEFINE_bool(log_state_changes, false,"Log state changes.") DEFINE_bool(regexp_possessive_quantifier, false,"enable possessive quantifier syntax for testing") DEFINE_bool(trace_regexp_bytecodes, false,"trace regexp bytecode execution") DEFINE_bool(trace_regexp_assembler, false,"trace regexp macro assembler calls.")#define FLAG DEFINE_bool(log, false,"Minimal logging (no API, code, GC, suspect, or handles samples).") DEFINE_bool(log_all, false,"Log all events to the log file.") DEFINE_bool(log_runtime, false,"Activate runtime system %Log call.") DEFINE_bool(log_api, false,"Log API events to the log file.") DEFINE_bool(log_code, false,"Log code events to the log file without profiling.") DEFINE_bool(log_gc, false,"Log heap samples on garbage collection for the hp2ps tool.") DEFINE_bool(log_handles, false,"Log global handle events.") DEFINE_bool(log_snapshot_positions, false,"log positions of (de)serialized objects in the snapshot.") DEFINE_bool(log_suspect, false,"Log suspect operations.") DEFINE_bool(prof, false,"Log statistical profiling information (implies --log-code).") DEFINE_bool(prof_auto, true,"Used with --prof, starts profiling automatically") DEFINE_bool(prof_lazy, false,"Used with --prof, only does sampling and logging"" when profiler is active (implies --noprof_auto).") DEFINE_bool(prof_browser_mode, true,"Used with --prof, turns on browser-compatible mode for profiling.") DEFINE_bool(log_regexp, false,"Log regular expression execution.") DEFINE_bool(sliding_state_window, false,"Update sliding state window counters.") DEFINE_string(logfile,"v8.log","Specify the name of the log file.") DEFINE_bool(ll_prof, false,"Enable low-level linux profiler.")#define FLAG DEFINE_bool(trace_elements_transitions, false,"trace elements transitions") DEFINE_bool(print_code_stubs, false,"print code stubs") DEFINE_bool(test_secondary_stub_cache, false,"test secondary stub cache by disabling the primary one") DEFINE_bool(test_primary_stub_cache, false,"test primary stub cache by disabling the secondary one") DEFINE_bool(print_code, false,"print generated code") DEFINE_bool(print_opt_code, false,"print optimized code") DEFINE_bool(print_unopt_code, false,"print unoptimized code before ""printing optimized code based on it") DEFINE_bool(print_code_verbose, false,"print more information for code") DEFINE_bool(print_builtin_code, false,"print generated code for builtins")#43"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flags.cc"2#define FLAG_MODE_DEFINE_DEFAULTS#1"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flag-definitions.h"1#define FLAG_FULL(ftype, ctype, nam, def, cmt)#define FLAG_READONLY(ftype, ctype, nam, def, cmt)#define DEFINE_implication(whenflag, thenflag)#define DEFINE_bool(nam, def, cmt)#define DEFINE_int(nam, def, cmt)#define DEFINE_float(nam, def, cmt)#define DEFINE_string(nam, def, cmt)#define DEFINE_args(nam, def, cmt)#define FLAG DEFINE_bool(use_strict, false,"enforce strict mode") DEFINE_bool(es5_readonly, false,"activate correct semantics for inheriting readonliness") DEFINE_bool(es52_globals, false,"activate new semantics for global var declarations") DEFINE_bool(harmony_typeof, false,"enable harmony semantics for typeof") DEFINE_bool(harmony_scoping, false,"enable harmony block scoping") DEFINE_bool(harmony_modules, false,"enable harmony modules (implies block scoping)") DEFINE_bool(harmony_proxies, false,"enable harmony proxies") DEFINE_bool(harmony_collections, false,"enable harmony collections (sets, maps, and weak maps)") DEFINE_bool(harmony, false,"enable all harmony features (except typeof)") DEFINE_implication(harmony, harmony_scoping) DEFINE_implication(harmony, harmony_modules) DEFINE_implication(harmony, harmony_proxies) DEFINE_implication(harmony, harmony_collections) DEFINE_implication(harmony_modules, harmony_scoping) DEFINE_bool(packed_arrays, false,"optimizes arrays that have no holes") DEFINE_bool(smi_only_arrays, true,"tracks arrays with only smi values") DEFINE_bool(clever_optimizations, true,"Optimize object size, Array shift, DOM strings and string +") DEFINE_bool(unbox_double_arrays, true,"automatically unbox arrays of doubles") DEFINE_bool(string_slices, true,"use string slices") DEFINE_bool(crankshaft, true,"use crankshaft") DEFINE_string(hydrogen_filter,"","optimization filter") DEFINE_bool(use_range, true,"use hydrogen range analysis") DEFINE_bool(eliminate_dead_phis, true,"eliminate dead phis") DEFINE_bool(use_gvn, true,"use hydrogen global value numbering") DEFINE_bool(use_canonicalizing, true,"use hydrogen instruction canonicalizing") DEFINE_bool(use_inlining, true,"use function inlining") DEFINE_int(max_inlined_source_size, 600,"maximum source size in bytes considered for a single inlining") DEFINE_int(max_inlined_nodes, 196,"maximum number of AST nodes considered for a single inlining") DEFINE_int(max_inlined_nodes_cumulative, 196,"maximum cumulative number of AST nodes considered for inlining") DEFINE_bool(loop_invariant_code_motion, true,"loop invariant code motion") DEFINE_bool(collect_megamorphic_maps_from_stub_cache, true,"crankshaft harvests type feedback from stub cache") DEFINE_bool(hydrogen_stats, false,"print statistics for hydrogen") DEFINE_bool(trace_hydrogen, false,"trace generated hydrogen to file") DEFINE_string(trace_phase,"Z","trace generated IR for specified phases") DEFINE_bool(trace_inlining, false,"trace inlining decisions") DEFINE_bool(trace_alloc, false,"trace register allocator") DEFINE_bool(trace_all_uses, false,"trace all use positions") DEFINE_bool(trace_range, false,"trace range analysis") DEFINE_bool(trace_gvn, false,"trace global value numbering") DEFINE_bool(trace_representation, false,"trace representation types") DEFINE_bool(stress_pointer_maps, false,"pointer map for every instruction") DEFINE_bool(stress_environments, false,"environment for every instruction") DEFINE_int(deopt_every_n_times, 0,"deoptimize every n times a deopt point is passed") DEFINE_bool(trap_on_deopt, false,"put a break point before deoptimizing") DEFINE_bool(deoptimize_uncommon_cases, true,"deoptimize uncommon cases") DEFINE_bool(polymorphic_inlining, true,"polymorphic inlining") DEFINE_bool(use_osr, true,"use on-stack replacement") DEFINE_bool(array_bounds_checks_elimination, false,"perform array bounds checks elimination") DEFINE_bool(array_index_dehoisting, false,"perform array index dehoisting") DEFINE_bool(trace_osr, false,"trace on-stack replacement") DEFINE_int(stress_runs, 0,"number of stress runs") DEFINE_bool(optimize_closures, true,"optimize closures") DEFINE_bool(inline_construct, true,"inline constructor calls") DEFINE_bool(inline_arguments, true,"inline functions with arguments object") DEFINE_int(loop_weight, 1,"loop weight for representation inference") DEFINE_bool(optimize_for_in, true,"optimize functions containing for-in loops") DEFINE_bool(experimental_profiler, true,"enable all profiler experiments") DEFINE_bool(watch_ic_patching, false,"profiler considers IC stability") DEFINE_int(frame_count, 1,"number of stack frames inspected by the profiler") DEFINE_bool(self_optimization, false,"primitive functions trigger their own optimization") DEFINE_bool(direct_self_opt, false,"call recompile stub directly when self-optimizing") DEFINE_bool(retry_self_opt, false,"re-try self-optimization if it failed") DEFINE_bool(count_based_interrupts, false,"trigger profiler ticks based on counting instead of timing") DEFINE_bool(interrupt_at_exit, false,"insert an interrupt check at function exit") DEFINE_bool(weighted_back_edges, false,"weight back edges by jump distance for interrupt triggering") DEFINE_int(interrupt_budget, 5900,"execution budget before interrupt is triggered") DEFINE_int(type_info_threshold, 15,"percentage of ICs that must have type info to allow optimization") DEFINE_int(self_opt_count, 130,"call count before self-optimization") DEFINE_implication(experimental_profiler, watch_ic_patching) DEFINE_implication(experimental_profiler, self_optimization) DEFINE_implication(experimental_profiler, retry_self_opt) DEFINE_implication(experimental_profiler, count_based_interrupts) DEFINE_implication(experimental_profiler, interrupt_at_exit) DEFINE_implication(experimental_profiler, weighted_back_edges) DEFINE_bool(trace_opt_verbose, false,"extra verbose compilation tracing") DEFINE_implication(trace_opt_verbose, trace_opt) DEFINE_bool(debug_code, false,"generate extra code (assertions) for debugging") DEFINE_bool(code_comments, false,"emit comments in code disassembly") DEFINE_bool(enable_sse2, true,"enable use of SSE2 instructions if available") DEFINE_bool(enable_sse3, true,"enable use of SSE3 instructions if available") DEFINE_bool(enable_sse4_1, true,"enable use of SSE4.1 instructions if available") DEFINE_bool(enable_cmov, true,"enable use of CMOV instruction if available") DEFINE_bool(enable_rdtsc, true,"enable use of RDTSC instruction if available") DEFINE_bool(enable_sahf, true,"enable use of SAHF instruction if available (X64 only)") DEFINE_bool(enable_vfp3, true,"enable use of VFP3 instructions if available - this implies ""enabling ARMv7 instructions (ARM only)") DEFINE_bool(enable_armv7, true,"enable use of ARMv7 instructions if available (ARM only)") DEFINE_bool(enable_fpu, true,"enable use of MIPS FPU instructions if available (MIPS only)") DEFINE_string(expose_natives_as, NULL,"expose natives in global object") DEFINE_string(expose_debug_as, NULL,"expose debug in global object") DEFINE_bool(expose_gc, false,"expose gc extension") DEFINE_bool(expose_externalize_string, false,"expose externalize string extension") DEFINE_int(stack_trace_limit, 10,"number of stack frames to capture") DEFINE_bool(builtins_in_stack_traces, false,"show built-in functions in stack traces") DEFINE_bool(disable_native_files, false,"disable builtin natives files") DEFINE_bool(inline_new, true,"use fast inline allocation") DEFINE_bool(stack_trace_on_abort, true,"print a stack trace if an assertion failure occurs") DEFINE_bool(trace, false,"trace function calls") DEFINE_bool(mask_constants_with_cookie, true,"use random jit cookie to mask large constants") DEFINE_bool(lazy, true,"use lazy compilation") DEFINE_bool(trace_opt, false,"trace lazy optimization") DEFINE_bool(trace_opt_stats, false,"trace lazy optimization statistics") DEFINE_bool(opt, true,"use adaptive optimizations") DEFINE_bool(always_opt, false,"always try to optimize functions") DEFINE_bool(prepare_always_opt, false,"prepare for turning on always opt") DEFINE_bool(trace_deopt, false,"trace deoptimization") DEFINE_int(min_preparse_length, 1024,"minimum length for automatic enable preparsing") DEFINE_bool(always_full_compiler, false,"try to use the dedicated run-once backend for all code") DEFINE_bool(trace_bailout, false,"print reasons for falling back to using the classic V8 backend") DEFINE_bool(compilation_cache, true,"enable compilation cache") DEFINE_bool(cache_prototype_transitions, true,"cache prototype transitions") DEFINE_bool(trace_debug_json, false,"trace debugging JSON request/response") DEFINE_bool(debugger_auto_break, true,"automatically set the debug break flag when debugger commands are ""in the queue") DEFINE_bool(enable_liveedit, true,"enable liveedit experimental feature") DEFINE_bool(break_on_abort, true,"always cause a debug break before aborting") DEFINE_int(stack_size, kPointerSize *123,"default size of stack region v8 is allowed to use (in kBytes)") DEFINE_int(max_stack_trace_source_length, 300,"maximum length of function source code printed in a stack trace.") DEFINE_bool(always_inline_smi_code, false,"always inline smi code in non-opt code") DEFINE_int(max_new_space_size, 0,"max size of the new generation (in kBytes)") DEFINE_int(max_old_space_size, 0,"max size of the old generation (in Mbytes)") DEFINE_int(max_executable_size, 0,"max size of executable memory (in Mbytes)") DEFINE_bool(gc_global, false,"always perform global GCs") DEFINE_int(gc_interval,-1,"garbage collect after <n> allocations") DEFINE_bool(trace_gc, false,"print one trace line following each garbage collection") DEFINE_bool(trace_gc_nvp, false,"print one detailed trace line in name=value format ""after each garbage collection") DEFINE_bool(print_cumulative_gc_stat, false,"print cumulative GC statistics in name=value format on exit") DEFINE_bool(trace_gc_verbose, false,"print more details following each garbage collection") DEFINE_bool(trace_fragmentation, false,"report fragmentation for old pointer and data pages") DEFINE_bool(collect_maps, true,"garbage collect maps from which no objects can be reached") DEFINE_bool(flush_code, true,"flush code that we expect not to use again before full gc") DEFINE_bool(incremental_marking, true,"use incremental marking") DEFINE_bool(incremental_marking_steps, true,"do incremental marking steps") DEFINE_bool(trace_incremental_marking, false,"trace progress of the incremental marking") DEFINE_bool(use_idle_notification, true,"Use idle notification to reduce memory footprint.") DEFINE_bool(send_idle_notification, false,"Send idle notifcation between stress runs.") DEFINE_bool(use_ic, true,"use inline caching") DEFINE_bool(native_code_counters, false,"generate extra code for manipulating stats counters") DEFINE_bool(always_compact, false,"Perform compaction on every full GC") DEFINE_bool(lazy_sweeping, true,"Use lazy sweeping for old pointer and data spaces") DEFINE_bool(never_compact, false,"Never perform compaction on full GC - testing only") DEFINE_bool(compact_code_space, true,"Compact code space on full non-incremental collections") DEFINE_bool(cleanup_code_caches_at_gc, true,"Flush inline caches prior to mark compact collection and ""flush code caches in maps during mark compact cycle.") DEFINE_int(random_seed, 0,"Default seed for initializing random generator ""(0, the default, means to use system random).") DEFINE_bool(use_verbose_printer, true,"allows verbose printing") DEFINE_bool(allow_natives_syntax, false,"allow natives syntax") DEFINE_bool(trace_sim, false,"Trace simulator execution") DEFINE_bool(check_icache, false,"Check icache flushes in ARM and MIPS simulator") DEFINE_int(stop_sim_at, 0,"Simulator stop after x number of instructions") DEFINE_int(sim_stack_alignment, 8,"Stack alingment in bytes in simulator (4 or 8, 8 is default)") DEFINE_bool(trace_exception, false,"print stack trace when throwing exceptions") DEFINE_bool(preallocate_message_memory, false,"preallocate some memory to build stack traces.") DEFINE_bool(randomize_hashes, true,"randomize hashes to avoid predictable hash collisions ""(with snapshots this option cannot override the baked-in seed)") DEFINE_int(hash_seed, 0,"Fixed seed to use to hash property keys (0 means random)""(with snapshots this option cannot override the baked-in seed)") DEFINE_bool(preemption, false,"activate a 100ms timer that switches between V8 threads") DEFINE_bool(regexp_optimization, true,"generate optimized regexp code") DEFINE_bool(testing_bool_flag, true,"testing_bool_flag") DEFINE_int(testing_int_flag, 13,"testing_int_flag") DEFINE_float(testing_float_flag, 2.5,"float-flag") DEFINE_string(testing_string_flag,"Hello, world!","string-flag") DEFINE_int(testing_prng_seed, 42,"Seed used for threading test randomness") DEFINE_string(testing_serialization_file,"/tmp/serdes","file in which to serialize heap") DEFINE_bool(help, false,"Print usage message, including flags, on console") DEFINE_bool(dump_counters, false,"Dump counters on exit") DEFINE_string(map_counters,"","Map counters to a file") DEFINE_args(js_arguments, JSARGUMENTS_INIT,"Pass all remaining arguments to the script. Alias for \"--\".") DEFINE_bool(debug_compile_events, true,"Enable debugger compile events") DEFINE_bool(debug_script_collected_events, true,"Enable debugger script collected events") DEFINE_bool(gdbjit, false,"enable GDBJIT interface (disables compacting GC)") DEFINE_bool(gdbjit_full, false,"enable GDBJIT interface for all code objects") DEFINE_bool(gdbjit_dump, false,"dump elf objects with debug info to disk") DEFINE_string(gdbjit_dump_filter,"","dump only objects containing this substring") DEFINE_bool(force_marking_deque_overflows, false,"force overflows of marking deque by reducing it's size ""to 64 words") DEFINE_bool(stress_compaction, false,"stress the GC compactor to flush out bugs (implies ""--force_marking_deque_overflows)")#define FLAG DEFINE_bool(enable_slow_asserts, false,"enable asserts that are slow to execute") DEFINE_bool(trace_codegen, false,"print name of functions for which code is generated") DEFINE_bool(print_source, false,"pretty print source code") DEFINE_bool(print_builtin_source, false,"pretty print source code for builtins") DEFINE_bool(print_ast, false,"print source AST") DEFINE_bool(print_builtin_ast, false,"print source AST for builtins") DEFINE_string(stop_at,"","function name where to insert a breakpoint") DEFINE_bool(print_builtin_scopes, false,"print scopes for builtins") DEFINE_bool(print_scopes, false,"print scopes") DEFINE_bool(trace_contexts, false,"trace contexts operations") DEFINE_bool(gc_greedy, false,"perform GC prior to some allocations") DEFINE_bool(gc_verbose, false,"print stuff during garbage collection") DEFINE_bool(heap_stats, false,"report heap statistics before and after GC") DEFINE_bool(code_stats, false,"report code statistics after GC") DEFINE_bool(verify_heap, false,"verify heap pointers before and after GC") DEFINE_bool(print_handles, false,"report handles after GC") DEFINE_bool(print_global_handles, false,"report global handles after GC") DEFINE_bool(trace_ic, false,"trace inline cache state transitions") DEFINE_bool(print_interfaces, false,"print interfaces") DEFINE_bool(print_interface_details, false,"print interface inference details") DEFINE_int(print_interface_depth, 5,"depth for printing interfaces") DEFINE_bool(trace_normalization, false,"prints when objects are turned into dictionaries.") DEFINE_bool(trace_lazy, false,"trace lazy compilation") DEFINE_bool(collect_heap_spill_statistics, false,"report heap spill statistics along with heap_stats ""(requires heap_stats)") DEFINE_bool(trace_isolates, false,"trace isolate state changes") DEFINE_bool(log_state_changes, false,"Log state changes.") DEFINE_bool(regexp_possessive_quantifier, false,"enable possessive quantifier syntax for testing") DEFINE_bool(trace_regexp_bytecodes, false,"trace regexp bytecode execution") DEFINE_bool(trace_regexp_assembler, false,"trace regexp macro assembler calls.")#define FLAG DEFINE_bool(log, false,"Minimal logging (no API, code, GC, suspect, or handles samples).") DEFINE_bool(log_all, false,"Log all events to the log file.") DEFINE_bool(log_runtime, false,"Activate runtime system %Log call.") DEFINE_bool(log_api, false,"Log API events to the log file.") DEFINE_bool(log_code, false,"Log code events to the log file without profiling.") DEFINE_bool(log_gc, false,"Log heap samples on garbage collection for the hp2ps tool.") DEFINE_bool(log_handles, false,"Log global handle events.") DEFINE_bool(log_snapshot_positions, false,"log positions of (de)serialized objects in the snapshot.") DEFINE_bool(log_suspect, false,"Log suspect operations.") DEFINE_bool(prof, false,"Log statistical profiling information (implies --log-code).") DEFINE_bool(prof_auto, true,"Used with --prof, starts profiling automatically") DEFINE_bool(prof_lazy, false,"Used with --prof, only does sampling and logging"" when profiler is active (implies --noprof_auto).") DEFINE_bool(prof_browser_mode, true,"Used with --prof, turns on browser-compatible mode for profiling.") DEFINE_bool(log_regexp, false,"Log regular expression execution.") DEFINE_bool(sliding_state_window, false,"Update sliding state window counters.") DEFINE_string(logfile,"v8.log","Specify the name of the log file.") DEFINE_bool(ll_prof, false,"Enable low-level linux profiler.")#define FLAG DEFINE_bool(trace_elements_transitions, false,"trace elements transitions") DEFINE_bool(print_code_stubs, false,"print code stubs") DEFINE_bool(test_secondary_stub_cache, false,"test secondary stub cache by disabling the primary one") DEFINE_bool(test_primary_stub_cache, false,"test primary stub cache by disabling the secondary one") DEFINE_bool(print_code, false,"print generated code") DEFINE_bool(print_opt_code, false,"print optimized code") DEFINE_bool(print_unopt_code, false,"print unoptimized code before ""printing optimized code based on it") DEFINE_bool(print_code_verbose, false,"print more information for code") DEFINE_bool(print_builtin_code, false,"print generated code for builtins")#47"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flags.cc"2 namespace{struct Flag{enum FlagType{TYPE_BOOL, TYPE_INT, TYPE_FLOAT, TYPE_STRING, TYPE_ARGS} name
Definition: flags.cc:1349
virtual v8::Handle< v8::FunctionTemplate > GetNativeFunction(v8::Handle< String > name)
static v8::Handle< v8::Value > Trace(const v8::Arguments &args)
void CreateFramePointerGrabberConstructor(const char *constructor_name)
int int32_t
Definition: unicode.cc:47
TickSample * sample
#define CHECK(condition)
Definition: checks.h:56
Address stack[kMaxFramesCount]
Definition: platform.h:701
V8EXPORT bool Equals(Handle< Value > that) const
Definition: api.cc:2676
void SetClassName(Handle< String > name)
Definition: api.cc:1132
bool contains(byte *pc)
Definition: objects-inl.h:4417
uint8_t byte
Definition: globals.h:171
HANDLE HANDLE LPSTACKFRAME64 StackFrame
T * start() const
Definition: utils.h:389
activate correct semantics for inheriting readonliness enable harmony semantics for typeof enable harmony enable harmony proxies enable all harmony harmony_scoping harmony_proxies harmony_scoping tracks arrays with only smi values automatically unbox arrays of doubles use crankshaft use hydrogen range analysis use hydrogen global value numbering use function inlining maximum number of AST nodes considered for a single inlining loop invariant code motion print statistics for hydrogen trace generated IR for specified phases trace register allocator trace range analysis trace representation types environment for every instruction put a break point before deoptimizing polymorphic inlining perform array bounds checks elimination trace on stack replacement optimize closures functions with arguments object optimize functions containing for in loops profiler considers IC stability primitive functions trigger their own optimization re try self optimization if it failed insert an interrupt check at function exit execution budget before interrupt is triggered call count before self optimization self_optimization count_based_interrupts weighted_back_edges trace_opt emit comments in code disassembly enable use of SSE3 instructions if available enable use of CMOV instruction if available enable use of SAHF instruction if enable use of VFP3 instructions if available this implies enabling ARMv7 enable use of ARMv7 instructions if enable use of MIPS FPU instructions if NULL
static v8::Handle< v8::Value > JSEntrySP(const v8::Arguments &args)
int Length() const
Definition: v8.h:4143
const char * name() const
Definition: v8.h:2544
Definition: v8.h:104
V8EXPORT bool IsFunction() const
Definition: api.cc:2147
#define CHECK_NE(unexpected, value)
Definition: checks.h:223
Definition: v8.h:592
Local< Object > This() const
Definition: v8.h:4117
static int SNPrintF(Vector< char > str, const char *format,...)
Local< Function > GetFunction()
Definition: api.cc:4551
TEST(CFromJSStackTrace)
static v8::Handle< v8::Value > JSTrace(const v8::Arguments &args)
static v8::Handle< v8::Value > JSEntrySPLevel2(const v8::Arguments &args)
Handle< Primitive > V8EXPORT Undefined()
Definition: api.cc:546
bool IsEmpty() const
Definition: v8.h:208
static Persistent< Context > New(ExtensionConfiguration *extensions=NULL, Handle< ObjectTemplate > global_template=Handle< ObjectTemplate >(), Handle< Value > global_object=Handle< Value >())
Definition: api.cc:4308
const Register fp
#define FUNCTION_ADDR(f)
Definition: globals.h:307
Definition: v8.h:105
static v8::internal::Handle< v8::internal::TemplateInfo > OpenHandle(const Template *that)