diff -r aa2539c91954 -r 1c2bb2fc7c87 tracesrv/tracecompiler/internal/scripts/convert_traces.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tracesrv/tracecompiler/internal/scripts/convert_traces.pl Tue Oct 26 16:20:32 2010 +0300 @@ -0,0 +1,1337 @@ +# +# Copyright (c) 2010 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: +# +#!perl -w +# +# + +#********************************************************************* +# convert_traces.pl +# ********************************************************************* +# +# VERSION : 6 Draft 15-Feb-2010 Adrian Issott +# REASON : Added warnings about the tool being unsupported +# +# VERSION : 5 Draft 21-Jan-2010 Adrian Issott +# REASON : Fixed issue with own macro support + added removal of +# _L(...) around trace format strings +# +# VERSION : 4 Draft 11-Nov-2009 Esa Karvanen +# REASON : Initial support for converting OST Function entry / +# exit traces to printfs. +# +# VERSION : 3 Draft 20-Aug-2009 Esa Karvanen +# REASON : Added support to convert OST traces back to printf. +# Doesn't work for Function entry / exit traces. +# +# VERSION : 2 Draft 10-Apr-2008 Esa Karvanen +# REASON : Printf and own macro support +# +# VERSION : 1 Draft 16-Oct-2007 Teemu Piiroinen +# REASON : Initial version + +use strict; +use env; +use FindBin '$Bin'; + +warn "\n"; +warn "Warning: this script is not supported and the Dynamic Analysis Tools team\n"; +warn "does NOT promise to fix any bugs or add any functionality to it.\n"; +warn "\n"; + +# Should we print debug prints +my $DEBUG = 0; + +if (not defined $ARGV[0] or not -f $ARGV[0]) +{ + print "Please give path to mmp file as parameter."; + + exit; +} + +# Get group names +my %map_trace_to_group; +my %map_trace_to_text; +my %map_trace_to_parameters; + +my $traces_folder; + +# Get source files +my @sources = getSourceFiles(); +my @trace_id_names; +my $CASWTraceCount = 0; + +my $printfMacro; + + +# Ask selection from user +my $selection = get_operation(); + +# Check if the selection is numeric +if ($selection =~ /^-?\d/) +{ + # Symbian traces + if ($selection == 1) + { + $traces_folder = get_traces_folder(); + convertSymbianTraces(@sources); + } + + # Kern::Printf + elsif ($selection == 2) + { + $printfMacro = "kern::printf"; + convertPrintf($printfMacro, @sources); + } + + # RDebug::Printf + elsif ($selection == 3) + { + $printfMacro = "rdebug::printf"; + convertPrintf($printfMacro, @sources); + } + + # User defined MACRO + elsif ($selection == 4) + { + $printfMacro = "rdebug::printf"; + convertPrintf($printfMacro, @sources); + } + + # OST traces to Kern::Printf + elsif ($selection == 5) + { + $printfMacro = "Kern::Printf"; + convertOstToPrintf($printfMacro, @sources); + } + + # OST traces to RDebug::Printf + elsif ($selection == 6) + { + $printfMacro = "RDebug::Printf"; + convertOstToPrintf($printfMacro, @sources); + } + else + { + print "Wrong selection!"; + } +} + +# Otherwise, it's user defined MACRO +else +{ + $printfMacro = $selection; + convertPrintf($printfMacro, @sources); +} + + +#------------------------------------------------------- +# Convert Symbian traces +#------------------------------------------------------- +sub convertSymbianTraces +{ + debug("\nConvertSymbianTraces starts"); + my (@sources) = @_; + + # Go through all found source files + foreach my $source_file (@sources) + { + debug("Source file $source_file"); + print $source_file . "\n"; + + RemoveLineBreaksFromTracesInFile($source_file, 0); + + open FILE, "<$source_file" or die $!; + + my $new_file_content; + + my $traces_converted = 0; + my $file_name = ""; + my $last_include_line = 0; + my $line_number = 0; + + if ($source_file =~ /.*\\(.+?)\..+/) + { + $file_name = $1; + } + + foreach my $line () + { + $line_number += 1; + + my $line_converted = 0; + + chomp $line; + + if ($line =~ /^\s*\#include/) + { + $last_include_line = $line_number; + } + + if ($line =~ /Traces\.h/) + { + $line = "// " . $line; + } + + # FA_CORE_SERVICES traces + if ($line =~ /(BUILD_TRACE|ASSERT_TRACE|ASSERT_ALWAYS_TRACE|API_TRACE|INTERNAL_TRACE|DATA_DUMP_TRACE|ISIMSG_API_TRACE).*;/) + { + my $trace_name = $1; + + if ($line =~ /.*?\/\/.*?$trace_name/) + { + next; + } + + my $spaces = ""; + if ($line =~ /^(\s+).*?$trace_name/) + { + $spaces = $1; + } + + my $prefix = ""; + if ($line =~ /^\s*(.*?)$trace_name/) + { + $prefix = $1; + } + + $line =~ s/^.*($trace_name.+;).*/$1/; + + if ($line =~ /$trace_name\s*\((.+)\)\s*;/) + { + $line_converted = 1; + $traces_converted = 1; + + my $parameters = $1; + + $new_file_content .= $spaces . "// " . $prefix . $line . "\n"; + + # Get parameters without format string + my $parameters_without_format = $parameters; + if ($parameters =~ /\".*\"(.*)/) + { + $parameters_without_format = $1; + } + + # Calculate parameter count + my $parameter_count = -1; + foreach my $part (split(",", $parameters_without_format)) + { + $parameter_count++; + } + + my $new_trace = GetNewCASWTraceName($trace_name, $parameter_count); + + if ($trace_name =~ /(BUILD_TRACE|ASSERT_TRACE|ASSERT_ALWAYS_TRACE|API_TRACE|INTERNAL_TRACE)/) + { + $new_trace .= "(" . $trace_name . ", TRACE_NAME_" . $CASWTraceCount++ . ", " . $parameters . ");"; + } + else + { + $new_trace .= "(" . $trace_name . ", TRACE_NAME_" . $CASWTraceCount++ . ", "; + + if ($parameter_count == 0) + { + $new_trace .= "\"\", " . $parameters . ", );"; + } + else + { + $new_trace .= $parameters . ", );"; + } + } + + $new_file_content .= $spaces . $new_trace . "\n"; + } + } + + # SymbianTraces + if ($line =~ /SymbianTrace([0-2]|Data[0-1]{0,1}|Thread[0-2]|ThreadData[0-1]{0,1}|IsTraceActive|Pc[0-2]|ThreadPc[0-2]|PcData[0-1]{0,1}|ThreadPcData[0-1]{0,1}|StartControlBlock|EndControlBlock|Ext[1-6]|ExtThread[1-6]).*;/) + { + my $trace_name = "SymbianTrace" . $1; + + if ($line =~ /.*?\/\/.*?SymbianTrace/) + { + next; + } + + # print $trace_name . "\n"; + + my $spaces = ""; + if ($line =~ /^(\s+).*?SymbianTrace/) + { + $spaces = $1; + } + + my $prefix = ""; + if ($line =~ /^\s*(.*?)SymbianTrace/) + { + $prefix = $1; + } + + $line =~ s/^.*(SymbianTrace.+;).*/$1/; + + #print $line . "\n"; + + # Get trace id name + if ($line =~ /\(\s*(.+?)[\s\),]{1,2}(.*?)\)\s*;$/) + { + $line_converted = 1; + $traces_converted = 1; + + my $trace_id_name = $1; + my $rest_of_parameters = $2; + + my $new_trace_id_name = $trace_id_name; + + $new_file_content .= $spaces . "// " . $prefix . $line . "\n"; + + #print $trace_id_name . "\n"; + #print $rest_of_parameters . "\n"; + + if ($trace_name ne "SymbianTraceIsTraceActive") + { + while (grep(/$new_trace_id_name/, @trace_id_names)) + { + # Duplicate trace + $new_trace_id_name .= "_"; + } + + push(@trace_id_names, $new_trace_id_name); + } + + my $trace_text = $map_trace_to_text{$trace_id_name}; + + my @params = split(",", $rest_of_parameters); + + $trace_text .= GetFormatText($trace_id_name, @params); + + my $type_string = IsStringType($trace_id_name, @params); + + my $group_name = $map_trace_to_group{$trace_id_name}; + if (not defined $group_name or $group_name eq "") + { + $group_name = "DEFAULT_GROUP"; + $trace_text = ""; + } + + my $new_trace = GetNewSymbianTraceName($trace_name, $type_string); + $new_trace .= "( " . $group_name . ", " . + $new_trace_id_name . ", " . + "\"" . $trace_text . "\""; + + if ($rest_of_parameters ne "") + { + $new_trace .= ", " . $rest_of_parameters; + } + + $new_trace .= ");"; + + $new_file_content .= $spaces . $new_trace . "\n"; + + #print $new_trace . "\n\n"; + } + else + { + print STDERR "Cannot find trace id name. From line: $line\n"; + } + } + + if (not $line_converted) + { + $new_file_content .= $line . "\n"; + } + + } + + close FILE; + + if ($traces_converted == 1) + { + SaveNewSourceFile($source_file, $new_file_content, $last_include_line, $file_name, 1); + } + } + +CreateOSTTraceDefinitionsHeader(); +} + + +#------------------------------------------------------- +# Convert PRINTF traces to OST traces +#------------------------------------------------------- +sub convertPrintf +{ + my ($macro, @sources) = @_; + debug("\nConvertPrintf starts, macro is: $macro"); + + # Go through all found source files + foreach my $source_file (@sources) + { + debug("Source file $source_file"); + print $source_file . "\n"; + + RemoveLineBreaksFromTracesInFile($source_file, 0); + + open FILE, "<$source_file" or die $!; + + my $new_file_content; + + my $traces_converted = 0; + my $file_name = ""; + my $last_include_line = 0; + my $line_number = 0; + my $traceNumber = 0; + + if ($source_file =~ /.*\\(.+?)\..+/) + { + $file_name = $1; + } + + foreach my $line () + { + $line_number += 1; + + my $line_converted = 0; + + chomp $line; + + if ($line =~ /^\s*\#include/) + { + $last_include_line = $line_number; + } + + if ($line =~ /Traces\.h/) + { + $line = "// " . $line; + } + + # Printf macro + if ($line =~ /^\s*$macro.*;/i) + { + my $spaces; + my $trace = ""; + if ($line =~ /^(\s*)/) + { + $spaces = $1; + } + + $line =~ s/^\s*($macro.+;).*/$1/; + + $trace = $line; + + # Remove spaces from the beginning + $trace =~ s/^\s*//g; + + print("Trace: " . $line . "\n"); + + if (GetBracketCount($line) % 2 == 0) + { + my $param_count = 0; + my $params = $line; + + while($params =~ s/(.*?),/$1/) + { + $param_count++; + } + + $line = $spaces . "// " . $trace ."\n"; + $line .= $spaces; + + # Remove the macro from the trace + debug("Trace before removing MACRO $trace"); + $trace =~ /\((.*)\)/; + $trace = $1; + debug("Trace after removing MACRO $trace"); + + # Remove use of _L(...) + if ($trace =~ s/\b_L\(//g) + { + $trace =~ s/(.*")\)/$1/; # want to remove the last ") rather than the first one we come across + } + + # Convert + # 0 parameters + debug("Convert trace with $param_count parameters"); + if ($param_count == 0) + { + $line .= "OstTrace0(DEFAULT_GROUP, DEFAULT_TRACE" . $traceNumber . ", " . $trace . ");"; + } + # 1 parameter + elsif ($param_count == 1) + { + $line .= "OstTrace1(DEFAULT_GROUP, DEFAULT_TRACE" . $traceNumber . ", " . $trace . ");"; + } + # More than 1 parameters + else + { + $line .= "OstTraceExt" . $param_count . "(DEFAULT_GROUP, DEFAULT_TRACE" . $traceNumber . ", " . $trace . ");"; + } + + $new_file_content .= $line . "\n"; + $line_converted = 1; + $traces_converted = 1; + $traceNumber++; + } + } + else + { + $new_file_content .= $line . "\n"; + } + } + + close FILE; + + if ($traces_converted == 1) + { + debug("\n\nSave new source file"); + SaveNewSourceFile($source_file, $new_file_content, $last_include_line, $file_name, 1); + } + } + +CreateOSTTraceDefinitionsHeader(); + +} + + +#------------------------------------------------------- +# Get bracket count +#------------------------------------------------------- +sub GetBracketCount +{ + my ($line) = @_; + + $line =~ s/\\\(//g; + $line =~ s/\\\)//g; + + my @brackets = ($line =~ /\(|\)/g); + + return scalar @brackets; +} + +#------------------------------------------------------- +# Save new source file +#------------------------------------------------------- +sub SaveNewSourceFile +{ + my ($source_file, $new_file_content, $last_include_line, $file_name, $add_ost_stuff) = @_; + + open FILE, ">$source_file" or die $!; + + my @lines = split("\n", $new_file_content); + + my $line_number = 0; + foreach my $line (@lines) + { + $line_number++; + + print FILE $line . "\n"; + + if ($line_number == $last_include_line && $add_ost_stuff == 1) + { + print FILE "\#include \"OstTraceDefinitions.h\"\n"; + print FILE "\#ifdef OST_TRACE_COMPILER_IN_USE\n"; + print FILE "\#include \"" . $file_name . "Traces.h\"\n"; + print FILE "\#endif\n\n"; + } + } + + close FILE; +} + + +#------------------------------------------------------- +# Create OST Trace Definitions header file +#------------------------------------------------------- +sub CreateOSTTraceDefinitionsHeader +{ + debug("\nCreateOSTTraceDefinitionsHeader starts"); + + # Get path to traces folder + my $mmp_file = $ARGV[0]; + my $file_path = $mmp_file; + $file_path =~ s/\\[^\\]+$/\\/i; + $file_path =~ s/\\\\/\\/g; + if ($file_path =~ m/\.mmp/i) + { + debug("getGroupTraceData. MMP file doesn't have path. Use current dir."); + my $dir = "$Bin"; + $file_path = $dir; + $file_path =~ s/\//\\/g; + } + my $trace_folder_path = concatenatePath($file_path, "..\\traces"); + + debug("CreateOSTTraceDefinitionsHeader trace_folder_path: $trace_folder_path"); + + mkdir($trace_folder_path); + + + open FILE, ">$trace_folder_path\\OstTraceDefinitions.h" or die $!; + + print FILE "\#ifndef __OSTTRACEDEFINITIONS_H__\n" . + "\#define __OSTTRACEDEFINITIONS_H__\n" . + "// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler\n" . + "// REMOVE BEFORE CHECK-IN TO VERSION CONTROL\n" . + "//\#define OST_TRACE_COMPILER_IN_USE\n" . + "\#include \n" . + "\#endif\n"; + + + close FILE; +} + + +#------------------------------------------------------- +# Get format text +#------------------------------------------------------- +sub GetFormatText +{ + my ($trace_id_name, @params) = @_; + + my $format_text = ""; + + foreach my $param (@params) + { + if ($param =~ /(\w+)[\s\)]*$/) + { + $param = $1; + } + + my $type = $map_trace_to_parameters{$trace_id_name}{$param}; + + if (not defined $type or $type eq "" or $type eq "-DEC") + { + $format_text .= " %d"; + } + elsif ($type eq "DEC") + { + $format_text .= " %u"; + } + elsif ($type eq "HEX") + { + $format_text .= " 0x%x"; + } + elsif ($type eq "STR") + { + $format_text .= " %s"; + } + } + + return $format_text; +} + +#------------------------------------------------------- +# Is string type +#------------------------------------------------------- +sub IsStringType +{ + my ($trace_id_name, @params) = @_; + + my $type_string = 0; + + foreach my $param (@params) + { + if ($param =~ /(\w+)[\s\)]*$/) + { + $param = $1; + } + + my $type = $map_trace_to_parameters{$trace_id_name}{$param}; + + if (defined $type and $type eq "STR") + { + $type_string = 1; + } + } + + return $type_string; +} + +#------------------------------------------------------- +# Remove linebreaks from traces +#------------------------------------------------------- +sub RemoveLineBreaksFromTracesInFile +{ + my ($file, $convert_back_to_printf) = @_; + + my $file_changed = 0; + my $new_file_content; + my $previous_line_changed = 0; + my $convert_macro = "Kern::Printf"; + + if ($convert_back_to_printf == 1) + { + $convert_macro = "OstTrace([01]|Ext|Data)"; + } + + open FILE, "<$file" or die $!; + + foreach my $line () + { + chomp($line); + + if ($line =~ /SymbianTrace([0-2]|Data[0-1]{0,1}|Thread[0-2]|ThreadData[0-1]{0,1}|IsTraceActive|Pc[0-2]|ThreadPc[0-2]|PcData[0-1]{0,1}|ThreadPcData[0-1]{0,1}|StartControlBlock|EndControlBlock|Ext[1-6]|ExtThread[1-6])[^;]+$/ or + $line =~ /$convert_macro[^;]+$/ or + $line =~ /(BUILD_TRACE|ASSERT_TRACE|ASSERT_ALWAYS_TRACE|API_TRACE|INTERNAL_TRACE|DATA_DUMP_TRACE|ISIMSG_API_TRACE)[^;]+$/) + { + # We have a trace in multiple lines + $new_file_content .= $line; + + $file_changed = 1; + $previous_line_changed = 1; + } + else + { + if ($previous_line_changed == 1) + { + $line =~ s/\s*(.*)/ $1/; + + $new_file_content .= $line; + } + else + { + $new_file_content .= $line . "\n"; + } + + if ($previous_line_changed and $line =~ /;/) + { + $new_file_content .= "\n"; + $previous_line_changed = 0; + } + } + } + + close FILE; + + if ($file_changed == 1) + { + open FILE, ">$file" or die $!; + + print FILE $new_file_content; + + close FILE; + } +} + +#------------------------------------------------------- +# Get new CASW trace name +#------------------------------------------------------- +sub GetNewCASWTraceName +{ + my ($old_trace_name, $paramater_count) = @_; + + my $new_trace_name; + + if ($old_trace_name eq "BUILD_TRACE" or + $old_trace_name eq "ASSERT_TRACE" or + $old_trace_name eq "ASSERT_ALWAYS_TRACE" or + $old_trace_name eq "API_TRACE" or + $old_trace_name eq "INTERNAL_TRACE") + { + if ($paramater_count <= 0) + { + $new_trace_name = "OstTrace0"; + } + elsif ($paramater_count <= 5) + { + $new_trace_name = "OstTraceExt" . $paramater_count; + } + else + { + $new_trace_name = "// TODO: Cannot convert trace. Too much parameters."; + } + } + elsif ( $old_trace_name eq "DATA_DUMP_TRACE" or + $old_trace_name eq "ISIMSG_API_TRACE") + { + $new_trace_name = "OstTraceData"; + } + + return $new_trace_name; +} + +#------------------------------------------------------- +# Get new Symbian trace name +#------------------------------------------------------- +sub GetNewSymbianTraceName +{ + my ($old_trace_name, $type_string) = @_; + + my $new_trace_name; + + if ($old_trace_name eq "SymbianTrace0" or + $old_trace_name eq "SymbianTraceThread0") + { + $new_trace_name = "OstTrace0"; + } + elsif ( not $type_string and + ( $old_trace_name eq "SymbianTrace1" or + $old_trace_name eq "SymbianTraceThread1" or + $old_trace_name eq "SymbianTraceExt1" or + $old_trace_name eq "SymbianTraceExtThread1")) + { + $new_trace_name = "OstTrace1"; + } + elsif ( $type_string and + ( $old_trace_name eq "SymbianTrace1" or + $old_trace_name eq "SymbianTraceThread1" or + $old_trace_name eq "SymbianTraceExt1" or + $old_trace_name eq "SymbianTraceExtThread1")) + { + $new_trace_name = "OstTraceExt1"; + } + elsif ( $old_trace_name eq "SymbianTrace2" or + $old_trace_name eq "SymbianTraceThread2" or + $old_trace_name eq "SymbianTraceExt2" or + $old_trace_name eq "SymbianTraceExtThread2") + { + $new_trace_name = "OstTraceExt2"; + } + elsif ( $old_trace_name eq "SymbianTraceExt3" or + $old_trace_name eq "SymbianTraceExtThread3") + { + $new_trace_name = "OstTraceExt3"; + } + elsif ( $old_trace_name eq "SymbianTraceExt4" or + $old_trace_name eq "SymbianTraceExtThread4") + { + $new_trace_name = "OstTraceExt4"; + } + elsif ( $old_trace_name eq "SymbianTraceExt5" or + $old_trace_name eq "SymbianTraceExtThread5") + { + $new_trace_name = "OstTraceExt5"; + } + elsif ( $old_trace_name eq "SymbianTraceExt6" or + $old_trace_name eq "SymbianTraceExtThread6") + { + $new_trace_name = "// TODO: Cannot convert SymbianTraceExt6"; + } + elsif ( $old_trace_name eq "SymbianTraceExt7" or + $old_trace_name eq "SymbianTraceExtThread7") + { + $new_trace_name = "// TODO: Cannot convert SymbianTraceExt7"; + } + elsif ( $old_trace_name eq "SymbianTraceData" or + $old_trace_name eq "SymbianTraceData0" or + $old_trace_name eq "SymbianTraceThreadData" or + $old_trace_name eq "SymbianTraceThreadData0") + { + $new_trace_name = "OstTraceData"; + } + elsif ($old_trace_name eq "SymbianTraceData1") + { + $new_trace_name = "// TODO: Cannot convert SymbianTraceData1"; + } + elsif ($old_trace_name eq "SymbianTraceIsTraceActive") + { + $new_trace_name = "// TODO: Cannot convert SymbianTraceIsTraceActive"; + } + elsif ( $old_trace_name eq "SymbianTracePc0" or + $old_trace_name eq "SymbianTracePc1" or + $old_trace_name eq "SymbianTracePc2") + { + $new_trace_name = "// TODO: Cannot convert SymbianTracePc"; + } + elsif ( $old_trace_name eq "SymbianTraceThreadPc0" or + $old_trace_name eq "SymbianTraceThreadPc1" or + $old_trace_name eq "SymbianTraceThreadPc2") + { + $new_trace_name = "// TODO: Cannot convert SymbianTraceThreadPc"; + } + elsif ( $old_trace_name eq "SymbianTracePcData" or + $old_trace_name eq "SymbianTracePcData0" or + $old_trace_name eq "SymbianTracePcData1") + { + $new_trace_name = "// TODO: Cannot convert SymbianTracePcData"; + } + elsif ( $old_trace_name eq "SymbianTraceThreadPcData" or + $old_trace_name eq "SymbianTraceThreadPcData0" or + $old_trace_name eq "SymbianTraceThreadPcData1") + { + $new_trace_name = "// TODO: Cannot convert SymbianTraceThreadPcData"; + } + elsif ( $old_trace_name eq "SymbianTraceStartControlBlock") + { + $new_trace_name = "// TODO: Cannot convert SymbianTraceStartControlBlock"; + } + elsif ( $old_trace_name eq "SymbianTraceEndControlBlock") + { + $new_trace_name = "// TODO: Cannot convert SymbianTraceEndControlBlock"; + } + + return $new_trace_name; +} + +#------------------------------------------------------- +# Get group names +#------------------------------------------------------- +sub getGroupTraceData +{ + my ($map_trace_to_group, $map_trace_to_text, $map_trace_to_parameters, $traces_folder) = @_; + + debug("\n\ngetGroupTraceData starts with: $traces_folder"); + + # Get path to traces folder + my $mmp_file = $ARGV[0]; + my $file_path = $mmp_file; + $file_path =~ s/\\[^\\]+$/\\/i; + $file_path =~ s/\\\\/\\/g; + if ($file_path =~ m/\.mmp/i) + { + debug("getGroupTraceData file doesn't have path. Use current dir."); + my $dir = "$Bin"; + $file_path = $dir; + $file_path =~ s/\//\\/g; + } + + my $trace_folder_path = concatenatePath($file_path, $traces_folder); + + debug("getGroupTraceData MMP file: $mmp_file"); + debug("getGroupTraceData folder path: $trace_folder_path"); + + if (not -e $trace_folder_path) + { + return; + } + + # Get all header files in traces folder + my $dir_return = qx("dir $trace_folder_path\\*.h /b"); + my @header_files = split("\n", $dir_return); + + my $found_header = 0; + + foreach my $header_file (@header_files) + { + debug("getGroupTraceData file: $header_file"); + open FILE, "<$trace_folder_path\\$header_file" or die $!; + + debug("getGroupTraceData file: Found header!"); + $found_header = 1; + + my $trace_id_name; + my $trace_group_name; + + foreach my $line () + { + if ($line =~ /\s*TRACE_GROUP_BEGIN\(\s*(.+?)[\s,]/) + { + $trace_group_name = $1; + } + + if ($line =~ /VALUE\s*\(\s*(-*)\d\d\s*,.+?,\s*(.+?),.*?,\s*(.+?)[\s\)]/) + { + my $sign = $1; + my $variable = $2; + my $type = $3; + + $map_trace_to_parameters{$trace_id_name}{$variable} = $1 . $type; + + #print $variable . " => " . $type . "\n"; + } + + if ($line =~ /STRING_REF\s*\(\s*.+?\s*,.+?,\s*(.+?),.*?,\s*.+?[\s\)]/) + { + my $variable = $1; + + $map_trace_to_parameters{$trace_id_name}{$variable} = "STR"; + } + + if ($line =~ /\s*TRACE_GROUP_END/) + { + $trace_group_name = ""; + } + + if ($line =~ /TRACE_BEGIN\(\s*(.+?)[\s,]+\"(.*)\"/) + { + $trace_id_name = $1; + my $trace_text = $2; + + $trace_text =~ s/\%//g; + + if ($trace_group_name eq "") + { + print STDERR "Invalid trace definition header file: $header_file\nMost likely bug in this script..."; + } + else + { + #print "$trace_id_name => $trace_group_name\n"; + #print "$trace_id_name => $trace_text\n"; + + $map_trace_to_group{$trace_id_name} = $trace_group_name; + $map_trace_to_text{$trace_id_name} = $trace_text; + } + } + } + + close FILE; + } + + return $found_header; +} + +#------------------------------------------------------- +# Convert OST traces to PRINTF traces +#------------------------------------------------------- +sub convertOstToPrintf +{ + my ($macro, @sources) = @_; + debug("convertOstToPrintf starts, macro is: $macro"); + + # Go through all found source files + foreach my $source_file (@sources) + { + debug("Source file $source_file"); + print $source_file . "\n"; + + RemoveLineBreaksFromTracesInFile($source_file, 1); + + open FILE, "<$source_file" or die $!; + + my $new_file_content; + + my $traces_converted = 0; + my $file_name = ""; + my $last_include_line = 0; + my $line_number = 0; + my $traceNumber = 0; + + if ($source_file =~ /.*\\(.+?)\..+/) + { + $file_name = $1; + } + + foreach my $line () + { + $line_number += 1; + + my $line_converted = 0; + + chomp $line; + + if ($line =~ /^\s*\#include/) + { + $last_include_line = $line_number; + } + + if ($line =~ /Traces\.h/) + { + $line = "// " . $line; + } + + # Printf macro + if ($line =~ /^\s*OstTrace.*;/i) + { + my $spaces; + my $trace = ""; + if ($line =~ /^(\s*)/) + { + $spaces = $1; + } + + $line =~ s/^\s*(OstTrace.+;).*/$1/; + + # Remove spaces from the beginning + $trace = $line; + $trace =~ s/^\s*//g; + + print("Trace: " . $line . "\n"); + + if (GetBracketCount($line) % 2 == 0) + { + $line = $spaces . "// " . $trace ."\n"; + $line .= $spaces; + + # Remove the macro from the trace + debug("Trace before removing MACRO $trace"); + + # Check if Function Entry or Exit trace + if ($trace =~ /^\s*OstTraceFunction.*;/i) + { + $trace =~ /\(\s*(.*?)([,\s\)])/; + $trace = "\"" . $1 . "\""; + } + + # Other OST traces + else + { + $trace =~ /\((.*?,)(.*?,)\s?(.*)\)/; + $trace = $3; + } + debug("Trace after removing MACRO $trace"); + + # Convert + $line .= $macro . "(" . $trace . ");"; + + $new_file_content .= $line . "\n"; + $line_converted = 1; + $traces_converted = 1; + $traceNumber++; + } + } + else + { + $new_file_content .= $line . "\n"; + } + } + + close FILE; + + if ($traces_converted == 1) + { + debug("\n\nSave new source file"); + SaveNewSourceFile($source_file, $new_file_content, $last_include_line, $file_name, 0); + } + } +} + +#------------------------------------------------------- +# Get source files +#------------------------------------------------------- +sub getSourceFiles +{ + debug("getSourceFiles starts"); + my @sources; + + # Open mmp file + foreach my $mmp_file (@ARGV) + { + debug("getSourceFiles MMP file: $mmp_file"); + my $file_path = $mmp_file; + $file_path =~ s/\\[^\\]+$/\\/i; + $file_path =~ s/\\\\/\\/g; + if ($file_path =~ m/\.mmp/i) + { + debug("getSourceFiles file doesn't have path. Use current dir"); + my $dir = "$Bin"; + $file_path = $dir; + $file_path =~ s/\//\\/g; + } + + # print "File path: $file_path\n"; + + my $module_name = $mmp_file; + $module_name =~ s/.*\\([^\.]*).*/$1/; + + # print "Module name: $module_name\n"; + + my $uid = 0; + my $current_src_path; + + if (-e $mmp_file) + { + debug("getSourceFiles MMP file exists"); + # Go through lines + open FILE, "<$mmp_file" or die $!; + foreach my $line () + { + $line =~ s/\//\\/g; + + # Find uid + if ($line =~ /uid.+0x([a-fA-F0-9]+)?/i) + { + $uid = $1; + debug("getSourceFiles Found UID: $uid"); + # print "Uid: $uid\n"; + } + + # Find source path + if ($line =~ /sourcepath\s+([^\s]+)/i) + { + my $src_path = $1; + + # Check absolute path + if ($src_path =~ /^[^\\]/) + { + $current_src_path = concatenatePath($file_path, $src_path . "\\"); + } + else + { + $current_src_path = substr($file_path, 0, 2) . $src_path; + } + + debug("getSourceFiles current src path: $current_src_path"); + # print "Current src path: $current_src_path\n"; + } + + while ($line =~ /source\s+([^\s]+)/i) + { + my $src = $1; + + my $src_path = concatenatePath($current_src_path, $src); + + if (-e $src_path) + { + push (@sources, $src_path); + debug("getSourceFiles found source: $src_path"); + # print "SRC: $src_path\n"; + } + + $line =~ s/\Q$src//; + } + } + close FILE; + + } + } + + return @sources; +} + +#-------------------------------------------------------------- +# Get operation +#-------------------------------------------------------------- +sub get_operation +{ + print "\nSelect operation:\n"; + print "Convert Symbian traces to OST traces (1)\n"; + print "Convert Kern::Printf traces to OST traces (2)\n"; + print "Convert RDebug::Printf traces to OST traces (3)\n"; + print "Convert own MACRO to OST traces (4)\n"; + print "Convert OST traces to Kern::Printf traces (5)\n"; + print "Convert OST traces to RDebug::Printf traces (6)\n"; + + my $selection = ; + chomp $selection; + + if ($selection != 1 and + $selection != 2 and + $selection != 3 and + $selection != 4 and + $selection != 5 and + $selection != 6) + { + print STDERR "Invalid input!\n"; + die; + } + + if ($selection == 4) + { + print "\nGive the macro name (e.g. \"TRACE\" if your maco is like TRACE(\"Text\")\n"; + $selection = ; + chomp $selection; + } + + return $selection; +} + +#-------------------------------------------------------------- +# Get traces folder +#-------------------------------------------------------------- +sub get_traces_folder +{ + my $traces_folder; + + if (not defined $traces_folder and getGroupTraceData(\%map_trace_to_group, \%map_trace_to_text, \%map_trace_to_parameters, "..\\..\\traces")) + { + $traces_folder = "..\\..\\traces"; + } + + if (not defined $traces_folder and getGroupTraceData(\%map_trace_to_group, \%map_trace_to_text, \%map_trace_to_parameters, "..\\traces")) + { + $traces_folder = "..\\traces"; + } + + if (not defined $traces_folder and getGroupTraceData(\%map_trace_to_group, \%map_trace_to_text, \%map_trace_to_parameters, "..\\..\\symbian_traces\\autogen")) + { + $traces_folder = "..\\..\\symbian_traces\\autogen"; + } + + if (not defined $traces_folder and getGroupTraceData(\%map_trace_to_group, \%map_trace_to_text, \%map_trace_to_parameters, "..\\..\\..\\symbian_traces\\autogen")) + { + $traces_folder = "..\\..\\..\\symbian_traces\\autogen"; + } + + if (not defined $traces_folder and getGroupTraceData(\%map_trace_to_group, \%map_trace_to_text, \%map_trace_to_parameters, "..\\..\\..\\..\\symbian_traces\\autogen")) + { + $traces_folder = "..\\..\\..\\..\\symbian_traces\\autogen"; + } + + if (not defined $traces_folder and getGroupTraceData(\%map_trace_to_group, \%map_trace_to_text, \%map_trace_to_parameters, "..\\..\\autogen")) + { + $traces_folder = "..\\..\\autogen"; + } + + if (not defined $traces_folder and getGroupTraceData(\%map_trace_to_group, \%map_trace_to_text, \%map_trace_to_parameters, "..\\..\\..\\autogen")) + { + $traces_folder = "..\\..\\..\\autogen"; + } + + if (not defined $traces_folder and getGroupTraceData(\%map_trace_to_group, \%map_trace_to_text, \%map_trace_to_parameters, "..\\..\\..\\..\\autogen")) + { + $traces_folder = "..\\..\\..\\..\\autogen"; + } + + if (not defined $traces_folder) + { + print STDERR "Cannot find traces folder..."; + exit; + } + return $traces_folder; +} + + +#------------------------------------------------------- +# Concatenate path +#------------------------------------------------------- +sub concatenatePath +{ + my ($concatenatePathBase, $concatenatePathFile) = @_; + + my $backCount = 0; + + # Find how many back references there are and remove them + while ($concatenatePathFile =~ /\.\.\\/g) + { + $backCount++ + } + $concatenatePathFile =~ s/\.\.\\//g; + + # If there is \ in the end of the base remove it + my $lastChar = chop($concatenatePathBase); + if ($lastChar ne "\\") + { + $concatenatePathBase = "$concatenatePathBase$lastChar"; + } + + # Remove directories from the end of the path + $concatenatePathBase = reverse($concatenatePathBase); + for (my $i=0; $i<$backCount; $i++) + { + $concatenatePathBase =~ s/.*?\\//; + } + $concatenatePathBase = reverse($concatenatePathBase); + + my $concatenatePathFullFilePath = "$concatenatePathBase\\$concatenatePathFile"; + + return $concatenatePathFullFilePath; +} + + +#------------------------------------------------------- +# Debug print +#------------------------------------------------------- +sub debug +{ + my ($print) = @_; + + if ($DEBUG) + { + print $print . "\n"; + } +} + +warn "\n"; +warn "Warning: this script is not supported and the Dynamic Analysis Tools team\n"; +warn "does NOT promise to fix any bugs or add any functionality to it.\n"; +warn "\n"; \ No newline at end of file