LCOV - code coverage report
Current view: top level - test/cctest - test-platform.cc (source / functions) Hit Total Coverage
Test: app.info Lines: 18 18 100.0 %
Date: 2017-10-20 Functions: 4 4 100.0 %

          Line data    Source code
       1             : // Copyright 2013 the V8 project authors. All rights reserved.
       2             : // Use of this source code is governed by a BSD-style license that can be
       3             : // found in the LICENSE file.
       4             : 
       5             : #include <stdint.h>
       6             : #include "src/base/build_config.h"
       7             : #include "src/base/platform/platform.h"
       8             : #include "test/cctest/cctest.h"
       9             : 
      10             : #ifdef V8_CC_GNU
      11             : 
      12             : static uintptr_t sp_addr = 0;
      13             : 
      14          18 : void GetStackPointer(const v8::FunctionCallbackInfo<v8::Value>& args) {
      15             : #if V8_HOST_ARCH_X64
      16           6 :   __asm__ __volatile__("mov %%rsp, %0" : "=g"(sp_addr));
      17             : #elif V8_HOST_ARCH_IA32
      18             :   __asm__ __volatile__("mov %%esp, %0" : "=g"(sp_addr));
      19             : #elif V8_HOST_ARCH_ARM
      20             :   __asm__ __volatile__("str sp, %0" : "=g"(sp_addr));
      21             : #elif V8_HOST_ARCH_ARM64
      22             :   __asm__ __volatile__("mov x16, sp; str x16, %0" : "=g"(sp_addr));
      23             : #elif V8_HOST_ARCH_MIPS
      24             :   __asm__ __volatile__("sw $sp, %0" : "=g"(sp_addr));
      25             : #elif V8_HOST_ARCH_MIPS64
      26             :   __asm__ __volatile__("sd $sp, %0" : "=g"(sp_addr));
      27             : #elif defined(__s390x__) || defined(_ARCH_S390X)
      28             :   __asm__ __volatile__("stg 15, %0" : "=m"(sp_addr));
      29             : #elif defined(__s390__) || defined(_ARCH_S390)
      30             :   __asm__ __volatile__("st 15, %0" : "=m"(sp_addr));
      31             : #elif defined(__PPC64__) || defined(_ARCH_PPC64)
      32             :   __asm__ __volatile__("std 1, %0" : "=g"(sp_addr));
      33             : #elif defined(__PPC__) || defined(_ARCH_PPC)
      34             :   __asm__ __volatile__("stw 1, %0" : "=g"(sp_addr));
      35             : #else
      36             : #error Host architecture was not detected as supported by v8
      37             : #endif
      38             : 
      39             :   args.GetReturnValue().Set(v8::Integer::NewFromUnsigned(
      40          12 :       args.GetIsolate(), static_cast<uint32_t>(sp_addr)));
      41           6 : }
      42             : 
      43             : 
      44       23724 : TEST(StackAlignment) {
      45           6 :   v8::Isolate* isolate = CcTest::isolate();
      46           6 :   v8::HandleScope handle_scope(isolate);
      47             :   v8::Local<v8::ObjectTemplate> global_template =
      48           6 :       v8::ObjectTemplate::New(isolate);
      49             :   global_template->Set(v8_str("get_stack_pointer"),
      50          18 :                        v8::FunctionTemplate::New(isolate, GetStackPointer));
      51             : 
      52          12 :   LocalContext env(nullptr, global_template);
      53             :   CompileRun(
      54             :       "function foo() {"
      55             :       "  return get_stack_pointer();"
      56             :       "}");
      57             : 
      58           6 :   v8::Local<v8::Object> global_object = env->Global();
      59             :   v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast(
      60          18 :       global_object->Get(isolate->GetCurrentContext(), v8_str("foo"))
      61           6 :           .ToLocalChecked());
      62             : 
      63             :   v8::Local<v8::Value> result =
      64          12 :       foo->Call(isolate->GetCurrentContext(), global_object, 0, nullptr)
      65           6 :           .ToLocalChecked();
      66          12 :   CHECK_EQ(0u, result->Uint32Value(isolate->GetCurrentContext()).FromJust() %
      67           6 :                    v8::base::OS::ActivationFrameAlignment());
      68       71160 : }
      69             : 
      70             : #endif  // V8_CC_GNU

Generated by: LCOV version 1.10