crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbolLib/CodeSeg/Resolver/CodeSegResolver.cs
changeset 0 818e61de6cd1
equal deleted inserted replaced
-1:000000000000 0:818e61de6cd1
       
     1 /*
       
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 * 
       
    14 * Description:
       
    15 *
       
    16 */
       
    17 using System;
       
    18 using System.IO;
       
    19 using System.Text;
       
    20 using System.Text.RegularExpressions;
       
    21 using SymbianUtils;
       
    22 using SymbianUtils.Tracer;
       
    23 using SymbianUtils.SerializedOperations;
       
    24 
       
    25 namespace SymbolLib.CodeSegDef
       
    26 {
       
    27 	public class CodeSegResolver : ITracer
       
    28 	{
       
    29 		#region Constructors
       
    30         public CodeSegResolver()
       
    31             : this( null )
       
    32         {
       
    33         }
       
    34 
       
    35         public CodeSegResolver( ITracer aTracer )
       
    36 		{
       
    37             iTracer = aTracer;
       
    38             iPrimer = new CodeSegDefinitionPrimer( this );
       
    39 		}
       
    40 		#endregion
       
    41 
       
    42         #region Constants
       
    43         public const string KSysBinPath = @"\sys\bin\";
       
    44         public const string KROMBinaryPath = "z:" + KSysBinPath;
       
    45         public const string KMapFileExtension = ".map";
       
    46         #endregion
       
    47 
       
    48         #region API
       
    49         public void Clear()
       
    50         {
       
    51             lock ( iResolvedEntries )
       
    52             {
       
    53                 iResolvedEntries.Reset();
       
    54             }
       
    55         }
       
    56 
       
    57         public void Sort()
       
    58         {
       
    59             lock ( iResolvedEntries )
       
    60             {
       
    61                 iResolvedEntries.Sort();
       
    62             }
       
    63         }
       
    64 
       
    65         public void Remove( CodeSegResolverEntry aEntry )
       
    66         {
       
    67             lock ( iResolvedEntries )
       
    68             {
       
    69                 iResolvedEntries.Remove( aEntry );
       
    70             }
       
    71         }
       
    72 
       
    73         public void Add( CodeSegResolverEntry aEntry )
       
    74         {
       
    75             lock ( iResolvedEntries )
       
    76             {
       
    77                 iResolvedEntries.Add( aEntry );
       
    78             }
       
    79         }
       
    80 
       
    81         public CodeSegDefinition Resolve( CodeSegDefinition aDefinition )
       
    82         {
       
    83             return Resolve( aDefinition, false );
       
    84         }
       
    85 
       
    86         public CodeSegDefinition Resolve( CodeSegDefinition aDefinition, bool aMapFileMustExistsWhenCreatingEntry )
       
    87         {
       
    88             CodeSegDefinition ret = aDefinition;
       
    89 
       
    90             // ... and now try to resolve real file name on the PC side
       
    91             string realPCMapFileName = ResolveByImageCodeSegmentFileName( ret.ImageFileNameAndPath );
       
    92             if ( realPCMapFileName != string.Empty )
       
    93             {
       
    94                 ret.EnvironmentFileNameAndPath = realPCMapFileName;
       
    95             }
       
    96             else if ( aMapFileMustExistsWhenCreatingEntry == false )
       
    97             {
       
    98                 MemoryModel.TMemoryModelType memModelType = MemoryModel.TypeByAddress( ret.AddressStart );
       
    99                 MemoryModel.TMemoryModelRegion memModelRegion = MemoryModel.RegionByAddress( ret.AddressStart, memModelType );
       
   100 
       
   101                 // Don't cache ROM code segments
       
   102                 switch ( memModelRegion )
       
   103                 {
       
   104                     case MemoryModel.TMemoryModelRegion.EMemoryModelRegionRAMLoadedCode:
       
   105 			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionUserGlobalArea:
       
   106                     case MemoryModel.TMemoryModelRegion.EMemoryModelRegionDLLStaticData:
       
   107                     case MemoryModel.TMemoryModelRegion.EMemoryModelRegionKernelGlobalsInitialStackKernelHeap:
       
   108                     case MemoryModel.TMemoryModelRegion.EMemoryModelRegionKernelCode:
       
   109                     case MemoryModel.TMemoryModelRegion.EMemoryModelRegionMovingProcessData:
       
   110                     case MemoryModel.TMemoryModelRegion.EMemoryModelRegionFixedProcesses:
       
   111                     case MemoryModel.TMemoryModelRegion.EMemoryModelRegionUserCode:
       
   112                         System.Diagnostics.Debug.WriteLine( "[WARNING] Map file for: " + ret.ImageFileNameAndPath + " was not found => creating empty MapFile for this RAM-loaded code seg." );
       
   113                         ret.EnvironmentFileNameAndPath = CreateDefaultReleaseFileName( ret.ImageFileName );
       
   114                         break;
       
   115 
       
   116                     // Common
       
   117                     case MemoryModel.TMemoryModelRegion.EMemoryModelRegionUnmapped:
       
   118 			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionRAMDrive:
       
   119 			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionSuperAndCPUPages:
       
   120 			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionPageTableInfo:
       
   121 			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionPageDirectories:
       
   122 			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionPageTables:
       
   123 			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionPrimaryIOMappings:
       
   124 			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionUnknown:
       
   125 			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionExtraKernelMappings:
       
   126 			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionExceptionVectors:
       
   127                     case MemoryModel.TMemoryModelRegion.EMemoryModelRegionROM:
       
   128         		
       
   129 			        // Moving
       
   130 			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionCacheFlushArea:
       
   131 			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionCacheFlushAreaAlternate:
       
   132 
       
   133 			        // Multiple
       
   134 			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionSharedData:
       
   135 			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionLocalData:
       
   136 			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionASIDInfo:
       
   137 			        case MemoryModel.TMemoryModelRegion.EMemoryModelRegionKernelStacks:
       
   138                         ret = null;
       
   139                         break;
       
   140                 }
       
   141             }
       
   142             else
       
   143             {
       
   144                 ret = null;
       
   145             }
       
   146 
       
   147             return ret;
       
   148         }
       
   149 
       
   150         public string ResolveByImageCodeSegmentFileName( string aFileName )
       
   151 		{
       
   152 			// See if the collection contains a suitable entry
       
   153             lock ( iResolvedEntries )
       
   154             {
       
   155                 string ret = string.Empty;
       
   156                 CodeSegResolverEntry entry = iResolvedEntries.FindByCodeSegmentFileNameAndPath( aFileName.ToLower() );
       
   157                 if ( entry != null )
       
   158                 {
       
   159                     ret = entry.EnvironmentFileNameAndPath;
       
   160                 }
       
   161                 //
       
   162                 return ret;
       
   163             }
       
   164         }
       
   165 
       
   166 		public string CreateDefaultReleaseFileName( string aImageFileName )
       
   167 		{
       
   168 			string ret = CombineWithDriveLetter( @"epoc32\release\armv5\urel\" + Path.GetFileName( aImageFileName ) );
       
   169 			return ret;
       
   170 		}
       
   171 
       
   172 		public static string ConvertCodeSegToMapFileName( string aCodeSegmentName )
       
   173 		{
       
   174 			// We first must extract the actual binary (Dll/Exe) name:
       
   175 			string name = Path.GetFileName( aCodeSegmentName );
       
   176 
       
   177 			// We append the map extension (don't replace the original extension)
       
   178 			name += CodeSegDefinition.KMapFileExtension;
       
   179 
       
   180 			return name;
       
   181 		}
       
   182 		#endregion
       
   183 
       
   184         #region Properties
       
   185         public CodeSegDefinitionPrimer Primer
       
   186         {
       
   187             get { return iPrimer; }
       
   188         }
       
   189 
       
   190         public int ResolvedEntryCount
       
   191         {
       
   192             get
       
   193             {
       
   194                 lock ( iResolvedEntries )
       
   195                 {
       
   196                     return iResolvedEntries.Count;
       
   197                 }
       
   198             }
       
   199         }
       
   200         #endregion
       
   201 
       
   202         #region From ITracer
       
   203         public void Trace( string aMessage )
       
   204         {
       
   205             if ( iTracer != null )
       
   206             {
       
   207                 iTracer.Trace( aMessage );
       
   208             }
       
   209         }
       
   210 
       
   211         public void Trace( string aFormat, params object[] aParams )
       
   212         {
       
   213             if ( iTracer != null )
       
   214             {
       
   215                 iTracer.Trace( aFormat, aParams );
       
   216             }
       
   217         }
       
   218         #endregion
       
   219 
       
   220 		#region Internal methods
       
   221 		internal string DriveLetter
       
   222 		{
       
   223 			get { return iPrimer.DriveLetter; }
       
   224             set { iPrimer.DriveLetter = value; }
       
   225 		}
       
   226 
       
   227         protected string CombineWithDriveLetter( string aFileName )
       
   228         {
       
   229             string ret = string.Empty;
       
   230             lock ( this )
       
   231             {
       
   232                 ret = Path.Combine( DriveLetter, aFileName ).ToLower();
       
   233             }
       
   234             return ret;
       
   235         }
       
   236         #endregion
       
   237 
       
   238 		#region Data members
       
   239         private readonly CodeSegDefinitionPrimer iPrimer;
       
   240         private readonly ITracer iTracer;
       
   241         private CodeSegResolverEntryCollection iResolvedEntries = new CodeSegResolverEntryCollection( 50 );
       
   242 		#endregion
       
   243     }
       
   244 }