diff options
author | 2023-02-27 18:50:44 +0000 | |
---|---|---|
committer | 2023-05-12 13:50:45 +0000 | |
commit | 98aefe07b6e28632fff0efce6b71f1f816cfc1dc (patch) | |
tree | 8709ed103391510d7cf7a11846a8f8a3728199b8 | |
parent | 1b8a7838e95d0a57be2b920183ba9b7b2188ccb2 (diff) |
Collect timestamps directly from the JITed code
JIT code was calling out to C++ code to collect timestamps at method
entry / exit when precise profiling is enabled. Calling out to C++ would
involve setting up a frame and spilling registers which can be
expensive. This CL generates code to collect timestamps and update the
per-thread buffer so we can collect timestamps directly from JITed code.
This also updates the test to check timestamps are monotonic.
Bug: 259258187
Test: art/test.py
Change-Id: I07148d4e2605bbb0e75062e0f4642a7f7847bebb
-rw-r--r-- | compiler/optimizing/code_generator_arm64.cc | 47 | ||||
-rw-r--r-- | compiler/optimizing/code_generator_arm_vixl.cc | 67 | ||||
-rw-r--r-- | compiler/optimizing/code_generator_x86.cc | 55 | ||||
-rw-r--r-- | compiler/optimizing/code_generator_x86_64.cc | 54 | ||||
-rw-r--r-- | compiler/utils/arm/assembler_arm_vixl.h | 24 | ||||
-rw-r--r-- | compiler/utils/x86/assembler_x86.h | 6 | ||||
-rw-r--r-- | compiler/utils/x86_64/assembler_x86_64.cc | 6 | ||||
-rw-r--r-- | compiler/utils/x86_64/assembler_x86_64.h | 2 | ||||
-rw-r--r-- | runtime/instrumentation.cc | 183 | ||||
-rw-r--r-- | runtime/instrumentation.h | 59 | ||||
-rw-r--r-- | runtime/thread.h | 12 | ||||
-rw-r--r-- | runtime/trace.cc | 48 | ||||
-rw-r--r-- | runtime/trace.h | 14 | ||||
-rw-r--r-- | test/2246-trace-stream/expected-stdout.txt | 1289 | ||||
-rw-r--r-- | test/2246-trace-stream/src/BaseTraceParser.java | 29 | ||||
-rw-r--r-- | test/2246-trace-stream/src/Main.java | 19 |
16 files changed, 1795 insertions, 119 deletions
diff --git a/compiler/optimizing/code_generator_arm64.cc b/compiler/optimizing/code_generator_arm64.cc index 9b33712810..f8f24bb919 100644 --- a/compiler/optimizing/code_generator_arm64.cc +++ b/compiler/optimizing/code_generator_arm64.cc @@ -45,6 +45,7 @@ #include "optimizing/common_arm64.h" #include "optimizing/nodes.h" #include "thread.h" +#include "trace.h" #include "utils/arm64/assembler_arm64.h" #include "utils/assembler.h" #include "utils/stack_checks.h" @@ -88,6 +89,9 @@ using helpers::VIXLRegCodeFromART; using helpers::WRegisterFrom; using helpers::XRegisterFrom; +// TODO(mythria): Expand SystemRegister in vixl to include this value. +uint16_t SYS_CNTVCT_EL0 = SystemRegisterEncoder<1, 3, 14, 0, 2>::value; + // The compare/jump sequence will generate about (1.5 * num_entries + 3) instructions. While jump // table version generates 7 instructions and num_entries literals. Compare/jump sequence will // generates less code/data with a small num_entries. @@ -1192,8 +1196,9 @@ void LocationsBuilderARM64::VisitMethodExitHook(HMethodExitHook* method_hook) { void InstructionCodeGeneratorARM64::GenerateMethodEntryExitHook(HInstruction* instruction) { MacroAssembler* masm = GetVIXLAssembler(); UseScratchRegisterScope temps(masm); - Register temp = temps.AcquireX(); - Register value = temps.AcquireW(); + Register addr = temps.AcquireX(); + Register index = temps.AcquireX(); + Register value = index.W(); SlowPathCodeARM64* slow_path = new (codegen_->GetScopedAllocator()) MethodEntryExitHooksSlowPathARM64(instruction); @@ -1213,9 +1218,41 @@ void InstructionCodeGeneratorARM64::GenerateMethodEntryExitHook(HInstruction* in MemberOffset offset = instruction->IsMethodExitHook() ? instrumentation::Instrumentation::HaveMethodExitListenersOffset() : instrumentation::Instrumentation::HaveMethodEntryListenersOffset(); - __ Mov(temp, address + offset.Int32Value()); - __ Ldrb(value, MemOperand(temp, 0)); - __ Cbnz(value, slow_path->GetEntryLabel()); + __ Mov(addr, address + offset.Int32Value()); + __ Ldrb(value, MemOperand(addr, 0)); + __ Cmp(value, Operand(instrumentation::Instrumentation::kFastTraceListeners)); + // Check if there are any method entry / exit listeners. If no, continue. + __ B(lt, slow_path->GetExitLabel()); + // Check if there are any slow (jvmti / trace with thread cpu time) method entry / exit listeners. + // If yes, just take the slow path. + __ B(gt, slow_path->GetEntryLabel()); + + // Check if there is place in the buffer to store a new entry, if no, take slow path. + uint32_t trace_buffer_index_addr = + Thread::TraceBufferIndexOffset<kArm64PointerSize>().Int32Value(); + __ Ldr(index, MemOperand(tr, trace_buffer_index_addr)); + __ Cmp(index, Operand(kNumEntriesForWallClock)); + __ B(lt, slow_path->GetEntryLabel()); + + // Just update the buffer and advance the offset + // addr = base_addr + sizeof(void*) * index; + __ Ldr(addr, MemOperand(tr, Thread::TraceBufferPtrOffset<kArm64PointerSize>().SizeValue())); + __ ComputeAddress(addr, MemOperand(addr, index, LSL, TIMES_8)); + // Advance the index + __ Sub(index, index, kNumEntriesForWallClock); + __ Str(index, MemOperand(tr, trace_buffer_index_addr)); + + Register tmp = index; + // Record method pointer + __ Ldr(tmp, MemOperand(sp, 0)); + __ Str(tmp, MemOperand(addr, kMethodOffsetInBytes)); + // Record the method action + uint32_t trace_action = instruction->IsMethodExitHook() ? 1 : 0; + __ Mov(tmp, Operand(trace_action)); + __ Str(tmp, MemOperand(addr, kTraceActionOffsetInBytes)); + // Record the timestamp. + __ Mrs(tmp, (SystemRegister)SYS_CNTVCT_EL0); + __ Str(tmp, MemOperand(addr, kTimestampOffsetInBytes)); __ Bind(slow_path->GetExitLabel()); } diff --git a/compiler/optimizing/code_generator_arm_vixl.cc b/compiler/optimizing/code_generator_arm_vixl.cc index 1e1aee99aa..f7349f5c7c 100644 --- a/compiler/optimizing/code_generator_arm_vixl.cc +++ b/compiler/optimizing/code_generator_arm_vixl.cc @@ -40,6 +40,7 @@ #include "mirror/var_handle.h" #include "scoped_thread_state_change-inl.h" #include "thread.h" +#include "trace.h" #include "utils/arm/assembler_arm_vixl.h" #include "utils/arm/managed_register_arm.h" #include "utils/assembler.h" @@ -2188,11 +2189,16 @@ void LocationsBuilderARMVIXL::VisitMethodExitHook(HMethodExitHook* method_hook) LocationSummary* locations = new (GetGraph()->GetAllocator()) LocationSummary(method_hook, LocationSummary::kCallOnSlowPath); locations->SetInAt(0, parameter_visitor_.GetReturnLocation(method_hook->InputAt(0)->GetType())); + // We need three temporary registers, two to load the timestamp counter (64-bit value) and one to + // compute the address to store the timestamp counter. + locations->AddRegisterTemps(3); } void InstructionCodeGeneratorARMVIXL::GenerateMethodEntryExitHook(HInstruction* instruction) { - UseScratchRegisterScope temps(GetVIXLAssembler()); - vixl32::Register temp = temps.Acquire(); + LocationSummary* locations = instruction->GetLocations(); + vixl32::Register addr = RegisterFrom(locations->GetTemp(0)); + vixl32::Register value = RegisterFrom(locations->GetTemp(1)); + vixl32::Register tmp = RegisterFrom(locations->GetTemp(2)); SlowPathCodeARMVIXL* slow_path = new (codegen_->GetScopedAllocator()) MethodEntryExitHooksSlowPathARMVIXL(instruction); @@ -2204,20 +2210,55 @@ void InstructionCodeGeneratorARMVIXL::GenerateMethodEntryExitHook(HInstruction* // if it is just non-zero. kCHA bit isn't used in debuggable runtimes as cha optimization is // disabled in debuggable runtime. The other bit is used when this method itself requires a // deoptimization due to redefinition. So it is safe to just check for non-zero value here. - GetAssembler()->LoadFromOffset(kLoadWord, - temp, - sp, - codegen_->GetStackOffsetOfShouldDeoptimizeFlag()); - __ CompareAndBranchIfNonZero(temp, slow_path->GetEntryLabel()); + GetAssembler()->LoadFromOffset( + kLoadWord, value, sp, codegen_->GetStackOffsetOfShouldDeoptimizeFlag()); + __ CompareAndBranchIfNonZero(value, slow_path->GetEntryLabel()); } MemberOffset offset = instruction->IsMethodExitHook() ? instrumentation::Instrumentation::HaveMethodExitListenersOffset() : instrumentation::Instrumentation::HaveMethodEntryListenersOffset(); uint32_t address = reinterpret_cast32<uint32_t>(Runtime::Current()->GetInstrumentation()); - __ Mov(temp, address + offset.Int32Value()); - __ Ldrb(temp, MemOperand(temp, 0)); - __ CompareAndBranchIfNonZero(temp, slow_path->GetEntryLabel()); + __ Mov(addr, address + offset.Int32Value()); + __ Ldrb(value, MemOperand(addr, 0)); + __ Cmp(value, instrumentation::Instrumentation::kFastTraceListeners); + // Check if there are any trace method entry / exit listeners. If no, continue. + __ B(lt, slow_path->GetExitLabel()); + // Check if there are any slow (jvmti / trace with thread cpu time) method entry / exit listeners. + // If yes, just take the slow path. + __ B(gt, slow_path->GetEntryLabel()); + + // Check if there is place in the buffer to store a new entry, if no, take slow path. + uint32_t trace_buffer_index_addr = Thread::TraceBufferIndexOffset<kArmPointerSize>().Int32Value(); + vixl32::Register index = value; + __ Ldr(index, MemOperand(tr, trace_buffer_index_addr)); + __ Cmp(index, kNumEntriesForWallClock); + __ B(lt, slow_path->GetEntryLabel()); + + // Just update the buffer and advance the offset + // addr = base_addr + sizeof(void*) * index + __ Ldr(addr, MemOperand(tr, Thread::TraceBufferPtrOffset<kArmPointerSize>().SizeValue())); + __ Add(addr, addr, Operand(index, LSL, TIMES_4)); + // Advance the index + __ Sub(index, index, kNumEntriesForWallClock); + __ Str(index, MemOperand(tr, trace_buffer_index_addr)); + + // Record method pointer + __ Ldr(tmp, MemOperand(sp, 0)); + __ Str(tmp, MemOperand(addr, kMethodOffsetInBytes)); + // Record the method action + uint32_t trace_action = instruction->IsMethodExitHook() ? 1 : 0; + __ Mov(tmp, Operand(trace_action)); + __ Str(tmp, MemOperand(addr, kTraceActionOffsetInBytes)); + vixl32::Register tmp1 = index; + // See Architecture Reference Manual ARMv7-A and ARMv7-R edition section B4.1.34. + __ Mrrc(/* lower 32-bit */ tmp, + /* higher 32-bit */ tmp1, + /* coproc= */ 15, + /* opc1= */ 1, + /* crm= */ 14); + __ Str(tmp1, MemOperand(addr, kTimestampOffsetInBytes)); + __ Str(tmp, MemOperand(addr, kLowTimestampOffsetInBytes)); __ Bind(slow_path->GetExitLabel()); } @@ -2228,7 +2269,11 @@ void InstructionCodeGeneratorARMVIXL::VisitMethodExitHook(HMethodExitHook* instr } void LocationsBuilderARMVIXL::VisitMethodEntryHook(HMethodEntryHook* method_hook) { - new (GetGraph()->GetAllocator()) LocationSummary(method_hook, LocationSummary::kCallOnSlowPath); + LocationSummary* locations = new (GetGraph()->GetAllocator()) + LocationSummary(method_hook, LocationSummary::kCallOnSlowPath); + // We need three temporary registers, two to load the timestamp counter (64-bit value) and one to + // compute the address to store the timestamp counter. + locations->AddRegisterTemps(3); } void InstructionCodeGeneratorARMVIXL::VisitMethodEntryHook(HMethodEntryHook* instruction) { diff --git a/compiler/optimizing/code_generator_x86.cc b/compiler/optimizing/code_generator_x86.cc index d85e0f6362..1cc44c1c9b 100644 --- a/compiler/optimizing/code_generator_x86.cc +++ b/compiler/optimizing/code_generator_x86.cc @@ -38,6 +38,7 @@ #include "optimizing/nodes.h" #include "scoped_thread_state_change-inl.h" #include "thread.h" +#include "trace.h" #include "utils/assembler.h" #include "utils/stack_checks.h" #include "utils/x86/assembler_x86.h" @@ -1222,12 +1223,18 @@ void LocationsBuilderX86::VisitMethodExitHook(HMethodExitHook* method_hook) { LocationSummary* locations = new (GetGraph()->GetAllocator()) LocationSummary(method_hook, LocationSummary::kCallOnSlowPath); SetInForReturnValue(method_hook, locations); + // We use rdtsc to obtain a timestamp for tracing. rdtsc returns the results in EAX + EDX. + locations->AddTemp(Location::RegisterLocation(EAX)); + locations->AddTemp(Location::RegisterLocation(EDX)); + // An additional temporary register to hold address to store the timestamp counter. + locations->AddTemp(Location::RequiresRegister()); } void InstructionCodeGeneratorX86::GenerateMethodEntryExitHook(HInstruction* instruction) { SlowPathCode* slow_path = new (codegen_->GetScopedAllocator()) MethodEntryExitHooksSlowPathX86(instruction); codegen_->AddSlowPath(slow_path); + LocationSummary* locations = instruction->GetLocations(); if (instruction->IsMethodExitHook()) { // Check if we are required to check if the caller needs a deoptimization. Strictly speaking it @@ -1243,8 +1250,44 @@ void InstructionCodeGeneratorX86::GenerateMethodEntryExitHook(HInstruction* inst MemberOffset offset = instruction->IsMethodExitHook() ? instrumentation::Instrumentation::HaveMethodExitListenersOffset() : instrumentation::Instrumentation::HaveMethodEntryListenersOffset(); - __ cmpb(Address::Absolute(address + offset.Int32Value()), Immediate(0)); - __ j(kNotEqual, slow_path->GetEntryLabel()); + __ cmpb(Address::Absolute(address + offset.Int32Value()), + Immediate(instrumentation::Instrumentation::kFastTraceListeners)); + // Check if there are any trace method entry / exit listeners. If no, continue. + __ j(kLess, slow_path->GetExitLabel()); + // Check if there are any slow (jvmti / trace with thread cpu time) method entry / exit listeners. + // If yes, just take the slow path. + __ j(kGreater, slow_path->GetEntryLabel()); + + // Check if there is place in the buffer for a new entry, if no, take slow path. + uint64_t trace_buffer_index_addr = Thread::TraceBufferIndexOffset<kX86PointerSize>().Int32Value(); + __ fs()->cmpl(Address::Absolute(trace_buffer_index_addr), Immediate(kNumEntriesForWallClock)); + __ j(kLess, slow_path->GetEntryLabel()); + + // Just update the buffer and advance the offset + // For entry_addr use the first temp that isn't EAX or EDX. We need this after + // rdtsc which returns values in EAX + EDX. + Register entry_addr = locations->GetTemp(2).AsRegister<Register>(); + Register index = locations->GetTemp(1).AsRegister<Register>(); + uint32_t trace_buffer_ptr = Thread::TraceBufferPtrOffset<kX86PointerSize>().Int32Value(); + // entry_addr = base_addr + sizeof(void*) * index + __ fs()->movl(index, Address::Absolute(trace_buffer_index_addr)); + __ fs()->movl(entry_addr, Address::Absolute(trace_buffer_ptr)); + __ leal(entry_addr, Address(entry_addr, index, TIMES_4, 0)); + // Advance the index in the buffer + __ subl(index, Immediate(kNumEntriesForWallClock)); + __ fs()->movl(Address::Absolute(trace_buffer_index_addr), index); + + // Record method pointer + Register method = index; + __ movl(method, Address(ESP, kCurrentMethodStackOffset)); + __ movl(Address(entry_addr, kMethodOffsetInBytes), method); + // Record the method action + uint32_t trace_action = instruction->IsMethodExitHook() ? 1 : 0; + __ movl(Address(entry_addr, kTraceActionOffsetInBytes), Immediate(trace_action)); + // Get the timestamp. rdtsc returns timestamp in EAX + EDX. + __ rdtsc(); + __ movl(Address(entry_addr, kTimestampOffsetInBytes), EDX); + __ movl(Address(entry_addr, kLowTimestampOffsetInBytes), EAX); __ Bind(slow_path->GetExitLabel()); } @@ -1255,7 +1298,13 @@ void InstructionCodeGeneratorX86::VisitMethodExitHook(HMethodExitHook* instructi } void LocationsBuilderX86::VisitMethodEntryHook(HMethodEntryHook* method_hook) { - new (GetGraph()->GetAllocator()) LocationSummary(method_hook, LocationSummary::kCallOnSlowPath); + LocationSummary* locations = new (GetGraph()->GetAllocator()) + LocationSummary(method_hook, LocationSummary::kCallOnSlowPath); + // We use rdtsc to obtain a timestamp for tracing. rdtsc returns the results in EAX + EDX. + locations->AddTemp(Location::RegisterLocation(EAX)); + locations->AddTemp(Location::RegisterLocation(EDX)); + // An additional temporary register to hold address to store the timestamp counter. + locations->AddTemp(Location::RequiresRegister()); } void InstructionCodeGeneratorX86::VisitMethodEntryHook(HMethodEntryHook* instruction) { diff --git a/compiler/optimizing/code_generator_x86_64.cc b/compiler/optimizing/code_generator_x86_64.cc index df2bef747f..1ca6d77a4f 100644 --- a/compiler/optimizing/code_generator_x86_64.cc +++ b/compiler/optimizing/code_generator_x86_64.cc @@ -39,6 +39,7 @@ #include "optimizing/nodes.h" #include "scoped_thread_state_change-inl.h" #include "thread.h" +#include "trace.h" #include "utils/assembler.h" #include "utils/stack_checks.h" #include "utils/x86_64/assembler_x86_64.h" @@ -1586,12 +1587,18 @@ static dwarf::Reg DWARFReg(FloatRegister reg) { } void LocationsBuilderX86_64::VisitMethodEntryHook(HMethodEntryHook* method_hook) { - new (GetGraph()->GetAllocator()) LocationSummary(method_hook, LocationSummary::kCallOnSlowPath); + LocationSummary* locations = new (GetGraph()->GetAllocator()) + LocationSummary(method_hook, LocationSummary::kCallOnSlowPath); + // We use rdtsc to record the timestamp for method profiling. rdtsc returns + // two 32-bit values in EAX + EDX even on 64-bit architectures. + locations->AddTemp(Location::RegisterLocation(RAX)); + locations->AddTemp(Location::RegisterLocation(RDX)); } void InstructionCodeGeneratorX86_64::GenerateMethodEntryExitHook(HInstruction* instruction) { SlowPathCode* slow_path = new (codegen_->GetScopedAllocator()) MethodEntryExitHooksSlowPathX86_64(instruction); + LocationSummary* locations = instruction->GetLocations(); codegen_->AddSlowPath(slow_path); if (instruction->IsMethodExitHook()) { @@ -1610,8 +1617,45 @@ void InstructionCodeGeneratorX86_64::GenerateMethodEntryExitHook(HInstruction* i instrumentation::Instrumentation::HaveMethodExitListenersOffset() : instrumentation::Instrumentation::HaveMethodEntryListenersOffset(); __ movq(CpuRegister(TMP), Immediate(address + offset.Int32Value())); - __ cmpb(Address(CpuRegister(TMP), 0), Immediate(0)); - __ j(kNotEqual, slow_path->GetEntryLabel()); + __ cmpb(Address(CpuRegister(TMP), 0), + Immediate(instrumentation::Instrumentation::kFastTraceListeners)); + // Check if there are any method entry / exit listeners. If no, continue with execution. + __ j(kLess, slow_path->GetExitLabel()); + // Check if there are any slow method entry / exit listeners. If yes, take the slow path. + __ j(kGreater, slow_path->GetEntryLabel()); + + // Check if there is place in the buffer for a new entry, if no, take slow path. + CpuRegister index = locations->GetTemp(0).AsRegister<CpuRegister>(); + CpuRegister entry_addr = CpuRegister(TMP); + uint64_t trace_buffer_index_addr = + Thread::TraceBufferIndexOffset<kX86_64PointerSize>().SizeValue(); + __ gs()->movq(CpuRegister(index), Address::Absolute(trace_buffer_index_addr, /* no_rip= */ true)); + __ cmpq(CpuRegister(index), Immediate(kNumEntriesForWallClock)); + __ j(kLess, slow_path->GetEntryLabel()); + + // Just update the buffer and advance the offset + // entry_addr = base_addr + sizeof(void*) * index + __ gs()->movq(entry_addr, + Address::Absolute(Thread::TraceBufferPtrOffset<kX86_64PointerSize>().SizeValue(), + /* no_rip= */ true)); + __ leaq(CpuRegister(entry_addr), + Address(CpuRegister(entry_addr), CpuRegister(index), TIMES_8, 0)); + // Advance the index in the buffer + __ subq(CpuRegister(index), Immediate(kNumEntriesForWallClock)); + __ gs()->movq(Address::Absolute(trace_buffer_index_addr, /* no_rip= */ true), CpuRegister(index)); + + // Record method pointer + CpuRegister method = index; + __ movq(CpuRegister(method), Address(CpuRegister(RSP), kCurrentMethodStackOffset)); + __ movq(Address(entry_addr, kMethodOffsetInBytes), CpuRegister(method)); + // Record the method action + uint32_t trace_action = instruction->IsMethodExitHook() ? 1 : 0; + __ movq(Address(entry_addr, kTraceActionOffsetInBytes), Immediate(trace_action)); + // Get the timestamp. rdtsc returns timestamp in RAX + RDX even in 64-bit architectures. + __ rdtsc(); + __ shlq(CpuRegister(RDX), Immediate(32)); + __ orq(CpuRegister(RAX), CpuRegister(RDX)); + __ movq(Address(entry_addr, kTimestampOffsetInBytes), CpuRegister(RAX)); __ Bind(slow_path->GetExitLabel()); } @@ -1652,6 +1696,10 @@ void LocationsBuilderX86_64::VisitMethodExitHook(HMethodExitHook* method_hook) { LocationSummary* locations = new (GetGraph()->GetAllocator()) LocationSummary(method_hook, LocationSummary::kCallOnSlowPath); SetInForReturnValue(method_hook, locations); + // We use rdtsc to record the timestamp for method profiling. rdtsc returns + // two 32-bit values in EAX + EDX even on 64-bit architectures. + locations->AddTemp(Location::RegisterLocation(RAX)); + locations->AddTemp(Location::RegisterLocation(RDX)); } void InstructionCodeGeneratorX86_64::VisitMethodExitHook(HMethodExitHook* instruction) { diff --git a/compiler/utils/arm/assembler_arm_vixl.h b/compiler/utils/arm/assembler_arm_vixl.h index 741119d7f7..e4d864b54d 100644 --- a/compiler/utils/arm/assembler_arm_vixl.h +++ b/compiler/utils/arm/assembler_arm_vixl.h @@ -173,6 +173,30 @@ class ArmVIXLMacroAssembler final : public vixl32::MacroAssembler { } } using MacroAssembler::Vmov; + + // TODO(b/281982421): Move the implementation of Mrrc to vixl and remove this implementation. + void Mrrc(vixl32::Register r1, vixl32::Register r2, int coproc, int opc1, int crm) { + // See ARM A-profile A32/T32 Instruction set architecture + // https://developer.arm.com/documentation/ddi0597/2022-09/Base-Instructions/MRRC--Move-to-two-general-purpose-registers-from-System-register- + CHECK(coproc == 15 || coproc == 14); + if (IsUsingT32()) { + uint32_t inst = (0b111011000101 << 20) | + (r2.GetCode() << 16) | + (r1.GetCode() << 12) | + (coproc << 8) | + (opc1 << 4) | + crm; + EmitT32_32(inst); + } else { + uint32_t inst = (0b000011000101 << 20) | + (r2.GetCode() << 16) | + (r1.GetCode() << 12) | + (coproc << 8) | + (opc1 << 4) | + crm; + EmitA32(inst); + } + } }; class ArmVIXLAssembler final : public Assembler { diff --git a/compiler/utils/x86/assembler_x86.h b/compiler/utils/x86/assembler_x86.h index 0f7854dc5c..e6503045fa 100644 --- a/compiler/utils/x86/assembler_x86.h +++ b/compiler/utils/x86/assembler_x86.h @@ -955,6 +955,12 @@ class X86Assembler final : public Assembler { lock()->xaddl(address, reg); } + void rdtsc() { + AssemblerBuffer::EnsureCapacity ensured(&buffer_); + EmitUint8(0x0F); + EmitUint8(0x31); + } + // // Misc. functionality // diff --git a/compiler/utils/x86_64/assembler_x86_64.cc b/compiler/utils/x86_64/assembler_x86_64.cc index 3fdf05bed9..e2a32a7337 100644 --- a/compiler/utils/x86_64/assembler_x86_64.cc +++ b/compiler/utils/x86_64/assembler_x86_64.cc @@ -5244,6 +5244,12 @@ void X86_64Assembler::popcntq(CpuRegister dst, const Address& src) { EmitOperand(dst.LowBits(), src); } +void X86_64Assembler::rdtsc() { + AssemblerBuffer::EnsureCapacity ensured(&buffer_); + EmitUint8(0x0F); + EmitUint8(0x31); +} + void X86_64Assembler::repne_scasb() { AssemblerBuffer::EnsureCapacity ensured(&buffer_); EmitUint8(0xF2); diff --git a/compiler/utils/x86_64/assembler_x86_64.h b/compiler/utils/x86_64/assembler_x86_64.h index 235ea03e2b..cb62500bc9 100644 --- a/compiler/utils/x86_64/assembler_x86_64.h +++ b/compiler/utils/x86_64/assembler_x86_64.h @@ -964,6 +964,8 @@ class X86_64Assembler final : public Assembler { void popcntq(CpuRegister dst, CpuRegister src); void popcntq(CpuRegister dst, const Address& src); + void rdtsc(); + void rorl(CpuRegister reg, const Immediate& imm); void rorl(CpuRegister operand, CpuRegister shifter); void roll(CpuRegister reg, const Immediate& imm); diff --git a/runtime/instrumentation.cc b/runtime/instrumentation.cc index e4be5772da..5ce2b10afc 100644 --- a/runtime/instrumentation.cc +++ b/runtime/instrumentation.cc @@ -111,8 +111,8 @@ Instrumentation::Instrumentation() : run_exit_hooks_(false), instrumentation_level_(InstrumentationLevel::kInstrumentNothing), forced_interpret_only_(false), - have_method_entry_listeners_(false), - have_method_exit_listeners_(false), + have_method_entry_listeners_(0), + have_method_exit_listeners_(0), have_method_unwind_listeners_(false), have_dex_pc_listeners_(false), have_field_read_listeners_(false), @@ -727,15 +727,14 @@ static bool HasEvent(Instrumentation::InstrumentationEvent expected, uint32_t ev return (events & expected) != 0; } -static void PotentiallyAddListenerTo(Instrumentation::InstrumentationEvent event, +static bool PotentiallyAddListenerTo(Instrumentation::InstrumentationEvent event, uint32_t events, std::list<InstrumentationListener*>& list, - InstrumentationListener* listener, - bool* has_listener) + InstrumentationListener* listener) REQUIRES(Locks::mutator_lock_, !Locks::thread_list_lock_, !Locks::classlinker_classes_lock_) { Locks::mutator_lock_->AssertExclusiveHeld(Thread::Current()); if (!HasEvent(event, events)) { - return; + return false; } // If there is a free slot in the list, we insert the listener in that slot. // Otherwise we add it to the end of the list. @@ -745,21 +744,66 @@ static void PotentiallyAddListenerTo(Instrumentation::InstrumentationEvent event } else { list.push_back(listener); } - *has_listener = true; + return true; +} + +static void PotentiallyAddListenerTo(Instrumentation::InstrumentationEvent event, + uint32_t events, + std::list<InstrumentationListener*>& list, + InstrumentationListener* listener, + bool* has_listener) + REQUIRES(Locks::mutator_lock_, !Locks::thread_list_lock_, !Locks::classlinker_classes_lock_) { + if (PotentiallyAddListenerTo(event, events, list, listener)) { + *has_listener = true; + } +} + +static void PotentiallyAddListenerTo(Instrumentation::InstrumentationEvent event, + uint32_t events, + std::list<InstrumentationListener*>& list, + InstrumentationListener* listener, + uint8_t* has_listener, + uint8_t flag) + REQUIRES(Locks::mutator_lock_, !Locks::thread_list_lock_, !Locks::classlinker_classes_lock_) { + if (PotentiallyAddListenerTo(event, events, list, listener)) { + *has_listener = *has_listener | flag; + } } -void Instrumentation::AddListener(InstrumentationListener* listener, uint32_t events) { +void Instrumentation::AddListener(InstrumentationListener* listener, + uint32_t events, + bool is_trace_listener) { Locks::mutator_lock_->AssertExclusiveHeld(Thread::Current()); - PotentiallyAddListenerTo(kMethodEntered, - events, - method_entry_listeners_, - listener, - &have_method_entry_listeners_); - PotentiallyAddListenerTo(kMethodExited, - events, - method_exit_listeners_, - listener, - &have_method_exit_listeners_); + if (is_trace_listener) { + PotentiallyAddListenerTo(kMethodEntered, + events, + method_entry_fast_trace_listeners_, + listener, + &have_method_entry_listeners_, + kFastTraceListeners); + } else { + PotentiallyAddListenerTo(kMethodEntered, + events, + method_entry_slow_listeners_, + listener, + &have_method_entry_listeners_, + kSlowMethodEntryExitListeners); + } + if (is_trace_listener) { + PotentiallyAddListenerTo(kMethodExited, + events, + method_exit_fast_trace_listeners_, + listener, + &have_method_exit_listeners_, + kFastTraceListeners); + } else { + PotentiallyAddListenerTo(kMethodExited, + events, + method_exit_slow_listeners_, + listener, + &have_method_exit_listeners_, + kSlowMethodEntryExitListeners); + } PotentiallyAddListenerTo(kMethodUnwind, events, method_unwind_listeners_, @@ -808,15 +852,14 @@ void Instrumentation::AddListener(InstrumentationListener* listener, uint32_t ev } } -static void PotentiallyRemoveListenerFrom(Instrumentation::InstrumentationEvent event, +static bool PotentiallyRemoveListenerFrom(Instrumentation::InstrumentationEvent event, uint32_t events, std::list<InstrumentationListener*>& list, - InstrumentationListener* listener, - bool* has_listener) + InstrumentationListener* listener) REQUIRES(Locks::mutator_lock_, !Locks::thread_list_lock_, !Locks::classlinker_classes_lock_) { Locks::mutator_lock_->AssertExclusiveHeld(Thread::Current()); if (!HasEvent(event, events)) { - return; + return false; } auto it = std::find(list.begin(), list.end(), listener); if (it != list.end()) { @@ -825,28 +868,73 @@ static void PotentiallyRemoveListenerFrom(Instrumentation::InstrumentationEvent *it = nullptr; } - // Check if the list contains any non-null listener, and update 'has_listener'. + // Check if the list contains any non-null listener. for (InstrumentationListener* l : list) { if (l != nullptr) { - *has_listener = true; - return; + return false; } } - *has_listener = false; + + return true; } -void Instrumentation::RemoveListener(InstrumentationListener* listener, uint32_t events) { +static void PotentiallyRemoveListenerFrom(Instrumentation::InstrumentationEvent event, + uint32_t events, + std::list<InstrumentationListener*>& list, + InstrumentationListener* listener, + bool* has_listener) + REQUIRES(Locks::mutator_lock_, !Locks::thread_list_lock_, !Locks::classlinker_classes_lock_) { + if (PotentiallyRemoveListenerFrom(event, events, list, listener)) { + *has_listener = false; + } +} + +static void PotentiallyRemoveListenerFrom(Instrumentation::InstrumentationEvent event, + uint32_t events, + std::list<InstrumentationListener*>& list, + InstrumentationListener* listener, + uint8_t* has_listener, + uint8_t flag) + REQUIRES(Locks::mutator_lock_, !Locks::thread_list_lock_, !Locks::classlinker_classes_lock_) { + if (PotentiallyRemoveListenerFrom(event, events, list, listener)) { + *has_listener = *has_listener & ~flag; + } +} + +void Instrumentation::RemoveListener(InstrumentationListener* listener, + uint32_t events, + bool is_trace_listener) { Locks::mutator_lock_->AssertExclusiveHeld(Thread::Current()); - PotentiallyRemoveListenerFrom(kMethodEntered, - events, - method_entry_listeners_, - listener, - &have_method_entry_listeners_); - PotentiallyRemoveListenerFrom(kMethodExited, - events, - method_exit_listeners_, - listener, - &have_method_exit_listeners_); + if (is_trace_listener) { + PotentiallyRemoveListenerFrom(kMethodEntered, + events, + method_entry_fast_trace_listeners_, + listener, + &have_method_entry_listeners_, + kFastTraceListeners); + } else { + PotentiallyRemoveListenerFrom(kMethodEntered, + events, + method_entry_slow_listeners_, + listener, + &have_method_entry_listeners_, + kSlowMethodEntryExitListeners); + } + if (is_trace_listener) { + PotentiallyRemoveListenerFrom(kMethodExited, + events, + method_exit_fast_trace_listeners_, + listener, + &have_method_exit_listeners_, + kFastTraceListeners); + } else { + PotentiallyRemoveListenerFrom(kMethodExited, + events, + method_exit_slow_listeners_, + listener, + &have_method_exit_listeners_, + kSlowMethodEntryExitListeners); + } PotentiallyRemoveListenerFrom(kMethodUnwind, events, method_unwind_listeners_, @@ -1323,7 +1411,12 @@ const void* Instrumentation::GetMaybeInstrumentedCodeForInvoke(ArtMethod* method void Instrumentation::MethodEnterEventImpl(Thread* thread, ArtMethod* method) const { DCHECK(!method->IsRuntimeMethod()); if (HasMethodEntryListeners()) { - for (InstrumentationListener* listener : method_entry_listeners_) { + for (InstrumentationListener* listener : method_entry_slow_listeners_) { + if (listener != nullptr) { + listener->MethodEntered(thread, method); + } + } + for (InstrumentationListener* listener : method_entry_fast_trace_listeners_) { if (listener != nullptr) { listener->MethodEntered(thread, method); } @@ -1337,7 +1430,12 @@ void Instrumentation::MethodExitEventImpl(Thread* thread, OptionalFrame frame, MutableHandle<mirror::Object>& return_value) const { if (HasMethodExitListeners()) { - for (InstrumentationListener* listener : method_exit_listeners_) { + for (InstrumentationListener* listener : method_exit_slow_listeners_) { + if (listener != nullptr) { + listener->MethodExited(thread, method, frame, return_value); + } + } + for (InstrumentationListener* listener : method_exit_fast_trace_listeners_) { if (listener != nullptr) { listener->MethodExited(thread, method, frame, return_value); } @@ -1354,7 +1452,12 @@ template<> void Instrumentation::MethodExitEventImpl(Thread* thread, StackHandleScope<1> hs(self); if (method->GetInterfaceMethodIfProxy(kRuntimePointerSize)->GetReturnTypePrimitive() != Primitive::kPrimNot) { - for (InstrumentationListener* listener : method_exit_listeners_) { + for (InstrumentationListener* listener : method_exit_slow_listeners_) { + if (listener != nullptr) { + listener->MethodExited(thread, method, frame, return_value); + } + } + for (InstrumentationListener* listener : method_exit_fast_trace_listeners_) { if (listener != nullptr) { listener->MethodExited(thread, method, frame, return_value); } diff --git a/runtime/instrumentation.h b/runtime/instrumentation.h index b31d0da671..144ee09e39 100644 --- a/runtime/instrumentation.h +++ b/runtime/instrumentation.h @@ -199,6 +199,9 @@ class Instrumentation { kInstrumentWithInterpreter // execute with interpreter }; + static constexpr uint8_t kFastTraceListeners = 0b01; + static constexpr uint8_t kSlowMethodEntryExitListeners = 0b10; + Instrumentation(); static constexpr MemberOffset RunExitHooksOffset() { @@ -219,7 +222,7 @@ class Instrumentation { } static constexpr MemberOffset HaveMethodExitListenersOffset() { - // Assert that have_method_exit_listeners_ is 8bits wide. If the size changes + // Assert that have_method_exit_slow_listeners_ is 8bits wide. If the size changes // update the compare instructions in the code generator when generating checks for // MethodEntryExitHooks. static_assert(sizeof(have_method_exit_listeners_) == 1, @@ -231,11 +234,15 @@ class Instrumentation { // suspend the runtime to install stubs. You are expected to hold the mutator lock as a proxy // for saying you should have suspended all threads (installing stubs while threads are running // will break). - void AddListener(InstrumentationListener* listener, uint32_t events) + void AddListener(InstrumentationListener* listener, + uint32_t events, + bool is_trace_listener = false) REQUIRES(Locks::mutator_lock_, !Locks::thread_list_lock_, !Locks::classlinker_classes_lock_); // Removes listeners for the specified events. - void RemoveListener(InstrumentationListener* listener, uint32_t events) + void RemoveListener(InstrumentationListener* listener, + uint32_t events, + bool is_trace_listener = false) REQUIRES(Locks::mutator_lock_, !Locks::thread_list_lock_, !Locks::classlinker_classes_lock_); // Calls UndeoptimizeEverything which may visit class linker classes through ConfigureStubs. @@ -364,11 +371,11 @@ class Instrumentation { } bool HasMethodEntryListeners() const REQUIRES_SHARED(Locks::mutator_lock_) { - return have_method_entry_listeners_; + return have_method_entry_listeners_ != 0; } bool HasMethodExitListeners() const REQUIRES_SHARED(Locks::mutator_lock_) { - return have_method_exit_listeners_; + return have_method_exit_listeners_ != 0; } bool HasMethodUnwindListeners() const REQUIRES_SHARED(Locks::mutator_lock_) { @@ -678,41 +685,37 @@ class Instrumentation { // Did the runtime request we only run in the interpreter? ie -Xint mode. bool forced_interpret_only_; - // Do we have any listeners for method entry events? Short-cut to avoid taking the - // instrumentation_lock_. - bool have_method_entry_listeners_ GUARDED_BY(Locks::mutator_lock_); + // For method entry / exit events, we maintain fast trace listeners in a separate list to make + // implementation of fast trace listeners more efficient by JITing the code to handle fast trace + // events. We use a uint8_t (and not bool) to encode if there are none / fast / slow listeners. + // Do we have any listeners for method entry events. + uint8_t have_method_entry_listeners_ GUARDED_BY(Locks::mutator_lock_); - // Do we have any listeners for method exit events? Short-cut to avoid taking the - // instrumentation_lock_. - bool have_method_exit_listeners_ GUARDED_BY(Locks::mutator_lock_); + // Do we have any listeners for method exit events. + uint8_t have_method_exit_listeners_ GUARDED_BY(Locks::mutator_lock_); - // Do we have any listeners for method unwind events? Short-cut to avoid taking the - // instrumentation_lock_. + // Do we have any listeners for method unwind events? bool have_method_unwind_listeners_ GUARDED_BY(Locks::mutator_lock_); - // Do we have any listeners for dex move events? Short-cut to avoid taking the - // instrumentation_lock_. + // Do we have any listeners for dex move events? bool have_dex_pc_listeners_ GUARDED_BY(Locks::mutator_lock_); - // Do we have any listeners for field read events? Short-cut to avoid taking the - // instrumentation_lock_. + // Do we have any listeners for field read events? bool have_field_read_listeners_ GUARDED_BY(Locks::mutator_lock_); - // Do we have any listeners for field write events? Short-cut to avoid taking the - // instrumentation_lock_. + // Do we have any listeners for field write events? bool have_field_write_listeners_ GUARDED_BY(Locks::mutator_lock_); - // Do we have any exception thrown listeners? Short-cut to avoid taking the instrumentation_lock_. + // Do we have any exception thrown listeners? bool have_exception_thrown_listeners_ GUARDED_BY(Locks::mutator_lock_); - // Do we have any frame pop listeners? Short-cut to avoid taking the instrumentation_lock_. + // Do we have any frame pop listeners? bool have_watched_frame_pop_listeners_ GUARDED_BY(Locks::mutator_lock_); - // Do we have any branch listeners? Short-cut to avoid taking the instrumentation_lock_. + // Do we have any branch listeners? bool have_branch_listeners_ GUARDED_BY(Locks::mutator_lock_); - // Do we have any exception handled listeners? Short-cut to avoid taking the - // instrumentation_lock_. + // Do we have any exception handled listeners? bool have_exception_handled_listeners_ GUARDED_BY(Locks::mutator_lock_); // Contains the instrumentation level required by each client of the instrumentation identified @@ -730,8 +733,12 @@ class Instrumentation { // listeners can also be deleted concurrently. // As a result, these lists are never trimmed. That's acceptable given the low number of // listeners we have. - std::list<InstrumentationListener*> method_entry_listeners_ GUARDED_BY(Locks::mutator_lock_); - std::list<InstrumentationListener*> method_exit_listeners_ GUARDED_BY(Locks::mutator_lock_); + std::list<InstrumentationListener*> method_entry_slow_listeners_ GUARDED_BY(Locks::mutator_lock_); + std::list<InstrumentationListener*> method_entry_fast_trace_listeners_ + GUARDED_BY(Locks::mutator_lock_); + std::list<InstrumentationListener*> method_exit_slow_listeners_ GUARDED_BY(Locks::mutator_lock_); + std::list<InstrumentationListener*> method_exit_fast_trace_listeners_ + GUARDED_BY(Locks::mutator_lock_); std::list<InstrumentationListener*> method_unwind_listeners_ GUARDED_BY(Locks::mutator_lock_); std::list<InstrumentationListener*> branch_listeners_ GUARDED_BY(Locks::mutator_lock_); std::list<InstrumentationListener*> dex_pc_listeners_ GUARDED_BY(Locks::mutator_lock_); diff --git a/runtime/thread.h b/runtime/thread.h index 5350330daf..8167e701b9 100644 --- a/runtime/thread.h +++ b/runtime/thread.h @@ -951,6 +951,18 @@ class Thread { thread_local_alloc_stack_end)); } + template <PointerSize pointer_size> + static constexpr ThreadOffset<pointer_size> TraceBufferIndexOffset() { + return ThreadOffsetFromTlsPtr<pointer_size>( + OFFSETOF_MEMBER(tls_ptr_sized_values, method_trace_buffer_index)); + } + + template <PointerSize pointer_size> + static constexpr ThreadOffset<pointer_size> TraceBufferPtrOffset() { + return ThreadOffsetFromTlsPtr<pointer_size>( + OFFSETOF_MEMBER(tls_ptr_sized_values, method_trace_buffer)); + } + // Size of stack less any space reserved for stack overflow size_t GetStackSize() const { return tlsPtr_.stack_size - (tlsPtr_.stack_end - tlsPtr_.stack_begin); diff --git a/runtime/trace.cc b/runtime/trace.cc index 25b6f0ba8b..d156db3286 100644 --- a/runtime/trace.cc +++ b/runtime/trace.cc @@ -555,16 +555,15 @@ void Trace::Start(std::unique_ptr<File>&& trace_file_in, runtime->GetInstrumentation()->UpdateEntrypointsForDebuggable(); runtime->DeoptimizeBootImage(); } + // For thread cpu clocks, we need to make a kernel call and hence we call into c++ to + // support them. + bool is_fast_trace = !the_trace_->UseThreadCpuClock(); runtime->GetInstrumentation()->AddListener( the_trace_, instrumentation::Instrumentation::kMethodEntered | instrumentation::Instrumentation::kMethodExited | - instrumentation::Instrumentation::kMethodUnwind); - // TODO: In full-PIC mode, we don't need to fully deopt. - // TODO: We can only use trampoline entrypoints if we are java-debuggable since in that case - // we know that inlining and other problematic optimizations are disabled. We might just - // want to use the trampolines anyway since it is faster. It makes the story with disabling - // jit-gc more complex though. + instrumentation::Instrumentation::kMethodUnwind, + is_fast_trace); runtime->GetInstrumentation()->EnableMethodTracing(kTracerInstrumentationKey, the_trace_, /*needs_interpreter=*/false); @@ -638,11 +637,15 @@ void Trace::StopTracing(bool finish_tracing, bool flush_file) { MutexLock mu(self, *Locks::thread_list_lock_); runtime->GetThreadList()->ForEach(ClearThreadStackTraceAndClockBase, nullptr); } else { + // For thread cpu clocks, we need to make a kernel call and hence we call into c++ to support + // them. + bool is_fast_trace = !the_trace_->UseThreadCpuClock(); runtime->GetInstrumentation()->RemoveListener( the_trace, instrumentation::Instrumentation::kMethodEntered | instrumentation::Instrumentation::kMethodExited | - instrumentation::Instrumentation::kMethodUnwind); + instrumentation::Instrumentation::kMethodUnwind, + is_fast_trace); runtime->GetInstrumentation()->DisableMethodTracing(kTracerInstrumentationKey); runtime->GetInstrumentation()->MaybeSwitchRuntimeDebugState(self); } @@ -1031,7 +1034,7 @@ void Trace::RecordStreamingMethodEvent(Thread* thread, if (method_trace_buffer == nullptr) { method_trace_buffer = new uintptr_t[std::max(kMinBufSize, kPerThreadBufSize)](); thread->SetMethodTraceBuffer(method_trace_buffer); - *current_offset = 0; + *current_offset = kPerThreadBufSize - 1; // This is the first event from this thread, so first record information about the thread. std::string thread_name; @@ -1056,29 +1059,29 @@ void Trace::RecordStreamingMethodEvent(Thread* thread, } size_t required_entries = (clock_source_ == TraceClockSource::kDual) ? 4 : 3; - if (*current_offset + required_entries >= kPerThreadBufSize) { + if (*current_offset < required_entries) { // We don't have space for further entries. Flush the contents of the buffer and reuse the // buffer to store contents. Reset the index to the start of the buffer. FlushStreamingBuffer(thread); - *current_offset = 0; + *current_offset = kPerThreadBufSize - 1; } // Record entry in per-thread trace buffer. int current_index = *current_offset; - method_trace_buffer[current_index++] = reinterpret_cast<uintptr_t>(method); + method_trace_buffer[current_index--] = reinterpret_cast<uintptr_t>(method); // TODO(mythria): We only need two bits to record the action. Consider merging // it with the method entry to save space. - method_trace_buffer[current_index++] = action; + method_trace_buffer[current_index--] = action; if (UseThreadCpuClock()) { - method_trace_buffer[current_index++] = thread_clock_diff; + method_trace_buffer[current_index--] = thread_clock_diff; } if (UseWallClock()) { if (art::kRuntimePointerSize == PointerSize::k32) { // On 32-bit architectures store timestamp counter as two 32-bit values. - method_trace_buffer[current_index++] = timestamp_counter >> 32; - method_trace_buffer[current_index++] = static_cast<uint32_t>(timestamp_counter); + method_trace_buffer[current_index--] = timestamp_counter >> 32; + method_trace_buffer[current_index--] = static_cast<uint32_t>(timestamp_counter); } else { - method_trace_buffer[current_index++] = timestamp_counter; + method_trace_buffer[current_index--] = timestamp_counter; } } *current_offset = current_index; @@ -1114,6 +1117,7 @@ void Trace::FlushStreamingBuffer(Thread* thread) { // seen method. tracing_lock_ is required to serialize these. MutexLock mu(Thread::Current(), tracing_lock_); uintptr_t* method_trace_buffer = thread->GetMethodTraceBuffer(); + CHECK(method_trace_buffer != nullptr); // Create a temporary buffer to encode the trace events from the specified thread. size_t buffer_size = kPerThreadBufSize; size_t current_index = 0; @@ -1121,19 +1125,19 @@ void Trace::FlushStreamingBuffer(Thread* thread) { size_t num_entries = *(thread->GetMethodTraceIndexPtr()); uint16_t thread_id = GetThreadEncoding(thread->GetTid()); - for (size_t entry_index = 0; entry_index < num_entries;) { - ArtMethod* method = reinterpret_cast<ArtMethod*>(method_trace_buffer[entry_index++]); - TraceAction action = DecodeTraceAction(method_trace_buffer[entry_index++]); + for (size_t entry_index = kPerThreadBufSize - 1; entry_index > num_entries;) { + ArtMethod* method = reinterpret_cast<ArtMethod*>(method_trace_buffer[entry_index--]); + TraceAction action = DecodeTraceAction(method_trace_buffer[entry_index--]); uint32_t thread_time = 0; uint32_t wall_time = 0; if (UseThreadCpuClock()) { - thread_time = method_trace_buffer[entry_index++]; + thread_time = method_trace_buffer[entry_index--]; } if (UseWallClock()) { - uint64_t timestamp = method_trace_buffer[entry_index++]; + uint64_t timestamp = method_trace_buffer[entry_index--]; if (art::kRuntimePointerSize == PointerSize::k32) { // On 32-bit architectures timestamp is stored as two 32-bit values. - timestamp = (timestamp << 32 | method_trace_buffer[entry_index++]); + timestamp = (timestamp << 32 | method_trace_buffer[entry_index--]); } wall_time = GetMicroTime(timestamp) - start_time_; } diff --git a/runtime/trace.h b/runtime/trace.h index 5e743435d4..92ce858733 100644 --- a/runtime/trace.h +++ b/runtime/trace.h @@ -98,6 +98,20 @@ enum TraceAction { kTraceMethodActionMask = 0x03, // two bits }; +// We need 4 entries to store 64-bit timestamp counter as two 32-bit values on 32-bit architectures. +static constexpr uint32_t kNumEntriesForWallClock = + (kRuntimePointerSize == PointerSize::k64) ? 3 : 4; + +// These define offsets in bytes for the individual fields of a trace entry. These are used by the +// JITed code when storing a trace entry. +static constexpr int32_t kMethodOffsetInBytes = 0; +static constexpr int32_t kTraceActionOffsetInBytes = + -1 * static_cast<uint32_t>(kRuntimePointerSize); +static constexpr int32_t kTimestampOffsetInBytes = -2 * static_cast<uint32_t>(kRuntimePointerSize); +// This is valid only for 32-bit architectures. +static constexpr int32_t kLowTimestampOffsetInBytes = + -3 * static_cast<uint32_t>(kRuntimePointerSize); + // Class for recording event traces. Trace data is either collected // synchronously during execution (TracingMode::kMethodTracingActive), // or by a separate sampling thread (TracingMode::kSampleProfilingActive). diff --git a/test/2246-trace-stream/expected-stdout.txt b/test/2246-trace-stream/expected-stdout.txt index da5e84c837..c0cf36b381 100644 --- a/test/2246-trace-stream/expected-stdout.txt +++ b/test/2246-trace-stream/expected-stdout.txt @@ -1,7 +1,8 @@ +JNI_OnLoad called ***** streaming test - dual clock ******* .>> TestThread2246 java.lang.Thread run ()V Thread.java ..>> TestThread2246 Main$$ExternalSyntheticLambda0 run ()V D8$$SyntheticClass -...>> TestThread2246 Main lambda$testTracing$0 (IZLBaseTraceParser;I)V Main.java +...>> TestThread2246 Main lambda$testTracing$0 (IZLMain;LBaseTraceParser;I)V Main.java ....>> TestThread2246 Main$VMDebug startMethodTracing (Ljava/lang/String;Ljava/io/FileDescriptor;IIZIZ)V Main.java .....>> TestThread2246 java.lang.reflect.Method invoke (Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; Method.java ......>> TestThread2246 dalvik.system.VMDebug startMethodTracing (Ljava/lang/String;Ljava/io/FileDescriptor;IIZIZ)V VMDebug.java @@ -22,6 +23,166 @@ .....>> TestThread2246 Main callLeafFunction ()V Main.java .....<< TestThread2246 Main callLeafFunction ()V Main.java ....<< TestThread2246 Main $noinline$doSomeWork ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java ....>> TestThread2246 Main$VMDebug $noinline$stopMethodTracing ()V Main.java .>> main Main main ([Ljava/lang/String;)V Main.java ..>> main Main testTracing (ZILBaseTraceParser;I)V Main.java @@ -41,6 +202,166 @@ ....>> main Main callLeafFunction ()V Main.java ....<< main Main callLeafFunction ()V Main.java ...<< main Main $noinline$doSomeWork ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java ...>> main Main doSomeWorkThrow ()V Main.java ....>> main Main callThrowFunction ()V Main.java .....>> main java.lang.Exception <init> (Ljava/lang/String;)V Exception.java @@ -61,7 +382,7 @@ ***** streaming test - wall clock ******* .>> TestThread2246 java.lang.Thread run ()V Thread.java ..>> TestThread2246 Main$$ExternalSyntheticLambda0 run ()V D8$$SyntheticClass -...>> TestThread2246 Main lambda$testTracing$0 (IZLBaseTraceParser;I)V Main.java +...>> TestThread2246 Main lambda$testTracing$0 (IZLMain;LBaseTraceParser;I)V Main.java ....>> TestThread2246 Main$VMDebug startMethodTracing (Ljava/lang/String;Ljava/io/FileDescriptor;IIZIZ)V Main.java .....>> TestThread2246 java.lang.reflect.Method invoke (Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; Method.java ......>> TestThread2246 dalvik.system.VMDebug startMethodTracing (Ljava/lang/String;Ljava/io/FileDescriptor;IIZIZ)V VMDebug.java @@ -82,6 +403,166 @@ .....>> TestThread2246 Main callLeafFunction ()V Main.java .....<< TestThread2246 Main callLeafFunction ()V Main.java ....<< TestThread2246 Main $noinline$doSomeWork ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java ....>> TestThread2246 Main$VMDebug $noinline$stopMethodTracing ()V Main.java .>> main Main main ([Ljava/lang/String;)V Main.java ..>> main Main testTracing (ZILBaseTraceParser;I)V Main.java @@ -101,6 +582,166 @@ ....>> main Main callLeafFunction ()V Main.java ....<< main Main callLeafFunction ()V Main.java ...<< main Main $noinline$doSomeWork ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java ...>> main Main doSomeWorkThrow ()V Main.java ....>> main Main callThrowFunction ()V Main.java .....>> main java.lang.Exception <init> (Ljava/lang/String;)V Exception.java @@ -121,7 +762,7 @@ ***** non streaming test - dual clock ******* .>> TestThread2246 java.lang.Thread run ()V Thread.java ..>> TestThread2246 Main$$ExternalSyntheticLambda0 run ()V D8$$SyntheticClass -...>> TestThread2246 Main lambda$testTracing$0 (IZLBaseTraceParser;I)V Main.java +...>> TestThread2246 Main lambda$testTracing$0 (IZLMain;LBaseTraceParser;I)V Main.java ....>> TestThread2246 Main$VMDebug startMethodTracing (Ljava/lang/String;Ljava/io/FileDescriptor;IIZIZ)V Main.java .....>> TestThread2246 java.lang.reflect.Method invoke (Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; Method.java ......>> TestThread2246 dalvik.system.VMDebug startMethodTracing (Ljava/lang/String;Ljava/io/FileDescriptor;IIZIZ)V VMDebug.java @@ -142,6 +783,166 @@ .....>> TestThread2246 Main callLeafFunction ()V Main.java .....<< TestThread2246 Main callLeafFunction ()V Main.java ....<< TestThread2246 Main $noinline$doSomeWork ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java ....>> TestThread2246 Main$VMDebug $noinline$stopMethodTracing ()V Main.java .>> main Main main ([Ljava/lang/String;)V Main.java ..>> main Main testTracing (ZILBaseTraceParser;I)V Main.java @@ -161,6 +962,166 @@ ....>> main Main callLeafFunction ()V Main.java ....<< main Main callLeafFunction ()V Main.java ...<< main Main $noinline$doSomeWork ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java ...>> main Main doSomeWorkThrow ()V Main.java ....>> main Main callThrowFunction ()V Main.java .....>> main java.lang.Exception <init> (Ljava/lang/String;)V Exception.java @@ -181,7 +1142,7 @@ ***** non streaming test - wall clock ******* .>> TestThread2246 java.lang.Thread run ()V Thread.java ..>> TestThread2246 Main$$ExternalSyntheticLambda0 run ()V D8$$SyntheticClass -...>> TestThread2246 Main lambda$testTracing$0 (IZLBaseTraceParser;I)V Main.java +...>> TestThread2246 Main lambda$testTracing$0 (IZLMain;LBaseTraceParser;I)V Main.java ....>> TestThread2246 Main$VMDebug startMethodTracing (Ljava/lang/String;Ljava/io/FileDescriptor;IIZIZ)V Main.java .....>> TestThread2246 java.lang.reflect.Method invoke (Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; Method.java ......>> TestThread2246 dalvik.system.VMDebug startMethodTracing (Ljava/lang/String;Ljava/io/FileDescriptor;IIZIZ)V VMDebug.java @@ -202,6 +1163,166 @@ .....>> TestThread2246 Main callLeafFunction ()V Main.java .....<< TestThread2246 Main callLeafFunction ()V Main.java ....<< TestThread2246 Main $noinline$doSomeWork ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +....>> TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java +.....>> TestThread2246 Main callOuterFunction ()V Main.java +......>> TestThread2246 Main callLeafFunction ()V Main.java +......<< TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callOuterFunction ()V Main.java +.....>> TestThread2246 Main callLeafFunction ()V Main.java +.....<< TestThread2246 Main callLeafFunction ()V Main.java +....<< TestThread2246 Main $noinline$doSomeWorkJIT ()V Main.java ....>> TestThread2246 Main$VMDebug $noinline$stopMethodTracing ()V Main.java .>> main Main main ([Ljava/lang/String;)V Main.java ..>> main Main testTracing (ZILBaseTraceParser;I)V Main.java @@ -221,6 +1342,166 @@ ....>> main Main callLeafFunction ()V Main.java ....<< main Main callLeafFunction ()V Main.java ...<< main Main $noinline$doSomeWork ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java +...>> main Main $noinline$doSomeWorkJIT ()V Main.java +....>> main Main callOuterFunction ()V Main.java +.....>> main Main callLeafFunction ()V Main.java +.....<< main Main callLeafFunction ()V Main.java +....<< main Main callOuterFunction ()V Main.java +....>> main Main callLeafFunction ()V Main.java +....<< main Main callLeafFunction ()V Main.java +...<< main Main $noinline$doSomeWorkJIT ()V Main.java ...>> main Main doSomeWorkThrow ()V Main.java ....>> main Main callThrowFunction ()V Main.java .....>> main java.lang.Exception <init> (Ljava/lang/String;)V Exception.java diff --git a/test/2246-trace-stream/src/BaseTraceParser.java b/test/2246-trace-stream/src/BaseTraceParser.java index 6cd1c0bfd6..80f695a61a 100644 --- a/test/2246-trace-stream/src/BaseTraceParser.java +++ b/test/2246-trace-stream/src/BaseTraceParser.java @@ -38,6 +38,8 @@ abstract class BaseTraceParser { threadIdMap = new HashMap<Integer, String>(); nestingLevelMap = new HashMap<Integer, Integer>(); threadEventsMap = new HashMap<String, String>(); + threadTimestamp1Map = new HashMap<Integer, Integer>(); + threadTimestamp2Map = new HashMap<Integer, Integer>(); } public void closeFile() throws IOException { @@ -180,7 +182,19 @@ abstract class BaseTraceParser { return str; } - public String ProcessEventEntry(int threadId) throws IOException { + public void CheckTimestamp(int timestamp, int threadId, + HashMap<Integer, Integer> threadTimestampMap) throws Exception { + if (threadTimestampMap.containsKey(threadId)) { + int oldTimestamp = threadTimestampMap.get(threadId); + if (timestamp < oldTimestamp) { + throw new Exception("timestamps are not increasing current: " + timestamp + + " earlier: " + oldTimestamp); + } + } + threadTimestampMap.put(threadId, timestamp); + } + + public String ProcessEventEntry(int threadId) throws IOException, Exception { // Read 4-byte method value int methodAndEvent = readNumber(4); int methodId = methodAndEvent & ~0x3; @@ -189,10 +203,13 @@ abstract class BaseTraceParser { String str = eventTypeToString(eventType, threadId) + " " + threadIdMap.get(threadId) + " " + methodIdMap.get(methodId); // Depending on the version skip either one or two timestamps. - // TODO(mythria): Probably add a check that time stamps are always greater than initial - // timestamp. - int numBytesTimestamp = (traceFormatVersion == 2) ? 4 : 8; - dataStream.skipBytes(numBytesTimestamp); + int timestamp1 = readNumber(4); + CheckTimestamp(timestamp1, threadId, threadTimestamp1Map); + if (traceFormatVersion != 2) { + // Read second timestamp + int timestamp2 = readNumber(4); + CheckTimestamp(timestamp2, threadId, threadTimestamp2Map); + } return str; } @@ -213,6 +230,8 @@ abstract class BaseTraceParser { HashMap<Integer, String> threadIdMap; HashMap<Integer, Integer> nestingLevelMap; HashMap<String, String> threadEventsMap; + HashMap<Integer, Integer> threadTimestamp1Map; + HashMap<Integer, Integer> threadTimestamp2Map; int recordSize = 0; int traceFormatVersion = 0; } diff --git a/test/2246-trace-stream/src/Main.java b/test/2246-trace-stream/src/Main.java index a8295e2f91..b800a1ebb6 100644 --- a/test/2246-trace-stream/src/Main.java +++ b/test/2246-trace-stream/src/Main.java @@ -27,11 +27,15 @@ public class Main { private static File file; public static void main(String[] args) throws Exception { + System.loadLibrary(args[0]); String name = System.getProperty("java.vm.name"); if (!"Dalvik".equals(name)) { System.out.println("This test is not supported on " + name); return; } + + ensureJitCompiled(Main.class, "$noinline$doSomeWorkJIT"); + System.out.println("***** streaming test - dual clock *******"); StreamTraceParser stream_parser = new StreamTraceParser(); testTracing( @@ -66,6 +70,10 @@ public class Main { file.getPath(), out_file.getFD(), 0, flags, false, 0, streaming); Main m1 = new Main(); m1.$noinline$doSomeWork(); + // Call JITed code multiple times to flush out any issues with timestamps. + for (int i = 0; i < 20; i++) { + m.$noinline$doSomeWorkJIT(); + } VMDebug.$noinline$stopMethodTracing(); out_file.close(); parser.CheckTraceFileFormat(file, expected_version, "TestThread2246"); @@ -90,6 +98,10 @@ public class Main { VMDebug.startMethodTracing( file.getPath(), main_out_file.getFD(), 0, flags, false, 0, streaming); m.$noinline$doSomeWork(); + // Call JITed code multiple times to flush out any issues with timestamps. + for (int i = 0; i < 20; i++) { + m.$noinline$doSomeWorkJIT(); + } m.doSomeWorkThrow(); VMDebug.$noinline$stopMethodTracing(); main_out_file.close(); @@ -125,6 +137,11 @@ public class Main { callLeafFunction(); } + public void $noinline$doSomeWorkJIT() { + callOuterFunction(); + callLeafFunction(); + } + public void callThrowFunction() throws Exception { throw new Exception("test"); } @@ -166,4 +183,6 @@ public class Main { return (int) getMethodTracingModeMethod.invoke(null); } } + + private static native void ensureJitCompiled(Class<?> cls, String methodName); } |