OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2016 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 "src/eh-frame.h" | |
6 #include "src/objects.h" | |
7 #include "test/cctest/cctest.h" | |
8 | |
9 using namespace v8::internal; | |
10 | |
11 TEST(EhFrameHdr) { | |
12 CcTest::InitializeVM(); | |
13 HandleScope handle_scope(CcTest::i_isolate()); | |
14 | |
15 // The content is not relevant in this test | |
16 byte buffer[10] = {0}; | |
17 byte unwinding_info[30 + EhFrameHdr::kRecordSize] = {0}; | |
18 | |
19 CodeDesc code_desc; | |
20 code_desc.buffer = &buffer[0]; | |
21 code_desc.buffer_size = sizeof(buffer); | |
22 code_desc.constant_pool_size = 0; | |
23 code_desc.instr_size = sizeof(buffer); | |
24 code_desc.reloc_size = 0; | |
25 code_desc.origin = nullptr; | |
26 code_desc.unwinding_info = &unwinding_info[0]; | |
27 code_desc.unwinding_info_size = sizeof(unwinding_info); | |
28 | |
29 Handle<Code> code = CcTest::i_isolate()->factory()->NewCode( | |
30 code_desc, 0, Handle<Object>::null()); | |
31 | |
32 EhFrameHdr eh_frame_hdr(*code); | |
33 CHECK_EQ(eh_frame_hdr.lut_entries_number(), 1); | |
34 | |
35 // | |
36 // Plugging some numbers in the DSO layout shown in eh-frame.cc: | |
37 // | |
38 // | ... | | |
39 // +---------------+ <-- (E) -------- | |
40 // | | ^ | |
41 // | Instructions | 10 bytes | .text | |
42 // | | v | |
43 // +---------------+ <--------------- | |
44 // |///////////////| | |
45 // |////Padding////| 6 bytes | |
46 // |///////////////| | |
47 // +---------------+ <---(D)--------- | |
48 // | | ^ | |
49 // | CIE | N bytes* | | |
50 // | | | | |
51 // +---------------+ <-- (C) | .eh_frame | |
52 // | | | | |
53 // | FDE | 30 - N bytes | | |
54 // | | v | |
55 // +---------------+ <-- (B) -------- | |
56 // | version | ^ | |
57 // +---------------+ 4 bytes | | |
58 // | encoding | | | |
59 // | specifiers | | | |
60 // +---------------+ <---(A) | .eh_frame_hdr | |
61 // | offset to | | | |
62 // | .eh_frame | | | |
63 // +---------------+ | | |
64 // | ... | ... | |
65 // | |
66 // (*) the size of the CIE is platform dependent. | |
67 // | |
68 int N = EhFrameHdr::kCIESize; | |
rmcilroy
2016/06/24 09:45:26
No need for this local, just use directly below
Stefano Sanfilippo
2016/06/24 10:36:37
Done.
| |
69 CHECK_EQ(eh_frame_hdr.offset_to_eh_frame(), -(4 + 30)); // A -> D | |
70 CHECK_EQ(eh_frame_hdr.offset_to_procedure(), -(30 + 6 + 10)); // B -> E | |
71 CHECK_EQ(eh_frame_hdr.offset_to_fde(), -(30 - N)); // B -> C | |
72 } | |
73 | |
74 TEST(DummyEhFrameHdr) { | |
75 CcTest::InitializeVM(); | |
76 HandleScope handle_scope(CcTest::i_isolate()); | |
77 | |
78 byte buffer[10] = {0}; // The content is not relevant in this test | |
79 | |
80 CodeDesc code_desc; | |
81 code_desc.buffer = &buffer[0]; | |
82 code_desc.buffer_size = sizeof(buffer); | |
83 code_desc.constant_pool_size = 0; | |
84 code_desc.instr_size = sizeof(buffer); | |
85 code_desc.reloc_size = 0; | |
86 code_desc.origin = nullptr; | |
87 code_desc.unwinding_info = nullptr; | |
88 code_desc.unwinding_info_size = 0; | |
89 | |
90 Handle<Code> code = CcTest::i_isolate()->factory()->NewCode( | |
91 code_desc, 0, Handle<Object>::null()); | |
92 | |
93 EhFrameHdr eh_frame_hdr(*code); | |
94 // A dummy header has an empty LUT | |
95 CHECK_EQ(eh_frame_hdr.lut_entries_number(), 0); | |
96 // These values should be irrelevant, but check that they have been zeroed. | |
97 CHECK_EQ(eh_frame_hdr.offset_to_eh_frame(), 0); | |
98 CHECK_EQ(eh_frame_hdr.offset_to_procedure(), 0); | |
99 CHECK_EQ(eh_frame_hdr.offset_to_fde(), 0); | |
100 } | |
OLD | NEW |