summaryrefslogtreecommitdiffstats
path: root/scripts/recordmcount.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/recordmcount.pl')
-rwxr-xr-xscripts/recordmcount.pl28
1 files changed, 24 insertions, 4 deletions
diff --git a/scripts/recordmcount.pl b/scripts/recordmcount.pl
index f56d760bd58..6b9fe3eb836 100755
--- a/scripts/recordmcount.pl
+++ b/scripts/recordmcount.pl
@@ -106,7 +106,13 @@ if ($#ARGV < 6) {
exit(1);
}
-my ($arch, $objdump, $objcopy, $cc, $ld, $nm, $rm, $mv, $inputfile) = @ARGV;
+my ($arch, $bits, $objdump, $objcopy, $cc,
+ $ld, $nm, $rm, $mv, $inputfile) = @ARGV;
+
+# Acceptable sections to record.
+my %text_sections = (
+ ".text" => 1,
+);
$objdump = "objdump" if ((length $objdump) == 0);
$objcopy = "objcopy" if ((length $objcopy) == 0);
@@ -129,8 +135,16 @@ my $function_regex; # Find the name of a function
# (return offset and func name)
my $mcount_regex; # Find the call site to mcount (return offset)
+if ($arch eq "x86") {
+ if ($bits == 64) {
+ $arch = "x86_64";
+ } else {
+ $arch = "i386";
+ }
+}
+
if ($arch eq "x86_64") {
- $section_regex = "Disassembly of section";
+ $section_regex = "Disassembly of section\\s+(\\S+):";
$function_regex = "^([0-9a-fA-F]+)\\s+<(.*?)>:";
$mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\smcount([+-]0x[0-9a-zA-Z]+)?\$";
$type = ".quad";
@@ -142,7 +156,7 @@ if ($arch eq "x86_64") {
$cc .= " -m64";
} elsif ($arch eq "i386") {
- $section_regex = "Disassembly of section";
+ $section_regex = "Disassembly of section\\s+(\\S+):";
$function_regex = "^([0-9a-fA-F]+)\\s+<(.*?)>:";
$mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\smcount\$";
$type = ".long";
@@ -289,7 +303,13 @@ my $text;
while (<IN>) {
# is it a section?
if (/$section_regex/) {
- $read_function = 1;
+
+ # Only record text sections that we know are safe
+ if (defined($text_sections{$1})) {
+ $read_function = 1;
+ } else {
+ $read_function = 0;
+ }
# print out any recorded offsets
update_funcs() if ($text_found);