9b9f885e99
Reason for revert: The STATIC_CONST_MEMBER_DEFINITION in eh-frame-writer-unittest.cc causes a compiler error on V8 Win64 - clang buildbot. Removing that bit should be sufficient. Original issue's description: > Implement .eh_frame writer and disassembler. > > Also, CodeGenerator::MakeCodeEpilogue now accepts an optional pointer > to a EhFrameWriter and will attach unwinding information to the code > object when passed one. > > BUG=v8:4899 > LOG=N > > Committed: https://crrev.com/27d810e63b744b5b3d9aa28ff21413247773e6c2 > Cr-Commit-Position: refs/heads/master@{#37683} TBR=rmcilroy@chromium.org,jarin@chromium.org # Skipping CQ checks because original CL landed less than 1 days ago. NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true BUG=v8:4899 Review-Url: https://codereview.chromium.org/2143033002 Cr-Commit-Position: refs/heads/master@{#37688}
101 lines
3.4 KiB
C++
101 lines
3.4 KiB
C++
// 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.
|
|
|
|
#include "src/eh-frame.h"
|
|
#include "src/objects.h"
|
|
#include "test/cctest/cctest.h"
|
|
|
|
using namespace v8::internal;
|
|
|
|
TEST(EhFrameHdr) {
|
|
CcTest::InitializeVM();
|
|
HandleScope handle_scope(CcTest::i_isolate());
|
|
|
|
// The content is not relevant in this test
|
|
byte buffer[10] = {0};
|
|
byte unwinding_info[30 + EhFrameHdr::kRecordSize] = {0};
|
|
|
|
CodeDesc code_desc;
|
|
code_desc.buffer = &buffer[0];
|
|
code_desc.buffer_size = sizeof(buffer);
|
|
code_desc.constant_pool_size = 0;
|
|
code_desc.instr_size = sizeof(buffer);
|
|
code_desc.reloc_size = 0;
|
|
code_desc.origin = nullptr;
|
|
code_desc.unwinding_info = &unwinding_info[0];
|
|
code_desc.unwinding_info_size = sizeof(unwinding_info);
|
|
|
|
Handle<Code> code = CcTest::i_isolate()->factory()->NewCode(
|
|
code_desc, 0, Handle<Object>::null());
|
|
|
|
EhFrameHdr eh_frame_hdr(*code);
|
|
CHECK_EQ(eh_frame_hdr.lut_entries_number(), 1);
|
|
|
|
//
|
|
// Plugging some numbers in the DSO layout shown in eh-frame.cc:
|
|
//
|
|
// | ... |
|
|
// +---------------+ <-- (E) --------
|
|
// | | ^
|
|
// | Instructions | 10 bytes | .text
|
|
// | | v
|
|
// +---------------+ <---------------
|
|
// |///////////////|
|
|
// |////Padding////| 6 bytes
|
|
// |///////////////|
|
|
// +---------------+ <---(D)---------
|
|
// | | ^
|
|
// | CIE | N bytes* |
|
|
// | | |
|
|
// +---------------+ <-- (C) | .eh_frame
|
|
// | | |
|
|
// | FDE | 30 - N bytes |
|
|
// | | v
|
|
// +---------------+ <-- (B) --------
|
|
// | version | ^
|
|
// +---------------+ 4 bytes |
|
|
// | encoding | |
|
|
// | specifiers | |
|
|
// +---------------+ <---(A) | .eh_frame_hdr
|
|
// | offset to | |
|
|
// | .eh_frame | |
|
|
// +---------------+ |
|
|
// | ... | ...
|
|
//
|
|
// (*) the size of the CIE is platform dependent.
|
|
//
|
|
CHECK_EQ(eh_frame_hdr.offset_to_eh_frame(), -(4 + 30)); // A -> D
|
|
CHECK_EQ(eh_frame_hdr.offset_to_procedure(), -(30 + 6 + 10)); // B -> E
|
|
CHECK_EQ(eh_frame_hdr.offset_to_fde(),
|
|
-(30 - EhFrameHdr::kCIESize)); // B -> C
|
|
}
|
|
|
|
TEST(DummyEhFrameHdr) {
|
|
CcTest::InitializeVM();
|
|
HandleScope handle_scope(CcTest::i_isolate());
|
|
|
|
byte buffer[10] = {0}; // The content is not relevant in this test
|
|
|
|
CodeDesc code_desc;
|
|
code_desc.buffer = &buffer[0];
|
|
code_desc.buffer_size = sizeof(buffer);
|
|
code_desc.constant_pool_size = 0;
|
|
code_desc.instr_size = sizeof(buffer);
|
|
code_desc.reloc_size = 0;
|
|
code_desc.origin = nullptr;
|
|
code_desc.unwinding_info = nullptr;
|
|
code_desc.unwinding_info_size = 0;
|
|
|
|
Handle<Code> code = CcTest::i_isolate()->factory()->NewCode(
|
|
code_desc, 0, Handle<Object>::null());
|
|
|
|
EhFrameHdr eh_frame_hdr(*code);
|
|
// A dummy header has an empty LUT
|
|
CHECK_EQ(eh_frame_hdr.lut_entries_number(), 0);
|
|
// These values should be irrelevant, but check that they have been zeroed.
|
|
CHECK_EQ(eh_frame_hdr.offset_to_eh_frame(), 0);
|
|
CHECK_EQ(eh_frame_hdr.offset_to_procedure(), 0);
|
|
CHECK_EQ(eh_frame_hdr.offset_to_fde(), 0);
|
|
}
|