1/*
2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef DWARF_TYPE_FACTORY_H
6#define DWARF_TYPE_FACTORY_H
7
8
9#include <String.h>
10
11#include "Type.h"
12
13
14class CompilationUnit;
15class DIEAddressingType;
16class DIEArrayType;
17class DIEBaseType;
18class DIECompoundType;
19class DIEEnumerationType;
20class DIEFormalParameter;
21class DIEModifiedType;
22class DIEPointerToMemberType;
23class DIESubprogram;
24class DIESubrangeType;
25class DIESubroutineType;
26class DIEType;
27class DIETypedef;
28class DIEUnspecifiedType;
29class DwarfAddressType;
30class DwarfArrayDimension;
31class DwarfArrayType;
32class DwarfCompoundType;
33class DwarfDataMember;
34class DwarfEnumerationType;
35class DwarfEnumeratorValue;
36class DwarfFile;
37class DwarfFunctionParameter;
38class DwarfFunctionType;
39class DwarfInheritance;
40class DwarfModifiedType;
41class DwarfPointerToMemberType;
42class DwarfPrimitiveType;
43class DwarfSubrangeType;
44class DwarfTargetInterface;
45class DwarfType;
46class DwarfTypeContext;
47class DwarfTypedefType;
48struct DwarfUnspecifiedType;
49class GlobalTypeCache;
50class GlobalTypeLookup;
51struct LocationDescription;
52struct MemberLocation;
53class RegisterMap;
54
55
56class DwarfTypeFactory {
57public:
58								DwarfTypeFactory(DwarfTypeContext* typeContext,
59									GlobalTypeLookup* typeLookup,
60									GlobalTypeCache* typeCache);
61								~DwarfTypeFactory();
62
63			status_t			CreateType(DIEType* typeEntry,
64									DwarfType*& _type);
65									// returns reference
66
67private:
68			status_t			_CreateTypeInternal(const BString& name,
69									DIEType* typeEntry, DwarfType*& _type);
70
71			status_t			_CreateCompoundType(const BString& name,
72									DIECompoundType* typeEntry,
73									compound_type_kind compoundKind,
74									DwarfType*& _type);
75			status_t			_CreatePrimitiveType(const BString& name,
76									DIEBaseType* typeEntry,
77									DwarfType*& _type);
78			status_t			_CreateAddressType(const BString& name,
79									DIEAddressingType* typeEntry,
80									address_type_kind addressKind,
81									DwarfType*& _type);
82			status_t			_CreateModifiedType(const BString& name,
83									DIEModifiedType* typeEntry,
84									uint32 modifiers, DwarfType*& _type);
85			status_t			_CreateTypedefType(const BString& name,
86									DIETypedef* typeEntry, DwarfType*& _type);
87			status_t			_CreateArrayType(const BString& name,
88									DIEArrayType* typeEntry,
89									DwarfType*& _type);
90			status_t			_CreateEnumerationType(const BString& name,
91									DIEEnumerationType* typeEntry,
92									DwarfType*& _type);
93			status_t			_CreateSubrangeType(const BString& name,
94									DIESubrangeType* typeEntry,
95									DwarfType*& _type);
96			status_t			_CreateUnspecifiedType(const BString& name,
97									DIEUnspecifiedType* typeEntry,
98									DwarfType*& _type);
99			status_t			_CreateFunctionType(const BString& name,
100									DIESubroutineType* typeEntry,
101									DwarfType*& _type);
102			status_t			_CreatePointerToMemberType(const BString& name,
103									DIEPointerToMemberType* typeEntry,
104									DwarfType*& _type);
105
106			status_t			_ResolveTypedef(DIETypedef* entry,
107									DIEType*& _baseTypeEntry);
108			status_t			_ResolveTypeByteSize(DIEType* typeEntry,
109									uint64& _size);
110
111private:
112			class ArtificialIntegerType;
113
114private:
115			DwarfTypeContext*	fTypeContext;
116			GlobalTypeLookup*	fTypeLookup;
117			GlobalTypeCache*	fTypeCache;
118};
119
120
121#endif	// DWARF_TYPE_FACTORY_H
122