dwarf2reader_test_common.h revision 6162aed3c3fcfc53373c963ac375d39a5dfa5a25
1b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// -*- mode: c++ -*- 2b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy 3b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// Copyright (c) 2012, Google Inc. 4b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// All rights reserved. 5b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// 6b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// Redistribution and use in source and binary forms, with or without 7b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// modification, are permitted provided that the following conditions are 8b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// met: 9b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// 10b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// * Redistributions of source code must retain the above copyright 11b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// notice, this list of conditions and the following disclaimer. 12b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// * Redistributions in binary form must reproduce the above 13b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// copyright notice, this list of conditions and the following disclaimer 14b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// in the documentation and/or other materials provided with the 15b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// distribution. 16b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// * Neither the name of Google Inc. nor the names of its 17b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// contributors may be used to endorse or promote products derived from 18b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// this software without specific prior written permission. 19b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// 20b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy 32b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com> 33b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy 34b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// dwarf2reader_test_common.h: Define TestCompilationUnit and 35b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// TestAbbrevTable, classes for creating properly (and improperly) 36b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// formatted DWARF compilation unit data for unit tests. 37b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy 38b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy#ifndef COMMON_DWARF_DWARF2READER_TEST_COMMON_H__ 39b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy#define COMMON_DWARF_DWARF2READER_TEST_COMMON_H__ 40b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy 41b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy#include "common/test_assembler.h" 42b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy#include "common/dwarf/dwarf2enums.h" 43b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy 44b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// A subclass of test_assembler::Section, specialized for constructing 45b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// DWARF compilation units. 46b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandyclass TestCompilationUnit: public google_breakpad::test_assembler::Section { 47b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy public: 48b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy typedef dwarf2reader::DwarfTag DwarfTag; 49b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy typedef dwarf2reader::DwarfAttribute DwarfAttribute; 50b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy typedef dwarf2reader::DwarfForm DwarfForm; 51b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy typedef google_breakpad::test_assembler::Label Label; 52b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy 53b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy // Set the section's DWARF format size (the 32-bit DWARF format or the 54b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy // 64-bit DWARF format, for lengths and section offsets --- not the 55b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy // address size) to format_size. 56b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy void set_format_size(size_t format_size) { 57b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy assert(format_size == 4 || format_size == 8); 58b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy format_size_ = format_size; 59b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy } 60b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy 61b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy // Append a DWARF section offset value, of the appropriate size for this 62b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy // compilation unit. 63b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy template<typename T> 64b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy void SectionOffset(T offset) { 65b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy if (format_size_ == 4) 66b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy D32(offset); 67b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy else 68b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy D64(offset); 69b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy } 70b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy 71b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy // Append a DWARF compilation unit header to the section, with the given 72b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy // DWARF version, abbrev table offset, and address size. 73b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy TestCompilationUnit &Header(int version, const Label &abbrev_offset, 74b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy size_t address_size) { 75b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy if (format_size_ == 4) { 76b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy D32(length_); 77b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy } else { 78b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy D32(0xffffffff); 79b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy D64(length_); 80b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy } 81b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy post_length_offset_ = Size(); 82b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy D16(version); 83b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy SectionOffset(abbrev_offset); 84b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy D8(address_size); 85b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy return *this; 86b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy } 87b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy 88b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy // Mark the end of this header's DIEs. 89b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy TestCompilationUnit &Finish() { 90b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy length_ = Size() - post_length_offset_; 91b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy return *this; 92b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy } 93b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy 94b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy private: 95b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy // The DWARF format size for this compilation unit. 96b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy size_t format_size_; 97b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy 98b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy // The offset of the point in the compilation unit header immediately 99b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy // after the initial length field. 1006162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com uint64_t post_length_offset_; 101b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy 102b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy // The length of the compilation unit, not including the initial length field. 103b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy Label length_; 104b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy}; 105b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy 106b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// A subclass of test_assembler::Section specialized for constructing DWARF 107b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy// abbreviation tables. 108b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandyclass TestAbbrevTable: public google_breakpad::test_assembler::Section { 109b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy public: 110b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy typedef dwarf2reader::DwarfTag DwarfTag; 111b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy typedef dwarf2reader::DwarfAttribute DwarfAttribute; 112b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy typedef dwarf2reader::DwarfForm DwarfForm; 113b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy typedef dwarf2reader::DwarfHasChild DwarfHasChild; 114b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy typedef google_breakpad::test_assembler::Label Label; 115b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy 116b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy // Start a new abbreviation table entry for abbreviation code |code|, 117b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy // encoding a DIE whose tag is |tag|, and which has children if and only 118b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy // if |has_children| is true. 119b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy TestAbbrevTable &Abbrev(int code, DwarfTag tag, DwarfHasChild has_children) { 120b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy assert(code != 0); 121b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy ULEB128(code); 122b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy ULEB128(static_cast<unsigned>(tag)); 123b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy D8(static_cast<unsigned>(has_children)); 124b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy return *this; 125b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy }; 126b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy 127b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy // Add an attribute to the current abbreviation code whose name is |name| 128b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy // and whose form is |form|. 129b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy TestAbbrevTable &Attribute(DwarfAttribute name, DwarfForm form) { 130b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy ULEB128(static_cast<unsigned>(name)); 131b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy ULEB128(static_cast<unsigned>(form)); 132b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy return *this; 133b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy } 134b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy 135b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy // Finish the current abbreviation code. 136b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy TestAbbrevTable &EndAbbrev() { 137b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy ULEB128(0); 138b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy ULEB128(0); 139b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy return *this; 140b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy } 141b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy 142b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy // Finish the current abbreviation table. 143b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy TestAbbrevTable &EndTable() { 144b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy ULEB128(0); 145b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy return *this; 146b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy } 147b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy}; 148b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy 149b8e0e530314a5ce2a708e8055b9c99d456d69b89jimblandy#endif // COMMON_DWARF_DWARF2READER_TEST_COMMON_H__ 150