tracesrv/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/osttrace/OstTraceParserRule.java
author hgs
Fri, 08 Oct 2010 14:56:39 +0300
changeset 56 aa2539c91954
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
56
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). 
hgs
parents:
diff changeset
     3
 * All rights reserved.
hgs
parents:
diff changeset
     4
 * This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
 * under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
 * which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
 *
hgs
parents:
diff changeset
     9
 * Initial Contributors:
hgs
parents:
diff changeset
    10
 * Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
 *
hgs
parents:
diff changeset
    12
 * Contributors:
hgs
parents:
diff changeset
    13
 *
hgs
parents:
diff changeset
    14
 * Description:
hgs
parents:
diff changeset
    15
 *
hgs
parents:
diff changeset
    16
 * OST trace parser rule
hgs
parents:
diff changeset
    17
 *
hgs
parents:
diff changeset
    18
 */
hgs
parents:
diff changeset
    19
package com.nokia.tracecompiler.engine.rules.osttrace;
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
import java.util.ArrayList;
hgs
parents:
diff changeset
    22
import java.util.List;
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
import com.nokia.tracecompiler.engine.TraceLocation;
hgs
parents:
diff changeset
    25
import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
hgs
parents:
diff changeset
    26
import com.nokia.tracecompiler.engine.rules.AutoAddFunctionParametersRule;
hgs
parents:
diff changeset
    27
import com.nokia.tracecompiler.engine.rules.AutoAddReturnParameterRule;
hgs
parents:
diff changeset
    28
import com.nokia.tracecompiler.engine.rules.AutoAddThisPtrRule;
hgs
parents:
diff changeset
    29
import com.nokia.tracecompiler.engine.rules.AutoAddValueRule;
hgs
parents:
diff changeset
    30
import com.nokia.tracecompiler.engine.rules.AutomaticTraceTextRule;
hgs
parents:
diff changeset
    31
import com.nokia.tracecompiler.engine.rules.ComplexHeaderRuleImpl;
hgs
parents:
diff changeset
    32
import com.nokia.tracecompiler.engine.rules.EntryTraceRule;
hgs
parents:
diff changeset
    33
import com.nokia.tracecompiler.engine.rules.ExitTraceRule;
hgs
parents:
diff changeset
    34
import com.nokia.tracecompiler.engine.rules.PerformanceEventStartRule;
hgs
parents:
diff changeset
    35
import com.nokia.tracecompiler.engine.rules.PerformanceEventStopRule;
hgs
parents:
diff changeset
    36
import com.nokia.tracecompiler.engine.rules.ReadOnlyObjectRuleImpl;
hgs
parents:
diff changeset
    37
import com.nokia.tracecompiler.engine.rules.SourceParserRuleBase;
hgs
parents:
diff changeset
    38
import com.nokia.tracecompiler.engine.rules.StateTraceRule;
hgs
parents:
diff changeset
    39
import com.nokia.tracecompiler.engine.source.SourceParserResult;
hgs
parents:
diff changeset
    40
import com.nokia.tracecompiler.model.TraceCompilerException;
hgs
parents:
diff changeset
    41
import com.nokia.tracecompiler.model.TraceModelExtension;
hgs
parents:
diff changeset
    42
import com.nokia.tracecompiler.model.TraceParameter;
hgs
parents:
diff changeset
    43
import com.nokia.tracecompiler.source.FormatMapping;
hgs
parents:
diff changeset
    44
import com.nokia.tracecompiler.source.SourceContext;
hgs
parents:
diff changeset
    45
import com.nokia.tracecompiler.source.SourceParser;
hgs
parents:
diff changeset
    46
hgs
parents:
diff changeset
    47
/**
hgs
parents:
diff changeset
    48
 * OST trace parser rule
hgs
parents:
diff changeset
    49
 * 
hgs
parents:
diff changeset
    50
 */
hgs
parents:
diff changeset
    51
public final class OstTraceParserRule extends SourceParserRuleBase {
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
	/**
hgs
parents:
diff changeset
    54
	 * PERFORMANCE group name
hgs
parents:
diff changeset
    55
	 */
hgs
parents:
diff changeset
    56
	private static final String PERFORMANCE_GROUP_NAME = "TRACE_PERFORMANCE"; //$NON-NLS-1$
hgs
parents:
diff changeset
    57
hgs
parents:
diff changeset
    58
	/**
hgs
parents:
diff changeset
    59
	 * STATE group name
hgs
parents:
diff changeset
    60
	 */
hgs
parents:
diff changeset
    61
	private static final String STATE_GROUP_NAME = "TRACE_STATE"; //$NON-NLS-1$
hgs
parents:
diff changeset
    62
hgs
parents:
diff changeset
    63
	/**
hgs
parents:
diff changeset
    64
	 * FLOW group name
hgs
parents:
diff changeset
    65
	 */
hgs
parents:
diff changeset
    66
	private static final String FLOW_GROUP_NAME = "TRACE_FLOW"; //$NON-NLS-1$
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
	/**
hgs
parents:
diff changeset
    69
	 * Data trace parameter count
hgs
parents:
diff changeset
    70
	 */
hgs
parents:
diff changeset
    71
	private static final int DATA_PARAMETER_COUNT = 2; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
	/**
hgs
parents:
diff changeset
    74
	 * Entry Ext trace parameter count
hgs
parents:
diff changeset
    75
	 */
hgs
parents:
diff changeset
    76
	private static final int ENTRY_EXT_PARAMETER_COUNT = 1; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
	/**
hgs
parents:
diff changeset
    79
	 * Exit Ext trace parameter count
hgs
parents:
diff changeset
    80
	 */
hgs
parents:
diff changeset
    81
	private static final int EXIT_EXT_PARAMETER_COUNT = 2; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
	/**
hgs
parents:
diff changeset
    84
	 * Trace parameter index list
hgs
parents:
diff changeset
    85
	 */
hgs
parents:
diff changeset
    86
	class TraceParameterIndexList {
hgs
parents:
diff changeset
    87
hgs
parents:
diff changeset
    88
		/**
hgs
parents:
diff changeset
    89
		 * Minimum number of parameters needed to decode traces
hgs
parents:
diff changeset
    90
		 */
hgs
parents:
diff changeset
    91
		int minParamCount;
hgs
parents:
diff changeset
    92
hgs
parents:
diff changeset
    93
		/**
hgs
parents:
diff changeset
    94
		 * Preprocessor level index
hgs
parents:
diff changeset
    95
		 */
hgs
parents:
diff changeset
    96
		int levelIndex;
hgs
parents:
diff changeset
    97
hgs
parents:
diff changeset
    98
		/**
hgs
parents:
diff changeset
    99
		 * Trace name index
hgs
parents:
diff changeset
   100
		 */
hgs
parents:
diff changeset
   101
		int nameIndex;
hgs
parents:
diff changeset
   102
hgs
parents:
diff changeset
   103
		/**
hgs
parents:
diff changeset
   104
		 * Trace text index
hgs
parents:
diff changeset
   105
		 */
hgs
parents:
diff changeset
   106
		int textIndex;
hgs
parents:
diff changeset
   107
hgs
parents:
diff changeset
   108
		/**
hgs
parents:
diff changeset
   109
		 * Trace group index in case group name is free-form
hgs
parents:
diff changeset
   110
		 */
hgs
parents:
diff changeset
   111
		int groupIndex;
hgs
parents:
diff changeset
   112
hgs
parents:
diff changeset
   113
		/**
hgs
parents:
diff changeset
   114
		 * Trace group name in case group name is pre-determined by rules
hgs
parents:
diff changeset
   115
		 */
hgs
parents:
diff changeset
   116
		String groupName;
hgs
parents:
diff changeset
   117
	}
hgs
parents:
diff changeset
   118
hgs
parents:
diff changeset
   119
	/**
hgs
parents:
diff changeset
   120
	 * List of flags related to OST API macro
hgs
parents:
diff changeset
   121
	 */
hgs
parents:
diff changeset
   122
	class TraceParameterFlagList {
hgs
parents:
diff changeset
   123
hgs
parents:
diff changeset
   124
		/**
hgs
parents:
diff changeset
   125
		 * Data tag
hgs
parents:
diff changeset
   126
		 */
hgs
parents:
diff changeset
   127
		boolean hasDataTag;
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
		/**
hgs
parents:
diff changeset
   130
		 * State tag
hgs
parents:
diff changeset
   131
		 */
hgs
parents:
diff changeset
   132
		boolean hasStateTag;
hgs
parents:
diff changeset
   133
hgs
parents:
diff changeset
   134
		/**
hgs
parents:
diff changeset
   135
		 * Ext tag
hgs
parents:
diff changeset
   136
		 */
hgs
parents:
diff changeset
   137
		boolean hasExtTag;
hgs
parents:
diff changeset
   138
hgs
parents:
diff changeset
   139
		/**
hgs
parents:
diff changeset
   140
		 * Event start tag
hgs
parents:
diff changeset
   141
		 */
hgs
parents:
diff changeset
   142
		boolean hasEventStartTag;
hgs
parents:
diff changeset
   143
hgs
parents:
diff changeset
   144
		/**
hgs
parents:
diff changeset
   145
		 * Event stop
hgs
parents:
diff changeset
   146
		 */
hgs
parents:
diff changeset
   147
		boolean hasEventStopTag;
hgs
parents:
diff changeset
   148
hgs
parents:
diff changeset
   149
		/**
hgs
parents:
diff changeset
   150
		 * Function entry
hgs
parents:
diff changeset
   151
		 */
hgs
parents:
diff changeset
   152
		boolean hasFunctionEntryTag;
hgs
parents:
diff changeset
   153
hgs
parents:
diff changeset
   154
		/**
hgs
parents:
diff changeset
   155
		 * Function exit
hgs
parents:
diff changeset
   156
		 */
hgs
parents:
diff changeset
   157
		boolean hasFunctionExitTag;
hgs
parents:
diff changeset
   158
hgs
parents:
diff changeset
   159
		/**
hgs
parents:
diff changeset
   160
		 * Constructor
hgs
parents:
diff changeset
   161
		 * 
hgs
parents:
diff changeset
   162
		 * @param tag
hgs
parents:
diff changeset
   163
		 *            the trace tag
hgs
parents:
diff changeset
   164
		 */
hgs
parents:
diff changeset
   165
		TraceParameterFlagList(String tag) {
hgs
parents:
diff changeset
   166
			hasDataTag = tag.indexOf(OstConstants.DATA_TRACE_TAG) > 0;
hgs
parents:
diff changeset
   167
			hasStateTag = tag.indexOf(OstConstants.STATE_TRACE_TAG) > 0;
hgs
parents:
diff changeset
   168
			hasExtTag = tag.indexOf(OstConstants.EXTENSION_TRACE_TAG) > 0;
hgs
parents:
diff changeset
   169
			hasEventStartTag = tag
hgs
parents:
diff changeset
   170
					.indexOf(OstConstants.PERFORMANCE_EVENT_START_TAG) > 0;
hgs
parents:
diff changeset
   171
			hasEventStopTag = tag
hgs
parents:
diff changeset
   172
					.indexOf(OstConstants.PERFORMANCE_EVENT_STOP_TAG) > 0;
hgs
parents:
diff changeset
   173
			hasFunctionEntryTag = tag.indexOf(OstConstants.FUNCTION_ENTRY_TAG) > 0;
hgs
parents:
diff changeset
   174
			hasFunctionExitTag = tag.indexOf(OstConstants.FUNCTION_EXIT_TAG) > 0;
hgs
parents:
diff changeset
   175
		}
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
		/**
hgs
parents:
diff changeset
   178
		 * Checks if any of the flags is set
hgs
parents:
diff changeset
   179
		 * 
hgs
parents:
diff changeset
   180
		 * @return true if flag is set
hgs
parents:
diff changeset
   181
		 */
hgs
parents:
diff changeset
   182
		boolean hasFlags() {
hgs
parents:
diff changeset
   183
			return hasDataTag || hasStateTag || hasExtTag || hasEventStartTag
hgs
parents:
diff changeset
   184
					|| hasEventStopTag || hasFunctionEntryTag
hgs
parents:
diff changeset
   185
					|| hasFunctionExitTag;
hgs
parents:
diff changeset
   186
		}
hgs
parents:
diff changeset
   187
hgs
parents:
diff changeset
   188
	}
hgs
parents:
diff changeset
   189
hgs
parents:
diff changeset
   190
	/**
hgs
parents:
diff changeset
   191
	 * Offset to preprocessor level
hgs
parents:
diff changeset
   192
	 */
hgs
parents:
diff changeset
   193
	private static final int PREPROCESSOR_LEVEL_OFFSET = 0; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   194
hgs
parents:
diff changeset
   195
	/**
hgs
parents:
diff changeset
   196
	 * Offset to group name if preprocessor level is not in use
hgs
parents:
diff changeset
   197
	 */
hgs
parents:
diff changeset
   198
	private static final int GROUP_NAME_OFFSET = 0; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   199
hgs
parents:
diff changeset
   200
	/**
hgs
parents:
diff changeset
   201
	 * Offset to trace name if preprocessor level is not in use
hgs
parents:
diff changeset
   202
	 */
hgs
parents:
diff changeset
   203
	private static final int TRACE_NAME_OFFSET = 1; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   204
hgs
parents:
diff changeset
   205
	/**
hgs
parents:
diff changeset
   206
	 * Offset to trace text if preprocessor level is not in use
hgs
parents:
diff changeset
   207
	 */
hgs
parents:
diff changeset
   208
	private static final int TRACE_TEXT_OFFSET = 2; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   209
hgs
parents:
diff changeset
   210
	/**
hgs
parents:
diff changeset
   211
	 * Minimum number of parameters if preprocessor level is not in use
hgs
parents:
diff changeset
   212
	 */
hgs
parents:
diff changeset
   213
	private static final int MIN_PARAMETER_COUNT = 3; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   214
hgs
parents:
diff changeset
   215
	/**
hgs
parents:
diff changeset
   216
	 * Parser tag
hgs
parents:
diff changeset
   217
	 */
hgs
parents:
diff changeset
   218
	private static final String OST_TRACE_PARSER_TAG = "OstTrace"; //$NON-NLS-1$
hgs
parents:
diff changeset
   219
hgs
parents:
diff changeset
   220
	/**
hgs
parents:
diff changeset
   221
	 * OstTrace parser formats
hgs
parents:
diff changeset
   222
	 */
hgs
parents:
diff changeset
   223
	private final static String[] OST_TRACE_PARSER_FORMATS = { "0", //$NON-NLS-1$
hgs
parents:
diff changeset
   224
			"1", //$NON-NLS-1$
hgs
parents:
diff changeset
   225
			"Data", //$NON-NLS-1$
hgs
parents:
diff changeset
   226
			"Ext?", //$NON-NLS-1$
hgs
parents:
diff changeset
   227
			"FunctionEntry0", //$NON-NLS-1$
hgs
parents:
diff changeset
   228
			"FunctionEntry1", //$NON-NLS-1$
hgs
parents:
diff changeset
   229
			"FunctionEntryExt", //$NON-NLS-1$
hgs
parents:
diff changeset
   230
			"FunctionExit0", //$NON-NLS-1$
hgs
parents:
diff changeset
   231
			"FunctionExit1", //$NON-NLS-1$
hgs
parents:
diff changeset
   232
			"FunctionExitExt", //$NON-NLS-1$
hgs
parents:
diff changeset
   233
			"EventStart0", //$NON-NLS-1$
hgs
parents:
diff changeset
   234
			"EventStart1", //$NON-NLS-1$
hgs
parents:
diff changeset
   235
			"EventStop", //$NON-NLS-1$
hgs
parents:
diff changeset
   236
			"Def0", //$NON-NLS-1$
hgs
parents:
diff changeset
   237
			"Def1", //$NON-NLS-1$
hgs
parents:
diff changeset
   238
			"DefData", //$NON-NLS-1$
hgs
parents:
diff changeset
   239
			"DefExt?", //$NON-NLS-1$
hgs
parents:
diff changeset
   240
			"State0", //$NON-NLS-1$
hgs
parents:
diff changeset
   241
			"State1" //$NON-NLS-1$
hgs
parents:
diff changeset
   242
	};
hgs
parents:
diff changeset
   243
hgs
parents:
diff changeset
   244
	/**
hgs
parents:
diff changeset
   245
	 * Creates a new OstTrace parser rule
hgs
parents:
diff changeset
   246
	 */
hgs
parents:
diff changeset
   247
	public OstTraceParserRule() {
hgs
parents:
diff changeset
   248
		super(OST_TRACE_PARSER_TAG, OST_TRACE_PARSER_FORMATS);
hgs
parents:
diff changeset
   249
	}
hgs
parents:
diff changeset
   250
hgs
parents:
diff changeset
   251
	/*
hgs
parents:
diff changeset
   252
	 * (non-Javadoc)
hgs
parents:
diff changeset
   253
	 * 
hgs
parents:
diff changeset
   254
	 * @see com.nokia.tracecompiler.engine.source.SourceParserRule#getName()
hgs
parents:
diff changeset
   255
	 */
hgs
parents:
diff changeset
   256
	@Override
hgs
parents:
diff changeset
   257
	public String getName() {
hgs
parents:
diff changeset
   258
		return OstTraceFormatRule.STORAGE_NAME;
hgs
parents:
diff changeset
   259
	}
hgs
parents:
diff changeset
   260
hgs
parents:
diff changeset
   261
	/* (non-Javadoc)
hgs
parents:
diff changeset
   262
	 * @see com.nokia.tracecompiler.engine.rules.SourceParserRuleBase#parseParameters(java.lang.String, java.util.List)
hgs
parents:
diff changeset
   263
	 */
hgs
parents:
diff changeset
   264
	@Override
hgs
parents:
diff changeset
   265
	public SourceParserResult parseParameters(String tag, List<String> list)
hgs
parents:
diff changeset
   266
			throws TraceCompilerException {
hgs
parents:
diff changeset
   267
		SourceParserResult result = new SourceParserResult();
hgs
parents:
diff changeset
   268
		TraceParameterIndexList indexList = getIndexList(tag);
hgs
parents:
diff changeset
   269
		if (list.size() >= indexList.minParamCount) {
hgs
parents:
diff changeset
   270
			// Name must exist
hgs
parents:
diff changeset
   271
			result.originalName = list.get(indexList.nameIndex);
hgs
parents:
diff changeset
   272
			result.convertedName = result.originalName;
hgs
parents:
diff changeset
   273
			// Text is optional
hgs
parents:
diff changeset
   274
			if (indexList.textIndex >= 0) {
hgs
parents:
diff changeset
   275
				result.traceText = trimTraceText(list.get(indexList.textIndex));
hgs
parents:
diff changeset
   276
			} else {
hgs
parents:
diff changeset
   277
				result.traceText = ""; //$NON-NLS-1$
hgs
parents:
diff changeset
   278
			}
hgs
parents:
diff changeset
   279
			// Group ID and preprocessor level are stored into the
hgs
parents:
diff changeset
   280
			// parser-specific data
hgs
parents:
diff changeset
   281
			result.parserData = new ArrayList<String>();
hgs
parents:
diff changeset
   282
			if (indexList.levelIndex >= 0) {
hgs
parents:
diff changeset
   283
				result.parserData.add(list.get(indexList.levelIndex));
hgs
parents:
diff changeset
   284
			}
hgs
parents:
diff changeset
   285
			if (indexList.groupIndex >= 0) {
hgs
parents:
diff changeset
   286
				result.parserData.add(list.get(indexList.groupIndex));
hgs
parents:
diff changeset
   287
			} else if (indexList.groupName != null) {
hgs
parents:
diff changeset
   288
				result.parserData.add(indexList.groupName);
hgs
parents:
diff changeset
   289
			}
hgs
parents:
diff changeset
   290
hgs
parents:
diff changeset
   291
			// Extra parameters are converted to trace parameters
hgs
parents:
diff changeset
   292
			result.parameters = new ArrayList<String>();
hgs
parents:
diff changeset
   293
			for (int i = indexList.minParamCount; i < list.size(); i++) {
hgs
parents:
diff changeset
   294
				result.parameters.add(list.get(i));
hgs
parents:
diff changeset
   295
			}
hgs
parents:
diff changeset
   296
		} else {
hgs
parents:
diff changeset
   297
			throw new TraceCompilerException(
hgs
parents:
diff changeset
   298
					TraceCompilerErrorCode.NOT_ENOUGH_PARAMETERS);
hgs
parents:
diff changeset
   299
		}
hgs
parents:
diff changeset
   300
		return result;
hgs
parents:
diff changeset
   301
	}
hgs
parents:
diff changeset
   302
hgs
parents:
diff changeset
   303
	/**
hgs
parents:
diff changeset
   304
	 * Gets the parameter index list based on trace tag
hgs
parents:
diff changeset
   305
	 * 
hgs
parents:
diff changeset
   306
	 * @param tag
hgs
parents:
diff changeset
   307
	 *            the trace tag
hgs
parents:
diff changeset
   308
	 * @return the index list
hgs
parents:
diff changeset
   309
	 */
hgs
parents:
diff changeset
   310
	private TraceParameterIndexList getIndexList(String tag) {
hgs
parents:
diff changeset
   311
		TraceParameterIndexList indexes = new TraceParameterIndexList();
hgs
parents:
diff changeset
   312
		indexes.levelIndex = -1;
hgs
parents:
diff changeset
   313
		if (tag.indexOf(OstConstants.FUNCTION_ENTRY_TAG) > 0
hgs
parents:
diff changeset
   314
				|| tag.indexOf(OstConstants.FUNCTION_EXIT_TAG) > 0) {
hgs
parents:
diff changeset
   315
			indexes.minParamCount = 1; // Name is mandatory
hgs
parents:
diff changeset
   316
			indexes.textIndex = -1; // No trace text
hgs
parents:
diff changeset
   317
			indexes.nameIndex = 0; // Trace name at index 0
hgs
parents:
diff changeset
   318
			indexes.groupIndex = -1; // Group is fixed to TRACE_FLOW
hgs
parents:
diff changeset
   319
			indexes.groupName = FLOW_GROUP_NAME;
hgs
parents:
diff changeset
   320
		} else if (tag.indexOf(OstConstants.STATE_TRACE_TAG) > 0) {
hgs
parents:
diff changeset
   321
			indexes.minParamCount = 1; // Name is mandatory
hgs
parents:
diff changeset
   322
			indexes.textIndex = -1; // No trace text
hgs
parents:
diff changeset
   323
			indexes.nameIndex = 0; // Trace name at index 0
hgs
parents:
diff changeset
   324
			indexes.groupIndex = -1; // Group is fixed to TRACE_STATE
hgs
parents:
diff changeset
   325
			indexes.groupName = STATE_GROUP_NAME;
hgs
parents:
diff changeset
   326
		} else if (tag.indexOf(OstConstants.PERFORMANCE_EVENT_START_TAG) > 0) {
hgs
parents:
diff changeset
   327
			// Name and event name are mandatory
hgs
parents:
diff changeset
   328
			indexes.minParamCount = 2; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   329
			indexes.textIndex = 1; // Trace text at index 1
hgs
parents:
diff changeset
   330
			indexes.nameIndex = 0; // Trace name at index 0
hgs
parents:
diff changeset
   331
			indexes.groupIndex = -1; // Group is fixed to TRACE_PERFORMANCE
hgs
parents:
diff changeset
   332
			indexes.groupName = PERFORMANCE_GROUP_NAME;
hgs
parents:
diff changeset
   333
		} else if (tag.indexOf(OstConstants.PERFORMANCE_EVENT_STOP_TAG) > 0) {
hgs
parents:
diff changeset
   334
			// Name and event name are mandatory
hgs
parents:
diff changeset
   335
			indexes.minParamCount = 2; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   336
			indexes.textIndex = 1; // Trace text at index 1
hgs
parents:
diff changeset
   337
			indexes.nameIndex = 0; // Trace name at index 0
hgs
parents:
diff changeset
   338
			indexes.groupIndex = -1; // Group is fixed to TRACE_PERFORMANCE
hgs
parents:
diff changeset
   339
			indexes.groupName = PERFORMANCE_GROUP_NAME;
hgs
parents:
diff changeset
   340
		} else {
hgs
parents:
diff changeset
   341
			indexes.minParamCount = MIN_PARAMETER_COUNT;
hgs
parents:
diff changeset
   342
			indexes.textIndex = TRACE_TEXT_OFFSET;
hgs
parents:
diff changeset
   343
			indexes.nameIndex = TRACE_NAME_OFFSET;
hgs
parents:
diff changeset
   344
			indexes.groupIndex = GROUP_NAME_OFFSET;
hgs
parents:
diff changeset
   345
		}
hgs
parents:
diff changeset
   346
		// If the trace macro contains preprocessor level, the offsets are
hgs
parents:
diff changeset
   347
		// incremented by one
hgs
parents:
diff changeset
   348
		if (tag.indexOf(OstConstants.PREPROCESSOR_LEVEL_TAG) > 0) {
hgs
parents:
diff changeset
   349
			indexes.minParamCount++;
hgs
parents:
diff changeset
   350
			if (indexes.textIndex >= 0) {
hgs
parents:
diff changeset
   351
				indexes.textIndex++;
hgs
parents:
diff changeset
   352
			}
hgs
parents:
diff changeset
   353
			if (indexes.nameIndex >= 0) {
hgs
parents:
diff changeset
   354
				indexes.nameIndex++;
hgs
parents:
diff changeset
   355
			}
hgs
parents:
diff changeset
   356
			if (indexes.groupIndex >= 0) {
hgs
parents:
diff changeset
   357
				indexes.groupIndex++;
hgs
parents:
diff changeset
   358
			}
hgs
parents:
diff changeset
   359
			indexes.levelIndex = PREPROCESSOR_LEVEL_OFFSET;
hgs
parents:
diff changeset
   360
		}
hgs
parents:
diff changeset
   361
		return indexes;
hgs
parents:
diff changeset
   362
	}
hgs
parents:
diff changeset
   363
hgs
parents:
diff changeset
   364
	/*
hgs
parents:
diff changeset
   365
	 * (non-Javadoc)
hgs
parents:
diff changeset
   366
	 * 
hgs
parents:
diff changeset
   367
	 * @see com.nokia.tracecompiler.engine.source.SourceParserRule#
hgs
parents:
diff changeset
   368
	 *      convertLocation(com.nokia.tracecompiler.engine.TraceLocation)
hgs
parents:
diff changeset
   369
	 */
hgs
parents:
diff changeset
   370
	@Override
hgs
parents:
diff changeset
   371
	public TraceConversionResult convertLocation(TraceLocation location)
hgs
parents:
diff changeset
   372
			throws TraceCompilerException { // CodForChk_Dis_ComplexFunc
hgs
parents:
diff changeset
   373
		TraceParameterFlagList flags = checkParameterCount(location);
hgs
parents:
diff changeset
   374
hgs
parents:
diff changeset
   375
		// Data tag does not have parameters
hgs
parents:
diff changeset
   376
		boolean checkParameters = !flags.hasDataTag;
hgs
parents:
diff changeset
   377
hgs
parents:
diff changeset
   378
		List<FormatMapping> typeList;
hgs
parents:
diff changeset
   379
		if (flags.hasExtTag
hgs
parents:
diff changeset
   380
				&& (flags.hasFunctionEntryTag || flags.hasFunctionExitTag)) {
hgs
parents:
diff changeset
   381
			// Parameters are generated by AutoAdd rules
hgs
parents:
diff changeset
   382
			typeList = new ArrayList<FormatMapping>();
hgs
parents:
diff changeset
   383
			checkParameters = false;
hgs
parents:
diff changeset
   384
		} else if (!flags.hasFlags() || flags.hasDataTag || flags.hasExtTag) {
hgs
parents:
diff changeset
   385
			// If the Ext, Data or EventStart tag is present, all formats
hgs
parents:
diff changeset
   386
			// are supported. If no flags is set, only 32-bit formats are
hgs
parents:
diff changeset
   387
			// supported.
hgs
parents:
diff changeset
   388
			typeList = buildParameterTypeList(location.getTraceText(),
hgs
parents:
diff changeset
   389
					!flags.hasDataTag && !flags.hasExtTag);
hgs
parents:
diff changeset
   390
		} else if (flags.hasEventStartTag) {
hgs
parents:
diff changeset
   391
			// In case of Start1 tag value parameter is supported
hgs
parents:
diff changeset
   392
			typeList = new ArrayList<FormatMapping>();
hgs
parents:
diff changeset
   393
			// Check that does optional value exist
hgs
parents:
diff changeset
   394
			if (location.getParameterCount() == 1) {
hgs
parents:
diff changeset
   395
				FormatMapping mapping = new FormatMapping(TraceParameter.SDEC32);
hgs
parents:
diff changeset
   396
				mapping.isSimple = true;
hgs
parents:
diff changeset
   397
				typeList.add(mapping);
hgs
parents:
diff changeset
   398
			}
hgs
parents:
diff changeset
   399
			checkParameters = false;
hgs
parents:
diff changeset
   400
		} else if (flags.hasEventStopTag) {
hgs
parents:
diff changeset
   401
			// If the Event stop tag is presented, start event trace
hgs
parents:
diff changeset
   402
			// id parameter is supported
hgs
parents:
diff changeset
   403
			typeList = new ArrayList<FormatMapping>();
hgs
parents:
diff changeset
   404
			FormatMapping mapping = new FormatMapping(TraceParameter.UDEC32);
hgs
parents:
diff changeset
   405
			mapping.isSimple = true;
hgs
parents:
diff changeset
   406
			typeList.add(mapping);
hgs
parents:
diff changeset
   407
			checkParameters = false;
hgs
parents:
diff changeset
   408
hgs
parents:
diff changeset
   409
		} else if (flags.hasStateTag) {
hgs
parents:
diff changeset
   410
			// If the State tag is presented, two ascii parameters are supported
hgs
parents:
diff changeset
   411
			// in case of State0 tag (parameter count = 2). In case of State1
hgs
parents:
diff changeset
   412
			// tag (parameter count = 3) two ascii and one 32-bit hex parameters
hgs
parents:
diff changeset
   413
			// are supported
hgs
parents:
diff changeset
   414
			typeList = new ArrayList<FormatMapping>();
hgs
parents:
diff changeset
   415
			FormatMapping mapping = new FormatMapping(TraceParameter.ASCII);
hgs
parents:
diff changeset
   416
			mapping.isSimple = true;
hgs
parents:
diff changeset
   417
			typeList.add(mapping);
hgs
parents:
diff changeset
   418
			mapping = new FormatMapping(TraceParameter.ASCII);
hgs
parents:
diff changeset
   419
			mapping.isSimple = true;
hgs
parents:
diff changeset
   420
			typeList.add(mapping);
hgs
parents:
diff changeset
   421
hgs
parents:
diff changeset
   422
			// Check that does optional instance identifier exist
hgs
parents:
diff changeset
   423
			if (location.getParameterCount() == 3) { // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   424
				mapping = new FormatMapping(TraceParameter.HEX32);
hgs
parents:
diff changeset
   425
				mapping.isSimple = true;
hgs
parents:
diff changeset
   426
				typeList.add(mapping);
hgs
parents:
diff changeset
   427
			}
hgs
parents:
diff changeset
   428
			checkParameters = false;
hgs
parents:
diff changeset
   429
		} else {
hgs
parents:
diff changeset
   430
			// If some other flag than Data, State, Ext or EventStart is set,
hgs
parents:
diff changeset
   431
			// only one 32-bit hex parameter is supported
hgs
parents:
diff changeset
   432
			typeList = new ArrayList<FormatMapping>();
hgs
parents:
diff changeset
   433
			if (location.getParameterCount() == 1) {
hgs
parents:
diff changeset
   434
				FormatMapping mapping = new FormatMapping(TraceParameter.HEX32);
hgs
parents:
diff changeset
   435
				mapping.isSimple = true;
hgs
parents:
diff changeset
   436
				typeList.add(mapping);
hgs
parents:
diff changeset
   437
			}
hgs
parents:
diff changeset
   438
		}
hgs
parents:
diff changeset
   439
		// If no flags or Ext flag is present, the parameter count needs to be
hgs
parents:
diff changeset
   440
		// verified
hgs
parents:
diff changeset
   441
		TraceConversionResult result = super.convertLocation(location,
hgs
parents:
diff changeset
   442
				checkParameters, typeList);
hgs
parents:
diff changeset
   443
		// If the extension or state tag is present, zero parameters or a single
hgs
parents:
diff changeset
   444
		// 32-bit parameter is not accepted because they do not need to generate
hgs
parents:
diff changeset
   445
		// a function into the header
hgs
parents:
diff changeset
   446
		if (((flags.hasExtTag && !flags.hasFunctionExitTag && !flags.hasFunctionEntryTag) || (flags.hasStateTag))
hgs
parents:
diff changeset
   447
				&& (typeList.size() == 0 || (typeList.size() == 1 && typeList
hgs
parents:
diff changeset
   448
						.get(0).isSimple))) {
hgs
parents:
diff changeset
   449
			throw new TraceCompilerException(
hgs
parents:
diff changeset
   450
					TraceCompilerErrorCode.PARAMETER_FORMAT_UNNECESSARY_EXT_MACRO);
hgs
parents:
diff changeset
   451
		}
hgs
parents:
diff changeset
   452
		// Ext-macros are tagged with the complex header rule, so the header
hgs
parents:
diff changeset
   453
		// gets written when traces are exported. Data-macros are tagged with
hgs
parents:
diff changeset
   454
		// read-only rule, so they are not updated via UI. Other special cases
hgs
parents:
diff changeset
   455
		// are flagged with corresponding rule.
hgs
parents:
diff changeset
   456
		// If trace text does not exist, it is created based on context
hgs
parents:
diff changeset
   457
		AutomaticTraceTextRule rule = null;
hgs
parents:
diff changeset
   458
		if (flags.hasDataTag) {
hgs
parents:
diff changeset
   459
			addRule(result, new ReadOnlyObjectRuleImpl());
hgs
parents:
diff changeset
   460
		} else if (flags.hasStateTag) {
hgs
parents:
diff changeset
   461
			addRule(result, new StateTraceRule());
hgs
parents:
diff changeset
   462
			addRule(result, new ComplexHeaderRuleImpl());
hgs
parents:
diff changeset
   463
		} else if (flags.hasEventStartTag) {
hgs
parents:
diff changeset
   464
			addRule(result, new PerformanceEventStartRule());
hgs
parents:
diff changeset
   465
			// If event value is not defined then event value 1 is automatically
hgs
parents:
diff changeset
   466
			// added to event start macros
hgs
parents:
diff changeset
   467
			if (location.getParameterCount() == 0) {
hgs
parents:
diff changeset
   468
				addRule(result, new AutoAddValueRule());
hgs
parents:
diff changeset
   469
			}
hgs
parents:
diff changeset
   470
		} else if (flags.hasEventStopTag) {
hgs
parents:
diff changeset
   471
			addRule(result, new PerformanceEventStopRule());
hgs
parents:
diff changeset
   472
			addRule(result, new ComplexHeaderRuleImpl());
hgs
parents:
diff changeset
   473
			// Event value 0 is automatically added to event stop macros
hgs
parents:
diff changeset
   474
			addRule(result, new AutoAddValueRule());
hgs
parents:
diff changeset
   475
		} else if (flags.hasFunctionEntryTag) {
hgs
parents:
diff changeset
   476
			if (flags.hasExtTag) {
hgs
parents:
diff changeset
   477
				// Entry trace may contain Ext tag. In that case the trace
hgs
parents:
diff changeset
   478
				// parameters are an instance variable and function parameters
hgs
parents:
diff changeset
   479
				// parsed from source. It is also flagged as complex, so the
hgs
parents:
diff changeset
   480
				// function gets generated to the trace header
hgs
parents:
diff changeset
   481
				addRule(result, new ComplexHeaderRuleImpl());
hgs
parents:
diff changeset
   482
				addRule(result, new AutoAddFunctionParametersRule());
hgs
parents:
diff changeset
   483
				addRule(result, new AutoAddThisPtrRule());
hgs
parents:
diff changeset
   484
			}
hgs
parents:
diff changeset
   485
			rule = new EntryTraceRule();
hgs
parents:
diff changeset
   486
			addRule(result, rule);
hgs
parents:
diff changeset
   487
		} else if (flags.hasFunctionExitTag) {
hgs
parents:
diff changeset
   488
			if (flags.hasExtTag) {
hgs
parents:
diff changeset
   489
				// Exit trace may contain Ext tag. In that case the trace has
hgs
parents:
diff changeset
   490
				// two parameters: instance variable and return statement
hgs
parents:
diff changeset
   491
				// It is also flagged as complex, so the function gets generated
hgs
parents:
diff changeset
   492
				// to the trace header
hgs
parents:
diff changeset
   493
				addRule(result, new ComplexHeaderRuleImpl());
hgs
parents:
diff changeset
   494
				addRule(result, new AutoAddThisPtrRule());
hgs
parents:
diff changeset
   495
				addRule(result, new AutoAddReturnParameterRule());
hgs
parents:
diff changeset
   496
			}
hgs
parents:
diff changeset
   497
			rule = new ExitTraceRule();
hgs
parents:
diff changeset
   498
			addRule(result, rule);
hgs
parents:
diff changeset
   499
		} else if (flags.hasExtTag) {
hgs
parents:
diff changeset
   500
			addRule(result, new ComplexHeaderRuleImpl());
hgs
parents:
diff changeset
   501
		}
hgs
parents:
diff changeset
   502
		if (rule != null) {
hgs
parents:
diff changeset
   503
			setAutoTextToTrace(location, result, rule);
hgs
parents:
diff changeset
   504
		}
hgs
parents:
diff changeset
   505
		List<String> parserData = location.getParserData();
hgs
parents:
diff changeset
   506
		result.group = parserData.get(parserData.size() - 1);
hgs
parents:
diff changeset
   507
		// The convert flag is reset to prevent further conversions
hgs
parents:
diff changeset
   508
		location.locationConverted();
hgs
parents:
diff changeset
   509
		return result;
hgs
parents:
diff changeset
   510
	}
hgs
parents:
diff changeset
   511
hgs
parents:
diff changeset
   512
	/**
hgs
parents:
diff changeset
   513
	 * Uses the auto-text rule to create trace text
hgs
parents:
diff changeset
   514
	 * 
hgs
parents:
diff changeset
   515
	 * @param location
hgs
parents:
diff changeset
   516
	 *            the location
hgs
parents:
diff changeset
   517
	 * @param result
hgs
parents:
diff changeset
   518
	 *            the conversion result
hgs
parents:
diff changeset
   519
	 * @param rule
hgs
parents:
diff changeset
   520
	 *            the auto-text rule
hgs
parents:
diff changeset
   521
	 * @throws TraceCompilerException
hgs
parents:
diff changeset
   522
	 *             if update fails
hgs
parents:
diff changeset
   523
	 */
hgs
parents:
diff changeset
   524
	private void setAutoTextToTrace(TraceLocation location,
hgs
parents:
diff changeset
   525
			TraceConversionResult result, AutomaticTraceTextRule rule)
hgs
parents:
diff changeset
   526
			throws TraceCompilerException {
hgs
parents:
diff changeset
   527
		// The trace text comes from the auto-text rule
hgs
parents:
diff changeset
   528
		SourceParser parser = location.getParser();
hgs
parents:
diff changeset
   529
		SourceContext context = parser.getContext(location.getOffset());
hgs
parents:
diff changeset
   530
		if (context != null) {
hgs
parents:
diff changeset
   531
			result.text = rule.formatTrace(context);
hgs
parents:
diff changeset
   532
		} else {
hgs
parents:
diff changeset
   533
			throw new TraceCompilerException(
hgs
parents:
diff changeset
   534
					TraceCompilerErrorCode.NO_CONTEXT_FOR_LOCATION);
hgs
parents:
diff changeset
   535
		}
hgs
parents:
diff changeset
   536
	}
hgs
parents:
diff changeset
   537
hgs
parents:
diff changeset
   538
	/**
hgs
parents:
diff changeset
   539
	 * Checks parameter count
hgs
parents:
diff changeset
   540
	 * 
hgs
parents:
diff changeset
   541
	 * @param location
hgs
parents:
diff changeset
   542
	 *            the location
hgs
parents:
diff changeset
   543
	 * @return the location tag flags
hgs
parents:
diff changeset
   544
	 * @throws TraceCompilerException
hgs
parents:
diff changeset
   545
	 *             if parameter count is not valid
hgs
parents:
diff changeset
   546
	 */
hgs
parents:
diff changeset
   547
	private TraceParameterFlagList checkParameterCount(TraceLocation location)
hgs
parents:
diff changeset
   548
			throws TraceCompilerException {
hgs
parents:
diff changeset
   549
		TraceParameterFlagList flags = new TraceParameterFlagList(location
hgs
parents:
diff changeset
   550
				.getTag());
hgs
parents:
diff changeset
   551
hgs
parents:
diff changeset
   552
		// If the trace has some tag, the parameter count is fixed
hgs
parents:
diff changeset
   553
		// Data has 2 parameters
hgs
parents:
diff changeset
   554
		// State has 2 or 3 parameters
hgs
parents:
diff changeset
   555
		// Function entry-exit has 0 or 1 parameters
hgs
parents:
diff changeset
   556
		// Event start has 0 or 1 parameters
hgs
parents:
diff changeset
   557
		// Event stop has 1 parameters
hgs
parents:
diff changeset
   558
		int parameterCount = location.getParameterCount();
hgs
parents:
diff changeset
   559
hgs
parents:
diff changeset
   560
		// Entry trace may have zero or one parameter
hgs
parents:
diff changeset
   561
		// In case of Ext, it must have one parameter
hgs
parents:
diff changeset
   562
		if (flags.hasFunctionEntryTag
hgs
parents:
diff changeset
   563
				&& ((parameterCount > 1) || (flags.hasExtTag && (parameterCount != ENTRY_EXT_PARAMETER_COUNT)))) {
hgs
parents:
diff changeset
   564
			throw new TraceCompilerException(
hgs
parents:
diff changeset
   565
					TraceCompilerErrorCode.PARAMETER_COUNT_DOES_NOT_MATCH_API);
hgs
parents:
diff changeset
   566
		}
hgs
parents:
diff changeset
   567
hgs
parents:
diff changeset
   568
		// Exit trace may have zero or one parameter
hgs
parents:
diff changeset
   569
		// In case of Ext, it must have two parameters
hgs
parents:
diff changeset
   570
		if (flags.hasFunctionExitTag
hgs
parents:
diff changeset
   571
				&& ((!flags.hasExtTag && (parameterCount > 1)) || (flags.hasExtTag && parameterCount != EXIT_EXT_PARAMETER_COUNT))) { // CodForChk_Dis_LengthyLine
hgs
parents:
diff changeset
   572
			throw new TraceCompilerException(
hgs
parents:
diff changeset
   573
					TraceCompilerErrorCode.PARAMETER_COUNT_DOES_NOT_MATCH_API);
hgs
parents:
diff changeset
   574
		}
hgs
parents:
diff changeset
   575
hgs
parents:
diff changeset
   576
		// Event start may have zero or one parameter
hgs
parents:
diff changeset
   577
		if (flags.hasEventStartTag && (parameterCount > 1)) {
hgs
parents:
diff changeset
   578
			throw new TraceCompilerException(
hgs
parents:
diff changeset
   579
					TraceCompilerErrorCode.PARAMETER_COUNT_DOES_NOT_MATCH_API);
hgs
parents:
diff changeset
   580
		}
hgs
parents:
diff changeset
   581
hgs
parents:
diff changeset
   582
		// Event stop have one parameters
hgs
parents:
diff changeset
   583
		if (flags.hasEventStopTag && (parameterCount != 1)) {
hgs
parents:
diff changeset
   584
			throw new TraceCompilerException(
hgs
parents:
diff changeset
   585
					TraceCompilerErrorCode.PARAMETER_COUNT_DOES_NOT_MATCH_API);
hgs
parents:
diff changeset
   586
		}
hgs
parents:
diff changeset
   587
hgs
parents:
diff changeset
   588
		// Data trace has two parameters
hgs
parents:
diff changeset
   589
		if ((flags.hasDataTag && (parameterCount != DATA_PARAMETER_COUNT))) {
hgs
parents:
diff changeset
   590
			throw new TraceCompilerException(
hgs
parents:
diff changeset
   591
					TraceCompilerErrorCode.PARAMETER_COUNT_DOES_NOT_MATCH_API);
hgs
parents:
diff changeset
   592
		}
hgs
parents:
diff changeset
   593
hgs
parents:
diff changeset
   594
		// State trace may have two or three parameter
hgs
parents:
diff changeset
   595
		if (flags.hasStateTag && (parameterCount < 2 || parameterCount > 3)) { // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   596
			throw new TraceCompilerException(
hgs
parents:
diff changeset
   597
					TraceCompilerErrorCode.PARAMETER_COUNT_DOES_NOT_MATCH_API);
hgs
parents:
diff changeset
   598
		}
hgs
parents:
diff changeset
   599
hgs
parents:
diff changeset
   600
		return flags;
hgs
parents:
diff changeset
   601
	}
hgs
parents:
diff changeset
   602
hgs
parents:
diff changeset
   603
	/**
hgs
parents:
diff changeset
   604
	 * Adds a rule to result
hgs
parents:
diff changeset
   605
	 * 
hgs
parents:
diff changeset
   606
	 * @param result
hgs
parents:
diff changeset
   607
	 *            the result
hgs
parents:
diff changeset
   608
	 * @param rule
hgs
parents:
diff changeset
   609
	 *            the rule
hgs
parents:
diff changeset
   610
	 */
hgs
parents:
diff changeset
   611
	private void addRule(TraceConversionResult result, TraceModelExtension rule) {
hgs
parents:
diff changeset
   612
		if (result.extensions == null) {
hgs
parents:
diff changeset
   613
			result.extensions = new ArrayList<TraceModelExtension>();
hgs
parents:
diff changeset
   614
		}
hgs
parents:
diff changeset
   615
		result.extensions.add(rule);
hgs
parents:
diff changeset
   616
	}
hgs
parents:
diff changeset
   617
hgs
parents:
diff changeset
   618
	/*
hgs
parents:
diff changeset
   619
	 * (non-Javadoc)
hgs
parents:
diff changeset
   620
	 * 
hgs
parents:
diff changeset
   621
	 * @see com.nokia.tracecompiler.engine.rules.SourceParserRuleBase#
hgs
parents:
diff changeset
   622
	 * isLocationConverted(com.nokia.tracecompiler.engine.TraceLocation)
hgs
parents:
diff changeset
   623
	 */
hgs
parents:
diff changeset
   624
	@Override
hgs
parents:
diff changeset
   625
	public boolean isLocationConverted(TraceLocation location) {
hgs
parents:
diff changeset
   626
		boolean retval = location.hasChangedAfterConvert();
hgs
parents:
diff changeset
   627
		if (!retval) {
hgs
parents:
diff changeset
   628
			// Duplicate-location conversions need to be retried in case the
hgs
parents:
diff changeset
   629
			// location is no longer a duplicate
hgs
parents:
diff changeset
   630
			retval = (location.getValidityCode() == TraceCompilerErrorCode.TRACE_HAS_MULTIPLE_LOCATIONS);
hgs
parents:
diff changeset
   631
		}
hgs
parents:
diff changeset
   632
		return retval;
hgs
parents:
diff changeset
   633
	}
hgs
parents:
diff changeset
   634
hgs
parents:
diff changeset
   635
	/*
hgs
parents:
diff changeset
   636
	 * (non-Javadoc)
hgs
parents:
diff changeset
   637
	 * 
hgs
parents:
diff changeset
   638
	 * @seecom.nokia.tracecompiler.engine.rules.printf.PrintfTraceParserRule#
hgs
parents:
diff changeset
   639
	 * getLocationGroup()
hgs
parents:
diff changeset
   640
	 */
hgs
parents:
diff changeset
   641
	@Override
hgs
parents:
diff changeset
   642
	public String getLocationGroup() {
hgs
parents:
diff changeset
   643
		return null;
hgs
parents:
diff changeset
   644
	}
hgs
parents:
diff changeset
   645
}