* Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
* Copyright 2013, Rene Gollent, rene@gollent.com.
* Distributed under the terms of the MIT License.
*/
#ifndef BASE_UNIT_H
#define BASE_UNIT_H
#include <String.h>
#include <Array.h>
#include "Types.h"
class AbbreviationTable;
class DebugInfoEntry;
struct SourceLanguageInfo;
enum dwarf_unit_kind {
dwarf_unit_kind_compilation = 0,
dwarf_unit_kind_type
};
class BaseUnit {
public:
BaseUnit(off_t headerOffset,
off_t contentOffset,
off_t totalSize,
off_t abbreviationOffset,
uint8 addressSize, bool isBigEndian,
bool isDwarf64);
virtual ~BaseUnit();
off_t HeaderOffset() const { return fHeaderOffset; }
off_t ContentOffset() const { return fContentOffset; }
off_t RelativeContentOffset() const
{ return fContentOffset - fHeaderOffset; }
off_t TotalSize() const { return fTotalSize; }
off_t ContentSize() const
{ return fTotalSize
- RelativeContentOffset(); }
off_t AbbreviationOffset() const
{ return fAbbreviationOffset; }
bool ContainsAbsoluteOffset(off_t offset) const;
uint8 AddressSize() const { return fAddressSize; }
bool IsBigEndian() const { return fIsBigEndian; }
bool IsDwarf64() const { return fIsDwarf64; }
AbbreviationTable* GetAbbreviationTable() const
{ return fAbbreviationTable; }
void SetAbbreviationTable(
AbbreviationTable* abbreviationTable);
const SourceLanguageInfo* SourceLanguage() const
{ return fSourceLanguage; }
void SetSourceLanguage(
const SourceLanguageInfo* language);
status_t AddDebugInfoEntry(DebugInfoEntry* entry,
off_t offset);
int CountEntries() const;
void GetEntryAt(int index, DebugInfoEntry*& entry,
off_t& offset) const;
DebugInfoEntry* EntryForOffset(off_t offset) const;
virtual dwarf_unit_kind Kind() const = 0;
private:
off_t fHeaderOffset;
off_t fContentOffset;
off_t fTotalSize;
off_t fAbbreviationOffset;
AbbreviationTable* fAbbreviationTable;
const SourceLanguageInfo* fSourceLanguage;
Array<DebugInfoEntry*> fEntries;
Array<off_t> fEntryOffsets;
uint8 fAddressSize;
bool fIsBigEndian;
bool fIsDwarf64;
};
#endif