Home | History | Annotate | Download | only in cctest
      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   CHECK_EQ(eh_frame_hdr.offset_to_eh_frame(), -(4 + 30));        // A -> D
     69   CHECK_EQ(eh_frame_hdr.offset_to_procedure(), -(30 + 6 + 10));  // B -> E
     70   CHECK_EQ(eh_frame_hdr.offset_to_fde(),
     71            -(30 - EhFrameHdr::kCIESize));  // 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 }
    101