| // Copyright 2016 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Test enabled only on supported architectures. |
| #if V8_OS_LINUX && \ |
| (defined(V8_TARGET_ARCH_X64) || defined(V8_TARGET_ARCH_ARM) || \ |
| defined(V8_TARGET_ARCH_ARM64)) |
| |
| #include "src/flags/flags.h" |
| #include "src/objects/objects-inl.h" |
| #include "src/objects/objects.h" |
| #include "test/cctest/compiler/function-tester.h" |
| |
| namespace v8 { |
| namespace internal { |
| namespace compiler { |
| |
| TEST(RunUnwindingInfo) { |
| FLAG_always_opt = true; |
| FLAG_perf_prof_unwinding_info = true; |
| |
| FunctionTester tester( |
| "(function (x) {\n" |
| " function f(x) { return x*x; }\n" |
| " return x > 0 ? x+1 : f(x);\n" |
| "})"); |
| |
| tester.Call(tester.Val(-1)); |
| |
| CHECK(tester.function->code().has_unwinding_info()); |
| } |
| |
| // TODO(ssanfilippo) Build low-level graph and check that state is correctly |
| // restored in the following situation: |
| // |
| // +-----------------+ |
| // | no frame |---+ |
| // check that a +-----------------+ | |
| // a noframe state | construct frame |<--+ |
| // is restored here --> +-----------------+ | |
| // | construct frame |<--+ |
| // +-----------------+ |
| // |
| // Same for <construct>/<destruct>/<destruct> (a <construct> status is restored) |
| |
| // TODO(ssanfilippo) Intentionally reach a BB with different initial states |
| // and check that the UnwindingInforWriter fails in debug mode: |
| // |
| // +----------------+ |
| // +---| State A | |
| // | +----------------+ |
| // | | State B != A |---+ |
| // | +----------------+ | |
| // +-->| Failure here |<--+ |
| // +----------------+ |
| |
| } // namespace compiler |
| } // namespace internal |
| } // namespace v8 |
| |
| #endif |