summaryrefslogtreecommitdiffstats
path: root/binutils-2.24/bfd/mep-relocs.pl
diff options
context:
space:
mode:
Diffstat (limited to 'binutils-2.24/bfd/mep-relocs.pl')
-rwxr-xr-xbinutils-2.24/bfd/mep-relocs.pl275
1 files changed, 0 insertions, 275 deletions
diff --git a/binutils-2.24/bfd/mep-relocs.pl b/binutils-2.24/bfd/mep-relocs.pl
deleted file mode 100755
index a4f10d38..00000000
--- a/binutils-2.24/bfd/mep-relocs.pl
+++ /dev/null
@@ -1,275 +0,0 @@
-#!/usr/bin/perl
-# -*- perl -*-
-#
-# Toshiba MeP Media Engine Relocation Generator
-# Copyright (C) 2001, 2007 Free Software Foundation, Inc.
-# This file is part of BFD.
-# Originally written by DJ Delorie <dj@redhat.com>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-# MA 02110-1301, USA.
-
-
-# Usage: Run this anywhere inside your source tree. It will read
-# include/elf/mep.h and scan the comments therein. It will renumber
-# the relocs to be sequential (this is needed so that bfd/elf32-mep.h
-# works) if needed. It will then update the reloc list in bfd/reloc.c
-# and the howto, mapping, and apply routines in bfd/elf32-mep.c. You
-# can then regenerate bfd-in2.h and check everything in.
-
-# FIXME: After the relocation list is finalized, change this to
-# *verify* the reloc list, rather than resequence it.
-
-while (! -f "include/elf/mep.h" && ! -f "bfd/reloc.c") {
- chdir "..";
- $pwd = `pwd`;
- if ($pwd !~ m@/.*/@) {
- print STDERR "Cannot find include/elf/mep.h or bfd/reloc.h\n";
- exit 1;
- }
-}
-$pwd = `pwd`;
-print "srctop is $pwd";
-
-printf "Reading include/elf/mep.h ...\n";
-open(MEPH, "include/elf/mep.h");
-open(MEPHO, "> include/elf/mep.h.new") || die("mep.h.new create: $!");
-$val = 0;
-while (<MEPH>) {
- if (($pre,$rel,$rest) = /(.*RELOC_NUMBER \()([^,]+), *\d+(.*)/) {
- $rest =~ s/[\r\n]+$//;
- print (MEPHO "$pre$rel, $val$rest\n") || die("mep.h.new write: $!");
- $val ++;
- $rel =~ s/R_MEP_//;
- push(@relocs, $rel);
-
- $rest =~ s@.*/\* @@;
- ($pattern, $sign, $attrs) = $rest =~ m@(.*) ([US]) (.*)\*/@;
- $pattern =~ s/ //g;
- push(@pattern, $pattern);
- push(@sign, $sign);
- push(@attrs, $attrs);
-
- printf "%4d $rel p=`$pattern' s=`$sign' a=`$attrs'\n", $#pattern;
-
- } else {
- print(MEPHO) || die("mep.h.new write: $!");
- }
-}
-close(MEPH);
-close(MEPHO) || die("mep.h.new close: $!");
-
-&swapfile("include/elf/mep.h");
-
-redo_file ("bfd/reloc.c",
- "",
- "ENUMDOC\n Toshiba Media Processor Relocations.\n\nCOMMENT\n",
- "ENUM\n BFD_RELOC_MEP_%s\n",
- "");
-
-$autogen = " /* This section generated from bfd/mep-relocs.pl from include/elf/mep.h. */\n";
-
-redo_file ("bfd/elf32-mep.c",
- "MEPRELOC:HOWTO",
- $autogen,
- "MEPRELOC:END",
- "",
- "&emit_howto();",
- "MEPRELOC:MAP",
- $autogen,
- "MEPRELOC:END",
- "",
- " MAP(%s);\n",
- "MEPRELOC:APPLY",
- $autogen,
- "MEPRELOC:END",
- "",
- "&emit_apply();",
- );
-
-sub mask2shifts {
- my ($mask) = @_;
- my ($bits, $left, $right, $ci, $c, $cv);
- $bits = 0;
- $left = 0;
- $right = 32;
- for ($ci=0; $ci<length($mask); $ci++) {
- $c = substr($mask, $ci, 1);
- $left++;
- next if $c eq '-';
- $left = 0;
- $cv = ord($c) - ord('0');
- $cv -= ord('a') - ord('9') - 1 if $cv > 9;
- $right = $cv unless $right < $cv;
- $bits = $cv+1 unless $bits > $cv+1;
- }
- $mask =~ tr/-/1/c;
- $mask =~ tr/-/0/;
- ($rmask = $mask) =~ tr/01/10/;
- $mask = unpack("H*", pack("B*", $mask));
- $rmask = unpack("H*", pack("B*", $rmask));
- return ($bits, $left, $right, $mask, $rmask);
-}
-
-sub emit_howto {
- for ($i=2; $i<=$#relocs; $i++) {
- $mask = $pattern[$i];
-
- if (length($mask) == 8) { $bytesize = 0; }
- elsif (length($mask) == 16) { $bytesize = 1; }
- elsif (length($mask) == 32) { $bytesize = 2; }
-
- ($bits, $left, $right, $mask) = mask2shifts ($mask);
- $bits[$i] = $bits;
- $pcrel = 0;
- $pcrel = 1 if $attrs[$i] =~ /pc-rel/i;
- $overflow = $sign[$i];
- $overflow = 'N' if $attrs[$i] =~ /no-overflow/;
-
- $c = "$relocs[$i],";
- printf(NEW " MEPREL (R_MEP_%-10s%d,%3d,%2d,%2d,%2d,%2s, 0x%s),\n",
- $c, $bytesize, $bits, $left, $right, $pcrel, $overflow, $mask);
- }
-}
-
-sub emit_apply {
- for ($i=2; $i<=$#relocs; $i++) {
- $v = "u";
- $v = "s" if $sign[$i] =~ /S/;
- if (length($pattern[$i]) == 8) {
- $e = ''; # no endian swap for bytes
- } elsif ($pattern[$i] =~ /-/ || length($pattern[$i]) == 16) {
- $e = '^e2'; # endian swap - 2byte words only
- } else {
- $e = '^e4' # endian swap for data
- }
- print NEW " case R_MEP_$relocs[$i]: /* $pattern[$i] */\n";
- if ($attrs[$i] =~ /tp-rel/i) {
- print NEW " $v -= mep_tpoff_base(rel->r_offset);\n";
- }
- if ($attrs[$i] =~ /gp-rel/i) {
- print NEW " $v -= mep_sdaoff_base(rel->r_offset);\n";
- }
- if ($attrs[$i] !~ /no-overflow/ && $bits[$i] < 32) {
- if ($v eq "u") {
- $max = (1 << $bits[$i]) - 1;
- print NEW " if (u > $max) r = bfd_reloc_overflow;\n";
- } else {
- $min = -(1 << ($bits[$i]-1));
- $max = (1 << ($bits[$i]-1)) - 1;
- print NEW " if ($min > s || s > $max) r = bfd_reloc_overflow;\n";
- }
- }
- for ($b=0; $b<length($pattern[$i]); $b += 8) {
- $mask = substr($pattern[$i], $b, 8);
- ($bits, $left, $right, $mask, $rmask) = mask2shifts ($mask);
- if ($left > $right) { $left -= $right; $right = 0; }
- else { $right -= $left; $left = 0; }
-
- if ($mask ne "00") {
- $bb = $b / 8;
- print NEW " byte[$bb$e] = ";
- print NEW "(byte[$bb$e] & 0x$rmask) | " if $rmask ne "00";
- if ($left) {
- print NEW "(($v << $left) & 0x$mask)";
- } elsif ($right) {
- print NEW "(($v >> $right) & 0x$mask)";
- } else {
- print NEW "($v & 0x$mask)";
- }
- print NEW ";\n";
- }
- }
- print NEW " break;\n";
- }
-}
-
-
-#-----------------------------------------------------------------------------
-
-sub redo_file {
- my ($file, @control) = @_;
- open(OLD, $file);
- open(NEW, "> $file.new") || die("$file.new create: $!");
-
- print "Scanning file $file ...\n";
-
- while (1) {
- $start = shift @control;
- $prefix = shift @control;
- $end = shift @control;
- $suffix = shift @control;
- $pattern = shift @control;
-
- if (!$start) {
- print NEW while <OLD>;
- last;
- }
-
- print " looking for $start\n";
- while (<OLD>) {
- print NEW;
- last if /\Q$start\E/;
- }
- print "can't find $start\n" unless $_;
- last unless $_;
-
- print NEW $prefix;
- if ($pattern =~ /^\&/) {
- eval $pattern;
- die("$pattern: $@") if $@;
- } else {
- for $i (2..$#relocs) {
- printf (NEW "$pattern", $relocs[$i]) || die("$file.new write: $!");
- $pattern =~ s/^ENUM\n/ENUMX\n/;
- }
- }
- print NEW $suffix;
- while (<OLD>) {
- last if /\Q$end\E/;
- }
- print NEW;
- }
-
- close(OLD);
- close(NEW) || die("$file.new close: $!");
- &swapfile($file);
-}
-
-#-----------------------------------------------------------------------------
-
-sub swapfile {
- my ($f) = @_;
- if ( ! -f "$f.save") {
- system "cp $f $f.save";
- }
- open(ORIG, $f);
- open(NEW, "$f.new");
- while (<ORIG>) {
- $n = <NEW>;
- if ($n ne $_) {
- close(ORIG);
- close(NEW);
- print " Updating $f\n";
- rename "$f", "$f.old";
- rename "$f.new", "$f";
- return;
- }
- }
- close(ORIG);
- close(NEW);
- print " No change to $f\n";
- unlink "$f.new";
-}