crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbolLib/CodeSeg/Resolver/CodeSegResolver.cs
changeset 0 818e61de6cd1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbolLib/CodeSeg/Resolver/CodeSegResolver.cs	Thu Feb 11 15:50:58 2010 +0200
@@ -0,0 +1,244 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "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:
+*
+*/
+using System;
+using System.IO;
+using System.Text;
+using System.Text.RegularExpressions;
+using SymbianUtils;
+using SymbianUtils.Tracer;
+using SymbianUtils.SerializedOperations;
+
+namespace SymbolLib.CodeSegDef
+{
+	public class CodeSegResolver : ITracer
+	{
+		#region Constructors
+        public CodeSegResolver()
+            : this( null )
+        {
+        }
+
+        public CodeSegResolver( ITracer aTracer )
+		{
+            iTracer = aTracer;
+            iPrimer = new CodeSegDefinitionPrimer( this );
+		}
+		#endregion
+
+        #region Constants
+        public const string KSysBinPath = @"\sys\bin\";
+        public const string KROMBinaryPath = "z:" + KSysBinPath;
+        public const string KMapFileExtension = ".map";
+        #endregion
+
+        #region API
+        public void Clear()
+        {
+            lock ( iResolvedEntries )
+            {
+                iResolvedEntries.Reset();
+            }
+        }
+
+        public void Sort()
+        {
+            lock ( iResolvedEntries )
+            {
+                iResolvedEntries.Sort();
+            }
+        }
+
+        public void Remove( CodeSegResolverEntry aEntry )
+        {
+            lock ( iResolvedEntries )
+            {
+                iResolvedEntries.Remove( aEntry );
+            }
+        }
+
+        public void Add( CodeSegResolverEntry aEntry )
+        {
+            lock ( iResolvedEntries )
+            {
+                iResolvedEntries.Add( aEntry );
+            }
+        }
+
+        public CodeSegDefinition Resolve( CodeSegDefinition aDefinition )
+        {
+            return Resolve( aDefinition, false );
+        }
+
+        public CodeSegDefinition Resolve( CodeSegDefinition aDefinition, bool aMapFileMustExistsWhenCreatingEntry )
+        {
+            CodeSegDefinition ret = aDefinition;
+
+            // ... and now try to resolve real file name on the PC side
+            string realPCMapFileName = ResolveByImageCodeSegmentFileName( ret.ImageFileNameAndPath );
+            if ( realPCMapFileName != string.Empty )
+            {
+                ret.EnvironmentFileNameAndPath = realPCMapFileName;
+            }
+            else if ( aMapFileMustExistsWhenCreatingEntry == false )
+            {
+                MemoryModel.TMemoryModelType memModelType = MemoryModel.TypeByAddress( ret.AddressStart );
+                MemoryModel.TMemoryModelRegion memModelRegion = MemoryModel.RegionByAddress( ret.AddressStart, memModelType );
+
+                // Don't cache ROM code segments
+                switch ( memModelRegion )
+                {
+                    case MemoryModel.TMemoryModelRegion.EMemoryModelRegionRAMLoadedCode:
+			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionUserGlobalArea:
+                    case MemoryModel.TMemoryModelRegion.EMemoryModelRegionDLLStaticData:
+                    case MemoryModel.TMemoryModelRegion.EMemoryModelRegionKernelGlobalsInitialStackKernelHeap:
+                    case MemoryModel.TMemoryModelRegion.EMemoryModelRegionKernelCode:
+                    case MemoryModel.TMemoryModelRegion.EMemoryModelRegionMovingProcessData:
+                    case MemoryModel.TMemoryModelRegion.EMemoryModelRegionFixedProcesses:
+                    case MemoryModel.TMemoryModelRegion.EMemoryModelRegionUserCode:
+                        System.Diagnostics.Debug.WriteLine( "[WARNING] Map file for: " + ret.ImageFileNameAndPath + " was not found => creating empty MapFile for this RAM-loaded code seg." );
+                        ret.EnvironmentFileNameAndPath = CreateDefaultReleaseFileName( ret.ImageFileName );
+                        break;
+
+                    // Common
+                    case MemoryModel.TMemoryModelRegion.EMemoryModelRegionUnmapped:
+			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionRAMDrive:
+			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionSuperAndCPUPages:
+			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionPageTableInfo:
+			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionPageDirectories:
+			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionPageTables:
+			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionPrimaryIOMappings:
+			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionUnknown:
+			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionExtraKernelMappings:
+			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionExceptionVectors:
+                    case MemoryModel.TMemoryModelRegion.EMemoryModelRegionROM:
+        		
+			        // Moving
+			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionCacheFlushArea:
+			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionCacheFlushAreaAlternate:
+
+			        // Multiple
+			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionSharedData:
+			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionLocalData:
+			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionASIDInfo:
+			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionKernelStacks:
+                        ret = null;
+                        break;
+                }
+            }
+            else
+            {
+                ret = null;
+            }
+
+            return ret;
+        }
+
+        public string ResolveByImageCodeSegmentFileName( string aFileName )
+		{
+			// See if the collection contains a suitable entry
+            lock ( iResolvedEntries )
+            {
+                string ret = string.Empty;
+                CodeSegResolverEntry entry = iResolvedEntries.FindByCodeSegmentFileNameAndPath( aFileName.ToLower() );
+                if ( entry != null )
+                {
+                    ret = entry.EnvironmentFileNameAndPath;
+                }
+                //
+                return ret;
+            }
+        }
+
+		public string CreateDefaultReleaseFileName( string aImageFileName )
+		{
+			string ret = CombineWithDriveLetter( @"epoc32\release\armv5\urel\" + Path.GetFileName( aImageFileName ) );
+			return ret;
+		}
+
+		public static string ConvertCodeSegToMapFileName( string aCodeSegmentName )
+		{
+			// We first must extract the actual binary (Dll/Exe) name:
+			string name = Path.GetFileName( aCodeSegmentName );
+
+			// We append the map extension (don't replace the original extension)
+			name += CodeSegDefinition.KMapFileExtension;
+
+			return name;
+		}
+		#endregion
+
+        #region Properties
+        public CodeSegDefinitionPrimer Primer
+        {
+            get { return iPrimer; }
+        }
+
+        public int ResolvedEntryCount
+        {
+            get
+            {
+                lock ( iResolvedEntries )
+                {
+                    return iResolvedEntries.Count;
+                }
+            }
+        }
+        #endregion
+
+        #region From ITracer
+        public void Trace( string aMessage )
+        {
+            if ( iTracer != null )
+            {
+                iTracer.Trace( aMessage );
+            }
+        }
+
+        public void Trace( string aFormat, params object[] aParams )
+        {
+            if ( iTracer != null )
+            {
+                iTracer.Trace( aFormat, aParams );
+            }
+        }
+        #endregion
+
+		#region Internal methods
+		internal string DriveLetter
+		{
+			get { return iPrimer.DriveLetter; }
+            set { iPrimer.DriveLetter = value; }
+		}
+
+        protected string CombineWithDriveLetter( string aFileName )
+        {
+            string ret = string.Empty;
+            lock ( this )
+            {
+                ret = Path.Combine( DriveLetter, aFileName ).ToLower();
+            }
+            return ret;
+        }
+        #endregion
+
+		#region Data members
+        private readonly CodeSegDefinitionPrimer iPrimer;
+        private readonly ITracer iTracer;
+        private CodeSegResolverEntryCollection iResolvedEntries = new CodeSegResolverEntryCollection( 50 );
+		#endregion
+    }
+}