| Index: test/cctest/test-eh-frame-hdr.cc
|
| diff --git a/test/cctest/test-eh-frame-hdr.cc b/test/cctest/test-eh-frame-hdr.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d9539c7d2cc7a8a53a2f50afd409d8c0f2eacdc4
|
| --- /dev/null
|
| +++ b/test/cctest/test-eh-frame-hdr.cc
|
| @@ -0,0 +1,100 @@
|
| +// 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);
|
| +}
|
|
|