OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [libiberty/] [testsuite/] [test-demangle.c] - Diff between revs 21 and 161

Only display areas with differences | Details | Blame | View Log

Rev 21 Rev 161
/* Demangler test program,
/* Demangler test program,
   Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
   Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
   Written by Zack Weinberg <zack@codesourcery.com
   Written by Zack Weinberg <zack@codesourcery.com
 
 
   This file is part of GNU libiberty.
   This file is part of GNU libiberty.
 
 
   This program is free software; you can redistribute it and/or modify
   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
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.
   (at your option) any later version.
 
 
   This program is distributed in the hope that it will be useful,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License for more details.
 
 
   You should have received a copy of the GNU General Public License
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   along with this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
*/
 
 
#ifdef HAVE_CONFIG_H
#ifdef HAVE_CONFIG_H
#include "config.h"
#include "config.h"
#endif
#endif
#include "ansidecl.h"
#include "ansidecl.h"
#include <stdio.h>
#include <stdio.h>
#include "libiberty.h"
#include "libiberty.h"
#include "demangle.h"
#include "demangle.h"
#ifdef HAVE_STRING_H
#ifdef HAVE_STRING_H
#include <string.h>
#include <string.h>
#endif
#endif
#if HAVE_STDLIB_H
#if HAVE_STDLIB_H
# include <stdlib.h>
# include <stdlib.h>
#endif
#endif
 
 
struct line
struct line
{
{
  size_t alloced;
  size_t alloced;
  char *data;
  char *data;
};
};
 
 
static unsigned int lineno;
static unsigned int lineno;
 
 
/* Safely read a single line of arbitrary length from standard input.  */
/* Safely read a single line of arbitrary length from standard input.  */
 
 
#define LINELEN 80
#define LINELEN 80
 
 
static void
static void
get_line(buf)
get_line(buf)
     struct line *buf;
     struct line *buf;
{
{
  char *data = buf->data;
  char *data = buf->data;
  size_t alloc = buf->alloced;
  size_t alloc = buf->alloced;
  size_t count = 0;
  size_t count = 0;
  int c;
  int c;
 
 
  if (data == 0)
  if (data == 0)
    {
    {
      data = xmalloc (LINELEN);
      data = xmalloc (LINELEN);
      alloc = LINELEN;
      alloc = LINELEN;
    }
    }
 
 
  /* Skip comment lines.  */
  /* Skip comment lines.  */
  while ((c = getchar()) == '#')
  while ((c = getchar()) == '#')
    {
    {
      while ((c = getchar()) != EOF && c != '\n');
      while ((c = getchar()) != EOF && c != '\n');
      lineno++;
      lineno++;
    }
    }
 
 
  /* c is the first character on the line, and it's not a comment
  /* c is the first character on the line, and it's not a comment
     line: copy this line into the buffer and return.  */
     line: copy this line into the buffer and return.  */
  while (c != EOF && c != '\n')
  while (c != EOF && c != '\n')
    {
    {
      if (count + 1 >= alloc)
      if (count + 1 >= alloc)
        {
        {
          alloc *= 2;
          alloc *= 2;
          data = xrealloc (data, alloc);
          data = xrealloc (data, alloc);
        }
        }
      data[count++] = c;
      data[count++] = c;
      c = getchar();
      c = getchar();
    }
    }
  lineno++;
  lineno++;
  data[count] = '\0';
  data[count] = '\0';
 
 
  buf->data = data;
  buf->data = data;
  buf->alloced = alloc;
  buf->alloced = alloc;
}
}
 
 
/* If we have mmap() and mprotect(), copy the string S just before a
/* If we have mmap() and mprotect(), copy the string S just before a
   protected page, so that if the demangler runs over the end of the
   protected page, so that if the demangler runs over the end of the
   string we'll get a fault, and return the address of the new string.
   string we'll get a fault, and return the address of the new string.
   If no mmap, or it fails, or it looks too hard, just return S.  */
   If no mmap, or it fails, or it looks too hard, just return S.  */
 
 
#ifdef HAVE_SYS_MMAN_H
#ifdef HAVE_SYS_MMAN_H
#include <sys/mman.h>
#include <sys/mman.h>
#endif
#endif
#if defined(MAP_ANON) && ! defined (MAP_ANONYMOUS)
#if defined(MAP_ANON) && ! defined (MAP_ANONYMOUS)
#define MAP_ANONYMOUS MAP_ANON
#define MAP_ANONYMOUS MAP_ANON
#endif
#endif
 
 
static const char *
static const char *
protect_end (const char * s)
protect_end (const char * s)
{
{
#if defined(HAVE_MMAP) && defined (MAP_ANONYMOUS)
#if defined(HAVE_MMAP) && defined (MAP_ANONYMOUS)
  size_t pagesize = getpagesize();
  size_t pagesize = getpagesize();
  static char * buf;
  static char * buf;
  size_t s_len = strlen (s);
  size_t s_len = strlen (s);
  char * result;
  char * result;
 
 
  /* Don't try if S is too long.  */
  /* Don't try if S is too long.  */
  if (s_len >= pagesize)
  if (s_len >= pagesize)
    return s;
    return s;
 
 
  /* Allocate one page of allocated space followed by an unmapped
  /* Allocate one page of allocated space followed by an unmapped
     page.  */
     page.  */
  if (buf == NULL)
  if (buf == NULL)
    {
    {
      buf = mmap (NULL, pagesize * 2, PROT_READ | PROT_WRITE,
      buf = mmap (NULL, pagesize * 2, PROT_READ | PROT_WRITE,
                  MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
                  MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
      if (! buf)
      if (! buf)
        return s;
        return s;
      munmap (buf + pagesize, pagesize);
      munmap (buf + pagesize, pagesize);
    }
    }
 
 
  result = buf + (pagesize - s_len - 1);
  result = buf + (pagesize - s_len - 1);
  memcpy (result, s, s_len + 1);
  memcpy (result, s, s_len + 1);
  return result;
  return result;
#else
#else
  return s;
  return s;
#endif
#endif
}
}
 
 
static void
static void
fail (lineno, opts, in, out, exp)
fail (lineno, opts, in, out, exp)
     int lineno;
     int lineno;
     const char *opts;
     const char *opts;
     const char *in;
     const char *in;
     const char *out;
     const char *out;
     const char *exp;
     const char *exp;
{
{
  printf ("\
  printf ("\
FAIL at line %d, options %s:\n\
FAIL at line %d, options %s:\n\
in:  %s\n\
in:  %s\n\
out: %s\n\
out: %s\n\
exp: %s\n",
exp: %s\n",
          lineno, opts, in, out != NULL ? out : "(null)", exp);
          lineno, opts, in, out != NULL ? out : "(null)", exp);
}
}
 
 
/* The tester operates on a data file consisting of groups of lines:
/* The tester operates on a data file consisting of groups of lines:
   options
   options
   input to be demangled
   input to be demangled
   expected output
   expected output
 
 
   Supported options:
   Supported options:
     --format=<name>     Sets the demangling style.
     --format=<name>     Sets the demangling style.
     --no-params         There are two lines of expected output; the first
     --no-params         There are two lines of expected output; the first
                         is with DMGL_PARAMS, the second is without it.
                         is with DMGL_PARAMS, the second is without it.
     --is-v3-ctor        Calls is_gnu_v3_mangled_ctor on input; expected
     --is-v3-ctor        Calls is_gnu_v3_mangled_ctor on input; expected
                         output is an integer representing ctor_kind.
                         output is an integer representing ctor_kind.
     --is-v3-dtor        Likewise, but for dtors.
     --is-v3-dtor        Likewise, but for dtors.
     --ret-postfix       Passes the DMGL_RET_POSTFIX option
     --ret-postfix       Passes the DMGL_RET_POSTFIX option
 
     --ret-drop          Passes the DMGL_RET_DROP option
 
 
   For compatibility, just in case it matters, the options line may be
   For compatibility, just in case it matters, the options line may be
   empty, to mean --format=auto.  If it doesn't start with --, then it
   empty, to mean --format=auto.  If it doesn't start with --, then it
   may contain only a format name.
   may contain only a format name.
*/
*/
 
 
int
int
main(argc, argv)
main(argc, argv)
     int argc;
     int argc;
     char **argv;
     char **argv;
{
{
  enum demangling_styles style = auto_demangling;
  enum demangling_styles style = auto_demangling;
  int no_params;
  int no_params;
  int is_v3_ctor;
  int is_v3_ctor;
  int is_v3_dtor;
  int is_v3_dtor;
  int ret_postfix;
  int ret_postfix, ret_drop;
  struct line format;
  struct line format;
  struct line input;
  struct line input;
  struct line expect;
  struct line expect;
  char *result;
  char *result;
  int failures = 0;
  int failures = 0;
  int tests = 0;
  int tests = 0;
 
 
  if (argc > 1)
  if (argc > 1)
    {
    {
      fprintf (stderr, "usage: %s < test-set\n", argv[0]);
      fprintf (stderr, "usage: %s < test-set\n", argv[0]);
      return 2;
      return 2;
    }
    }
 
 
  format.data = 0;
  format.data = 0;
  input.data = 0;
  input.data = 0;
  expect.data = 0;
  expect.data = 0;
 
 
  for (;;)
  for (;;)
    {
    {
      const char *inp;
      const char *inp;
 
 
      get_line (&format);
      get_line (&format);
      if (feof (stdin))
      if (feof (stdin))
        break;
        break;
 
 
      get_line (&input);
      get_line (&input);
      get_line (&expect);
      get_line (&expect);
 
 
      inp = protect_end (input.data);
      inp = protect_end (input.data);
 
 
      tests++;
      tests++;
 
 
      no_params = 0;
      no_params = 0;
      ret_postfix = 0;
      ret_postfix = 0;
 
      ret_drop = 0;
      is_v3_ctor = 0;
      is_v3_ctor = 0;
      is_v3_dtor = 0;
      is_v3_dtor = 0;
      if (format.data[0] == '\0')
      if (format.data[0] == '\0')
        style = auto_demangling;
        style = auto_demangling;
      else if (format.data[0] != '-')
      else if (format.data[0] != '-')
        {
        {
          style = cplus_demangle_name_to_style (format.data);
          style = cplus_demangle_name_to_style (format.data);
          if (style == unknown_demangling)
          if (style == unknown_demangling)
            {
            {
              printf ("FAIL at line %d: unknown demangling style %s\n",
              printf ("FAIL at line %d: unknown demangling style %s\n",
                      lineno, format.data);
                      lineno, format.data);
              failures++;
              failures++;
              continue;
              continue;
            }
            }
        }
        }
      else
      else
        {
        {
          char *p;
          char *p;
          char *opt;
          char *opt;
 
 
          p = format.data;
          p = format.data;
          while (*p != '\0')
          while (*p != '\0')
            {
            {
              char c;
              char c;
 
 
              opt = p;
              opt = p;
              p += strcspn (p, " \t=");
              p += strcspn (p, " \t=");
              c = *p;
              c = *p;
              *p = '\0';
              *p = '\0';
              if (strcmp (opt, "--format") == 0 && c == '=')
              if (strcmp (opt, "--format") == 0 && c == '=')
                {
                {
                  char *fstyle;
                  char *fstyle;
 
 
                  *p = c;
                  *p = c;
                  ++p;
                  ++p;
                  fstyle = p;
                  fstyle = p;
                  p += strcspn (p, " \t");
                  p += strcspn (p, " \t");
                  c = *p;
                  c = *p;
                  *p = '\0';
                  *p = '\0';
                  style = cplus_demangle_name_to_style (fstyle);
                  style = cplus_demangle_name_to_style (fstyle);
                  if (style == unknown_demangling)
                  if (style == unknown_demangling)
                    {
                    {
                      printf ("FAIL at line %d: unknown demangling style %s\n",
                      printf ("FAIL at line %d: unknown demangling style %s\n",
                              lineno, fstyle);
                              lineno, fstyle);
                      failures++;
                      failures++;
                      continue;
                      continue;
                    }
                    }
                }
                }
              else if (strcmp (opt, "--no-params") == 0)
              else if (strcmp (opt, "--no-params") == 0)
                no_params = 1;
                no_params = 1;
              else if (strcmp (opt, "--is-v3-ctor") == 0)
              else if (strcmp (opt, "--is-v3-ctor") == 0)
                is_v3_ctor = 1;
                is_v3_ctor = 1;
              else if (strcmp (opt, "--is-v3-dtor") == 0)
              else if (strcmp (opt, "--is-v3-dtor") == 0)
                is_v3_dtor = 1;
                is_v3_dtor = 1;
              else if (strcmp (opt, "--ret-postfix") == 0)
              else if (strcmp (opt, "--ret-postfix") == 0)
                ret_postfix = 1;
                ret_postfix = 1;
 
              else if (strcmp (opt, "--ret-drop") == 0)
 
                ret_drop = 1;
              else
              else
                {
                {
                  printf ("FAIL at line %d: unrecognized option %s\n",
                  printf ("FAIL at line %d: unrecognized option %s\n",
                          lineno, opt);
                          lineno, opt);
                  failures++;
                  failures++;
                  continue;
                  continue;
                }
                }
              *p = c;
              *p = c;
              p += strspn (p, " \t");
              p += strspn (p, " \t");
            }
            }
        }
        }
 
 
      if (is_v3_ctor || is_v3_dtor)
      if (is_v3_ctor || is_v3_dtor)
        {
        {
          char buf[20];
          char buf[20];
 
 
          if (is_v3_ctor)
          if (is_v3_ctor)
            {
            {
              enum gnu_v3_ctor_kinds kc;
              enum gnu_v3_ctor_kinds kc;
 
 
              kc = is_gnu_v3_mangled_ctor (inp);
              kc = is_gnu_v3_mangled_ctor (inp);
              sprintf (buf, "%d", (int) kc);
              sprintf (buf, "%d", (int) kc);
            }
            }
          else
          else
            {
            {
              enum gnu_v3_dtor_kinds kd;
              enum gnu_v3_dtor_kinds kd;
 
 
              kd = is_gnu_v3_mangled_dtor (inp);
              kd = is_gnu_v3_mangled_dtor (inp);
              sprintf (buf, "%d", (int) kd);
              sprintf (buf, "%d", (int) kd);
            }
            }
 
 
          if (strcmp (buf, expect.data) != 0)
          if (strcmp (buf, expect.data) != 0)
            {
            {
              fail (lineno, format.data, input.data, buf, expect.data);
              fail (lineno, format.data, input.data, buf, expect.data);
              failures++;
              failures++;
            }
            }
 
 
          continue;
          continue;
        }
        }
 
 
      cplus_demangle_set_style (style);
      cplus_demangle_set_style (style);
 
 
      result = cplus_demangle (inp,
      result = cplus_demangle (inp, (DMGL_PARAMS | DMGL_ANSI | DMGL_TYPES
                               DMGL_PARAMS|DMGL_ANSI|DMGL_TYPES
                                     | (ret_postfix ? DMGL_RET_POSTFIX : 0)
                               |(ret_postfix ? DMGL_RET_POSTFIX : 0));
                                     | (ret_drop ? DMGL_RET_DROP : 0)));
 
 
      if (result
      if (result
          ? strcmp (result, expect.data)
          ? strcmp (result, expect.data)
          : strcmp (input.data, expect.data))
          : strcmp (input.data, expect.data))
        {
        {
          fail (lineno, format.data, input.data, result, expect.data);
          fail (lineno, format.data, input.data, result, expect.data);
          failures++;
          failures++;
        }
        }
      free (result);
      free (result);
 
 
      if (no_params)
      if (no_params)
        {
        {
          get_line (&expect);
          get_line (&expect);
          result = cplus_demangle (inp, DMGL_ANSI|DMGL_TYPES);
          result = cplus_demangle (inp, DMGL_ANSI|DMGL_TYPES);
 
 
          if (result
          if (result
              ? strcmp (result, expect.data)
              ? strcmp (result, expect.data)
              : strcmp (input.data, expect.data))
              : strcmp (input.data, expect.data))
            {
            {
              fail (lineno, format.data, input.data, result, expect.data);
              fail (lineno, format.data, input.data, result, expect.data);
              failures++;
              failures++;
            }
            }
          free (result);
          free (result);
        }
        }
    }
    }
 
 
  free (format.data);
  free (format.data);
  free (input.data);
  free (input.data);
  free (expect.data);
  free (expect.data);
 
 
  printf ("%s: %d tests, %d failures\n", argv[0], tests, failures);
  printf ("%s: %d tests, %d failures\n", argv[0], tests, failures);
  return failures ? 1 : 0;
  return failures ? 1 : 0;
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.