kerneltest/e32utils/analyse/codespace.h
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32utils/analyse/codespace.h	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,156 @@
+// Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#ifndef __SPACE__
+#define __SPACE__
+
+#include "trace.h"
+#include "symbols.h"
+#include <vector>
+#include <map>
+
+// This class define the interface used by the distribution sampler to allocate
+// a 'bucket' for a given PC value
+//
+// This also provide a minimual implementation that allocates all samples to 'other'
+
+class CodeSpace
+	{
+public:
+	enum {KOtherBucket = 0};
+	enum TOrder {ERandom, EOrdered, ELinear};
+public:
+	// the number of buckets (including the 'other' bucket)
+	virtual int Size() const;
+	// map a PC to a bucket
+	virtual int Bucket(PC aPc) const;
+	// name a bucket
+	virtual const char* Name(int aBucket) const;
+	// determine whether the results should be ordered
+	virtual TOrder Ordering() const;
+	};
+
+class AddressCodeSpace : public CodeSpace
+	{
+public:
+	enum TType {EAbsolute, ERelative};
+public:
+	AddressCodeSpace(PC aBase, PC aLimit, unsigned aBucketSize, TType aType);
+private:
+	int Size() const;
+	int Bucket(PC aPc) const;
+	const char* Name(int aBucket) const;
+	TOrder Ordering() const;
+private:
+	PC iBase;
+	unsigned iBucketShift;
+	unsigned iBuckets;
+	TType iType;
+	mutable char iBuffer[10];
+	};
+
+class MappedCodeSpace : public CodeSpace
+	{
+	friend class NonXIP;
+	struct Element
+		{
+		inline Element()
+			{}
+		inline Element(PC aBase, PC aLimit, const char* aName)
+			:iBase(aBase), iLimit(aLimit), iName(aName), iBucket(0), iUnloaded(false)
+			{}
+		//
+		PC iBase;
+		PC iLimit;
+		const char* iName;
+		int iBucket;
+		bool iUnloaded;
+		};
+	typedef std::multimap<PC, Element> Map;
+
+	struct IdNames
+		{
+		IdNames(int aId, int aIndex) : iId(aId), iIndex(aIndex) {}
+		int iId;
+		int iIndex;
+		};
+	typedef std::multimap<const char*, IdNames> NamesMap;
+	
+public:
+	class Partition : public SymbolFile::Parser
+		{
+		friend class MappedCodeSpace;
+		friend class NonXIP;
+	protected:
+		inline Partition()
+			{}
+		inline void Add(PC aBase, PC aLimit, const char* aName)
+			{iCodeSpace->Add(aBase, aLimit, aName);}
+		inline void Done(PC aFirstPc=0, PC aLastPc=0, int aModuleId=0)
+			{iCodeSpace->Done(aFirstPc, aLastPc, aModuleId);}
+	private:
+		MappedCodeSpace* iCodeSpace;
+		};
+	friend class Partition;
+public:
+	MappedCodeSpace();
+	MappedCodeSpace(const SymbolFile& aSymbols, Partition& aPartition);
+	std::pair<const char*,unsigned> Lookup(PC aPc) const;
+protected:
+//	MappedCodeSpace();
+	void Add(PC aBase, PC aLimit, const char* aName);
+	void Done(PC aFirstPc, PC aLastPc, int aModuleId);
+private:
+	const Element* Find(PC aPc) const;
+//
+	int Size() const;
+	int Bucket(PC aPc) const;
+	const char* Name(int aBucket) const;
+private:
+	Map iMap;
+	std::vector<const char*> iNames;
+	NamesMap iNamesMap;
+	};
+
+class PartitionByFunction : public MappedCodeSpace::Partition
+	{
+public:
+	PartitionByFunction(const char* aFile, const char* aFunction);
+private:
+	void File(const char* aName);
+	bool Symbol(const char* aName, PC aPc, int aLength);
+private:
+	const char* iFile;
+	const char* iFunction;
+	bool iActive;
+	};
+
+class PartitionByDll : public MappedCodeSpace::Partition
+	{
+public:
+	PartitionByDll(const char* aFile)
+		:iMatch(aFile), iLastFile(0), iLastFileAddress(0), iCurrentFile(0)
+		{}
+private:
+	void File(const char* aName);
+	bool Symbol(const char* aName, PC aPc, int aLength);
+private:
+	const char* iMatch;
+	const char* iLastFile;
+	PC iLastFileAddress;
+	const char* iCurrentFile;
+	};
+
+#endif // __SPACE__
\ No newline at end of file