1eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov//===-- DWARFDebugRangesList.cpp ------------------------------------------===// 2eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov// 3eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov// The LLVM Compiler Infrastructure 4eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov// 5eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov// This file is distributed under the University of Illinois Open Source 6eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov// License. See LICENSE.TXT for details. 7eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov// 8eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov//===----------------------------------------------------------------------===// 9eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov 10eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov#include "DWARFDebugRangeList.h" 11eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov#include "llvm/Support/Format.h" 12eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov#include "llvm/Support/raw_ostream.h" 13eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov 14eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonovusing namespace llvm; 15eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov 16eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonovvoid DWARFDebugRangeList::clear() { 17eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov Offset = -1U; 18eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov AddressSize = 0; 19eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov Entries.clear(); 20eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov} 21eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov 22eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonovbool DWARFDebugRangeList::extract(DataExtractor data, uint32_t *offset_ptr) { 23eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov clear(); 24eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov if (!data.isValidOffset(*offset_ptr)) 25eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov return false; 26eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov AddressSize = data.getAddressSize(); 27eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov if (AddressSize != 4 && AddressSize != 8) 28eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov return false; 29eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov Offset = *offset_ptr; 30eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov while (true) { 31eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov RangeListEntry entry; 32eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov uint32_t prev_offset = *offset_ptr; 33eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov entry.StartAddress = data.getAddress(offset_ptr); 34eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov entry.EndAddress = data.getAddress(offset_ptr); 35eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov // Check that both values were extracted correctly. 36eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov if (*offset_ptr != prev_offset + 2 * AddressSize) { 37eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov clear(); 38eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov return false; 39eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov } 405eae90d727c64ca5b4b43b110521b38dcd9f0de6Alexey Samsonov if (entry.isEndOfListEntry()) 41eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov break; 42eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov Entries.push_back(entry); 43eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov } 44eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov return true; 45eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov} 46eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov 47eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonovvoid DWARFDebugRangeList::dump(raw_ostream &OS) const { 48eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov for (int i = 0, n = Entries.size(); i != n; ++i) { 4983e2546ad3fd75dca35dc3cdbf8f0d085d57e189NAKAMURA Takumi const char *format_str = (AddressSize == 4 50e1630e01dee7f131eda6c1ddac4b6776fa1b31f4Marshall Clow ? "%08x %08" PRIx64 " %08" PRIx64 "\n" 51e1630e01dee7f131eda6c1ddac4b6776fa1b31f4Marshall Clow : "%08x %016" PRIx64 " %016" PRIx64 "\n"); 52eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov OS << format(format_str, Offset, Entries[i].StartAddress, 53eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov Entries[i].EndAddress); 54eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov } 55eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov OS << format("%08x <End of list>\n", Offset); 56eceb5b99777ba944a0ae3748a0371e9a3aa94d56Alexey Samsonov} 575eae90d727c64ca5b4b43b110521b38dcd9f0de6Alexey Samsonov 585eae90d727c64ca5b4b43b110521b38dcd9f0de6Alexey Samsonovbool DWARFDebugRangeList::containsAddress(uint64_t BaseAddress, 595eae90d727c64ca5b4b43b110521b38dcd9f0de6Alexey Samsonov uint64_t Address) const { 605eae90d727c64ca5b4b43b110521b38dcd9f0de6Alexey Samsonov for (int i = 0, n = Entries.size(); i != n; ++i) { 615eae90d727c64ca5b4b43b110521b38dcd9f0de6Alexey Samsonov if (Entries[i].isBaseAddressSelectionEntry(AddressSize)) 625eae90d727c64ca5b4b43b110521b38dcd9f0de6Alexey Samsonov BaseAddress = Entries[i].EndAddress; 635eae90d727c64ca5b4b43b110521b38dcd9f0de6Alexey Samsonov else if (Entries[i].containsAddress(BaseAddress, Address)) 645eae90d727c64ca5b4b43b110521b38dcd9f0de6Alexey Samsonov return true; 655eae90d727c64ca5b4b43b110521b38dcd9f0de6Alexey Samsonov } 665eae90d727c64ca5b4b43b110521b38dcd9f0de6Alexey Samsonov return false; 675eae90d727c64ca5b4b43b110521b38dcd9f0de6Alexey Samsonov} 68