1/* 2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Distributed under the terms of the MIT License. 4 */ 5#ifndef COMPILATION_UNIT_H 6#define COMPILATION_UNIT_H 7 8 9#include <ObjectList.h> 10#include <String.h> 11 12#include <Array.h> 13 14#include "LineNumberProgram.h" 15#include "Types.h" 16 17 18class AbbreviationTable; 19class DebugInfoEntry; 20class DIECompileUnitBase; 21class SourceLanguageInfo; 22class TargetAddressRangeList; 23 24 25class CompilationUnit { 26public: 27 CompilationUnit(off_t headerOffset, 28 off_t contentOffset, 29 off_t totalSize, 30 off_t abbreviationOffset, 31 uint8 addressSize, bool isDwarf64); 32 ~CompilationUnit(); 33 34 off_t HeaderOffset() const { return fHeaderOffset; } 35 off_t ContentOffset() const { return fContentOffset; } 36 off_t RelativeContentOffset() const 37 { return fContentOffset - fHeaderOffset; } 38 off_t TotalSize() const { return fTotalSize; } 39 off_t ContentSize() const 40 { return fTotalSize 41 - RelativeContentOffset(); } 42 off_t AbbreviationOffset() const 43 { return fAbbreviationOffset; } 44 45 uint8 AddressSize() const { return fAddressSize; } 46 inline target_addr_t MaxAddress() const; 47 bool IsDwarf64() const { return fIsDwarf64; } 48 49 AbbreviationTable* GetAbbreviationTable() const 50 { return fAbbreviationTable; } 51 void SetAbbreviationTable( 52 AbbreviationTable* abbreviationTable); 53 54 DIECompileUnitBase* UnitEntry() const { return fUnitEntry; } 55 void SetUnitEntry(DIECompileUnitBase* entry); 56 57 const SourceLanguageInfo* SourceLanguage() const 58 { return fSourceLanguage; } 59 void SetSourceLanguage( 60 const SourceLanguageInfo* language); 61 62 TargetAddressRangeList* AddressRanges() const 63 { return fAddressRanges; } 64 void SetAddressRanges( 65 TargetAddressRangeList* ranges); 66 67 target_addr_t AddressRangeBase() const; 68 69 LineNumberProgram& GetLineNumberProgram() 70 { return fLineNumberProgram; } 71 72 status_t AddDebugInfoEntry(DebugInfoEntry* entry, 73 off_t offset); 74 int CountEntries() const; 75 void GetEntryAt(int index, DebugInfoEntry*& entry, 76 off_t& offset) const; 77 DebugInfoEntry* EntryForOffset(off_t offset) const; 78 79 bool AddDirectory(const char* directory); 80 int32 CountDirectories() const; 81 const char* DirectoryAt(int32 index) const; 82 83 bool AddFile(const char* fileName, int32 dirIndex); 84 int32 CountFiles() const; 85 const char* FileAt(int32 index, 86 const char** _directory = NULL) const; 87 88private: 89 struct File; 90 typedef BObjectList<BString> DirectoryList; 91 typedef BObjectList<File> FileList; 92 93private: 94 off_t fHeaderOffset; 95 off_t fContentOffset; 96 off_t fTotalSize; 97 off_t fAbbreviationOffset; 98 AbbreviationTable* fAbbreviationTable; 99 DIECompileUnitBase* fUnitEntry; 100 const SourceLanguageInfo* fSourceLanguage; 101 TargetAddressRangeList* fAddressRanges; 102 Array<DebugInfoEntry*> fEntries; 103 Array<off_t> fEntryOffsets; 104 DirectoryList fDirectories; 105 FileList fFiles; 106 LineNumberProgram fLineNumberProgram; 107 uint8 fAddressSize; 108 bool fIsDwarf64; 109}; 110 111 112target_addr_t 113CompilationUnit::MaxAddress() const 114{ 115 return fAddressSize == 4 ? 0xffffffffULL : 0xffffffffffffffffULL; 116} 117 118 119#endif // COMPILATION_UNIT_H 120