xref: /haiku/src/kits/debug/SymbolLookup.h (revision ff3409e005096a604d862a776e470aae2089865d)
1 /*
2  * Copyright 2005-2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 #ifndef SYMBOL_LOOKUP_H
7 #define SYMBOL_LOOKUP_H
8 
9 #include <stdio.h>
10 
11 #include <image.h>
12 #include <OS.h>
13 
14 #include <util/DoublyLinkedList.h>
15 
16 
17 struct image_t;
18 struct runtime_loader_debug_area;
19 
20 
21 namespace BPrivate {
22 namespace Debug {
23 
24 class Image;
25 
26 
27 // Exception
28 class Exception {
29 public:
30 	Exception(status_t error)
31 		: fError(error)
32 	{
33 	}
34 
35 	Exception(const Exception &other)
36 		: fError(other.fError)
37 	{
38 	}
39 
40 	status_t Error() const	{ return fError; }
41 
42 private:
43 	status_t	fError;
44 };
45 
46 
47 // Area
48 class Area : public DoublyLinkedListLinkImpl<Area> {
49 public:
50 	Area(area_id id, const void *address, int32 size)
51 		: fRemoteID(id),
52 		  fLocalID(-1),
53 		  fRemoteAddress(address),
54 		  fLocalAddress(NULL),
55 		  fSize(size)
56 	{
57 	}
58 
59 	~Area()
60 	{
61 		if (fLocalID >= 0)
62 			delete_area(fLocalID);
63 	}
64 
65 	const void* RemoteAddress() const	{ return fRemoteAddress; }
66 	const void* LocalAddress() const	{ return fLocalAddress; }
67 	int32 Size() const					{ return fSize; }
68 
69 	bool ContainsAddress(const void *address, int32 size) const
70 	{
71 		return ((addr_t)fRemoteAddress <= (addr_t)address
72 			&& (addr_t)address + size <= (addr_t)fRemoteAddress + fSize);
73 	}
74 
75 	bool ContainsLocalAddress(const void* address) const
76 	{
77 		return (addr_t)address >= (addr_t)fLocalAddress
78 			&& (addr_t)address < (addr_t)fLocalAddress + fSize;
79 	}
80 
81 	const void *PrepareAddress(const void *address);
82 
83 private:
84 	area_id		fRemoteID;
85 	area_id		fLocalID;
86 	const void	*fRemoteAddress;
87 	void		*fLocalAddress;
88 	int32		fSize;
89 };
90 
91 
92 // RemoteMemoryAccessor
93 class RemoteMemoryAccessor {
94 public:
95 	RemoteMemoryAccessor(team_id team);
96 	~RemoteMemoryAccessor();
97 
98 	status_t Init();
99 
100 	const void *PrepareAddress(const void *remoteAddress, int32 size) const;
101 	const void *PrepareAddressNoThrow(const void *remoteAddress,
102 		int32 size) const;
103 
104 	template<typename Type> inline const Type &Read(
105 		const Type &remoteData) const
106 	{
107 		const void *remoteAddress = &remoteData;
108 		const void *localAddress = PrepareAddress(remoteAddress,
109 			sizeof(remoteData));
110 		return *(const Type*)localAddress;
111 	}
112 
113 	Area* AreaForLocalAddress(const void* address) const;
114 
115 private:
116 	Area &_FindArea(const void *address, int32 size) const;
117 	Area* _FindAreaNoThrow(const void *address, int32 size) const;
118 
119 	typedef DoublyLinkedList<Area>	AreaList;
120 
121 protected:
122 	team_id		fTeam;
123 
124 private:
125 	AreaList	fAreas;
126 };
127 
128 
129 // SymbolIterator
130 struct SymbolIterator {
131 	const Image*		image;
132 	int32				currentIndex;
133 };
134 
135 
136 // SymbolLookup
137 class SymbolLookup : private RemoteMemoryAccessor {
138 public:
139 	SymbolLookup(team_id team);
140 	~SymbolLookup();
141 
142 	status_t Init();
143 
144 	status_t LookupSymbolAddress(addr_t address, addr_t *_baseAddress,
145 		const char **_symbolName, size_t *_symbolNameLen,
146 		const char **_imageName, bool *_exactMatch) const;
147 
148 	status_t InitSymbolIterator(image_id imageID,
149 		SymbolIterator& iterator) const;
150 	status_t InitSymbolIteratorByAddress(addr_t address,
151 		SymbolIterator& iterator) const;
152 	status_t NextSymbol(SymbolIterator& iterator, const char** _symbolName,
153 		size_t* _symbolNameLen, addr_t* _symbolAddress, size_t* _symbolSize,
154 		int32* _symbolType) const;
155 
156 	status_t GetSymbol(image_id imageID, const char* name, int32 symbolType,
157 		void** _symbolLocation, size_t* _symbolSize, int32* _symbolType) const;
158 
159 private:
160 	class LoadedImage;
161 	friend class LoadedImage;
162 
163 private:
164 	const image_t* _FindLoadedImageAtAddress(addr_t address) const;
165 	const image_t* _FindLoadedImageByID(image_id id) const;
166 	Image* _FindImageAtAddress(addr_t address) const;
167 	Image* _FindImageByID(image_id id) const;
168 	size_t _SymbolNameLen(const char* address) const;
169 
170 private:
171 	const runtime_loader_debug_area	*fDebugArea;
172 	DoublyLinkedList<Image>	fImages;
173 };
174 
175 }	// namespace Debug
176 }	// namespace BPrivate
177 
178 using BPrivate::Debug::SymbolLookup;
179 
180 #endif	// SYMBOL_LOOKUP_H
181