X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=binutils%2Funwind-ia64.c;h=43c1b0f4c29639ab65f8bf847130703ec0afa177;hb=128e85e3ab36b8e30f6612fb50de3cbb4ede6824;hp=c104e72bbc193c69d8644c5714bd7cf3485d004d;hpb=09ff3500dcb85937d40ab3cd4be9ad8329ed9247;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/unwind-ia64.c b/binutils/unwind-ia64.c index c104e72bbc..43c1b0f4c2 100644 --- a/binutils/unwind-ia64.c +++ b/binutils/unwind-ia64.c @@ -1,23 +1,26 @@ /* unwind-ia64.c -- utility routines to dump IA-64 unwind info for readelf. - Copyright 2000, 2001, 2002, 2003 Free Software Foundation, Inc. - Contributed by David Mosberger-Tang + Copyright (C) 2000-2016 Free Software Foundation, Inc. -This file is part of GNU Binutils. + Contributed by David Mosberger-Tang -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 2, or (at your option) -any later version. + This file is part of GNU Binutils. -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. + 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, or (at your option) + any later version. -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + 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, 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#include "config.h" #include "unwind-ia64.h" #include #include @@ -111,7 +114,7 @@ unw_print_frmask (char *cp, unsigned int mask) static void unw_print_abreg (char *cp, unsigned int abreg) { - static const char *special_reg[16] = + static const char * const special_reg[16] = { "pr", "psp", "@priunat", "rp", "ar.bsp", "ar.bspstore", "ar.rnat", "ar.unat", "ar.fpsr", "ar.pfs", "ar.lc", @@ -302,7 +305,7 @@ typedef bfd_vma unw_word; #define UNW_DEC_ABI(fmt, abi, context, arg) \ do \ { \ - static const char *abiname[] = \ + static const char * const abiname[] = \ { \ "@svr4", "@hpux", "@nt" \ }; \ @@ -346,14 +349,22 @@ typedef bfd_vma unw_word; printf ("\t%s:spill_base(pspoff=0x10-0x%lx)\n", \ fmt, 4*(unsigned long)pspoff) -#define UNW_DEC_SPILL_MASK(fmt, dp, arg) \ - do \ - { \ - static const char *spill_type = "-frb"; \ +#define UNW_DEC_SPILL_MASK(fmt, dp, arg, end) \ + do \ + { \ + static const char *spill_type = "-frb"; \ unsigned const char *imaskp = dp; \ - unsigned char mask = 0; \ - bfd_vma insn = 0; \ - \ + unsigned char mask = 0; \ + bfd_vma insn = 0; \ + \ + /* PR 18420. */ \ + if ((dp + (unw_rlen / 4)) > end) \ + { \ + printf ("\nERROR: unwind length too long (0x%lx > 0x%lx)\n\n",\ + (long) (unw_rlen / 4), (long)(end - dp)); \ + /* FIXME: Should we reset unw_rlen ? */ \ + break; \ + } \ printf ("\t%s:spill_mask(imask=[", fmt); \ for (insn = 0; insn < unw_rlen; ++insn) \ { \ @@ -530,36 +541,6 @@ typedef bfd_vma unw_word; * UNW_DEC_SPILL_SPREL_P(fmt,qp,t,abreg,pspoff,arg) */ -static unw_word unw_decode_uleb128 (const unsigned char **); -static const unsigned char *unw_decode_x1 - (const unsigned char *, unsigned int, void *); -static const unsigned char *unw_decode_x2 - (const unsigned char *, unsigned int, void *); -static const unsigned char *unw_decode_x3 - (const unsigned char *, unsigned int, void *); -static const unsigned char *unw_decode_x4 - (const unsigned char *, unsigned int, void *); -static const unsigned char *unw_decode_r1 - (const unsigned char *, unsigned int, void *); -static const unsigned char *unw_decode_r2 - (const unsigned char *, unsigned int, void *); -static const unsigned char *unw_decode_r3 - (const unsigned char *, unsigned int, void *); -static const unsigned char *unw_decode_p1 - (const unsigned char *, unsigned int, void *); -static const unsigned char *unw_decode_p2_p5 - (const unsigned char *, unsigned int, void *); -static const unsigned char *unw_decode_p6 - (const unsigned char *, unsigned int, void *); -static const unsigned char *unw_decode_p7_p10 - (const unsigned char *, unsigned int, void *); -static const unsigned char *unw_decode_b1 - (const unsigned char *, unsigned int, void *); -static const unsigned char *unw_decode_b2 - (const unsigned char *, unsigned int, void *); -static const unsigned char *unw_decode_b3_x4 - (const unsigned char *, unsigned int, void *); - static unw_word unw_decode_uleb128 (const unsigned char **dpp) { @@ -668,7 +649,8 @@ unw_decode_x4 (const unsigned char *dp, unsigned int code ATTRIBUTE_UNUSED, } static const unsigned char * -unw_decode_r1 (const unsigned char *dp, unsigned int code, void *arg) +unw_decode_r1 (const unsigned char *dp, unsigned int code, void *arg, + const unsigned char * end ATTRIBUTE_UNUSED) { int body = (code & 0x20) != 0; unw_word rlen; @@ -679,7 +661,8 @@ unw_decode_r1 (const unsigned char *dp, unsigned int code, void *arg) } static const unsigned char * -unw_decode_r2 (const unsigned char *dp, unsigned int code, void *arg) +unw_decode_r2 (const unsigned char *dp, unsigned int code, void *arg, + const unsigned char * end ATTRIBUTE_UNUSED) { unsigned char byte1, mask, grsave; unw_word rlen; @@ -694,7 +677,8 @@ unw_decode_r2 (const unsigned char *dp, unsigned int code, void *arg) } static const unsigned char * -unw_decode_r3 (const unsigned char *dp, unsigned int code, void *arg) +unw_decode_r3 (const unsigned char *dp, unsigned int code, void *arg, + const unsigned char * end ATTRIBUTE_UNUSED) { unw_word rlen; @@ -705,7 +689,8 @@ unw_decode_r3 (const unsigned char *dp, unsigned int code, void *arg) static const unsigned char * unw_decode_p1 (const unsigned char *dp, unsigned int code, - void *arg ATTRIBUTE_UNUSED) + void *arg ATTRIBUTE_UNUSED, + const unsigned char * end ATTRIBUTE_UNUSED) { unsigned char brmask = (code & 0x1f); @@ -715,7 +700,8 @@ unw_decode_p1 (const unsigned char *dp, unsigned int code, static const unsigned char * unw_decode_p2_p5 (const unsigned char *dp, unsigned int code, - void *arg ATTRIBUTE_UNUSED) + void *arg ATTRIBUTE_UNUSED, + const unsigned char * end) { if ((code & 0x10) == 0) { @@ -774,7 +760,7 @@ unw_decode_p2_p5 (const unsigned char *dp, unsigned int code, } } else if ((code & 0x7) == 0) - UNW_DEC_SPILL_MASK ("P4", dp, arg); + UNW_DEC_SPILL_MASK ("P4", dp, arg, end); else if ((code & 0x7) == 1) { unw_word grmask, frmask, byte1, byte2, byte3; @@ -794,7 +780,8 @@ unw_decode_p2_p5 (const unsigned char *dp, unsigned int code, static const unsigned char * unw_decode_p6 (const unsigned char *dp, unsigned int code, - void *arg ATTRIBUTE_UNUSED) + void *arg ATTRIBUTE_UNUSED, + const unsigned char * end ATTRIBUTE_UNUSED) { int gregs = (code & 0x10) != 0; unsigned char mask = (code & 0x0f); @@ -807,7 +794,8 @@ unw_decode_p6 (const unsigned char *dp, unsigned int code, } static const unsigned char * -unw_decode_p7_p10 (const unsigned char *dp, unsigned int code, void *arg) +unw_decode_p7_p10 (const unsigned char *dp, unsigned int code, void *arg, + const unsigned char * end ATTRIBUTE_UNUSED) { unsigned char r, byte1, byte2; unw_word t, size; @@ -981,7 +969,8 @@ unw_decode_p7_p10 (const unsigned char *dp, unsigned int code, void *arg) static const unsigned char * unw_decode_b1 (const unsigned char *dp, unsigned int code, - void *arg ATTRIBUTE_UNUSED) + void *arg ATTRIBUTE_UNUSED, + const unsigned char * end ATTRIBUTE_UNUSED) { unw_word label = (code & 0x1f); @@ -994,7 +983,8 @@ unw_decode_b1 (const unsigned char *dp, unsigned int code, static const unsigned char * unw_decode_b2 (const unsigned char *dp, unsigned int code, - void *arg ATTRIBUTE_UNUSED) + void *arg ATTRIBUTE_UNUSED, + const unsigned char * end ATTRIBUTE_UNUSED) { unw_word t; @@ -1004,7 +994,8 @@ unw_decode_b2 (const unsigned char *dp, unsigned int code, } static const unsigned char * -unw_decode_b3_x4 (const unsigned char *dp, unsigned int code, void *arg) +unw_decode_b3_x4 (const unsigned char *dp, unsigned int code, void *arg, + const unsigned char * end ATTRIBUTE_UNUSED) { unw_word t, ecount, label; @@ -1041,9 +1032,9 @@ unw_decode_b3_x4 (const unsigned char *dp, unsigned int code, void *arg) } typedef const unsigned char *(*unw_decoder) - (const unsigned char *, unsigned int, void *); + (const unsigned char *, unsigned int, void *, const unsigned char *); -static unw_decoder unw_decode_table[2][8] = +static const unw_decoder unw_decode_table[2][8] = { /* prologue table: */ { @@ -1071,12 +1062,12 @@ static unw_decoder unw_decode_table[2][8] = /* Decode one descriptor and return address of next descriptor. */ const unsigned char * unw_decode (const unsigned char *dp, int inside_body, - void *ptr_inside_body) + void *ptr_inside_body, const unsigned char * end) { unw_decoder decoder; unsigned char code; code = *dp++; decoder = unw_decode_table[inside_body][code >> 5]; - return (*decoder) (dp, code, ptr_inside_body); + return (*decoder) (dp, code, ptr_inside_body, end); }