crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbolLib/Sources/Map/Symbol/MapSymbol.cs
author Matti Laitinen <matti.t.laitinen@nokia.com>
Thu, 11 Feb 2010 15:50:58 +0200
changeset 0 818e61de6cd1
permissions -rw-r--r--
Add initial version of Crash Analyser cmdline under EPL

/*
* 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 SymbolLib.Generics;
using SymbolLib.Sources.Map.File;
using SymbolLib.Sources.Map.Engine;

namespace SymbolLib.Sources.Map.Symbol
{
	internal class MapSymbol : GenericSymbol
	{
		#region Enumerations
		public enum TType
		{
			EUnknown = 0,
			EARMCode,
			EThumbCode,
			EData,
			ENumber,
			ESection
		}
		#endregion

		#region Static Constructors
        public static MapSymbol New( MapFile aFile )
        {
            return new MapSymbol( aFile );
        }

        public static MapSymbol NewUnknown( MapFile aFile )
        {
            MapSymbol symbol = new MapSymbol( aFile );
            //
            symbol.iType = TType.EARMCode;
            symbol.Size = 0;
            symbol.OffsetAddress = GenericSymbol.KNullEntryAddress;
            symbol.Symbol = GenericSymbol.KNonMatchingSymbolName;
            //
            if ( aFile.HostBinaryFileName.Length > 0 )
            {
                symbol.Object = Path.GetFileName( aFile.HostBinaryFileName );
            }
            else
            {
                symbol.Object = GenericSymbol.KNonMatchingObjectName;
            }
            //
            return symbol;
        }
        #endregion

        #region Constructors & destructor
        private MapSymbol( MapFile aFile )
            : base( aFile )
		{
		}
		#endregion

		#region Properties
		public TType Type
		{
			get { return iType; }
            private set { iType = value; }
        }
		#endregion

		#region From GenericSymbol
		public override bool Parse( string aLine )
		{
            Match m = KMapParserRegex.Match( aLine );
            if ( m.Success )
            {
                GroupCollection groups = m.Groups;
                //
                uint globalBaseAddress = MapFile.GlobalBaseAddress;
                //
                Object = groups[ "Binary" ].Value;
                Type = TypeByString( groups[ "Type" ].Value );
                Symbol = groups[ "Function" ].Value;
                OffsetAddress = long.Parse( groups[ "Address" ].Value, System.Globalization.NumberStyles.HexNumber ) - globalBaseAddress;
                Size = long.Parse( groups[ "Size" ].Value );
            }
			//
            return m.Success;
		}

        public override TSourceType SourceType
        {
            get { return GenericSymbol.TSourceType.ESourceTypeFileMap; }
        }
        #endregion

        #region Internal constants
        private const string KDummySymbolName = "[Unknown Symbol]";
        private static readonly Regex KMapParserRegex = new Regex(
              "(?:\\s*)(?<Function>.+?)(?:\\s+)0x(?<Address>[A-Fa-f0-9]{8})"+
              "(?:\\s+)(?<Type>(?:Data|Section|Number|ARM Code|Thumb Code))"+
              "(?:\\s+)(?<Size>\\d+)(?:\\s+)(?<Binary>.+)",
            RegexOptions.IgnoreCase
            | RegexOptions.Singleline
            );
        #endregion

		#region Internal methods
		private static TType TypeByString( string aTypeAsString )
		{
			TType ret = TType.EUnknown;
			//
			if	( aTypeAsString == "ARM Code" )
				ret = TType.EARMCode;
			else if ( aTypeAsString == "Thumb Code" )
				ret = TType.EThumbCode;
			else if ( aTypeAsString == "Section" )
				ret = TType.ESection;
			else if ( aTypeAsString == "Data" )
				ret = TType.EData;
			else if ( aTypeAsString == "Number" )
				ret = TType.ENumber;
			//
			return ret;
		}
		#endregion

        #region Internal properties
        private MapFile MapFile
        {
            get { return (Sources.Map.File.MapFile) Collection; }
        }
        #endregion

        #region Data members
        private TType iType = TType.EUnknown;
		#endregion
	}
}