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