merge from gcc
authorDJ Delorie <dj@redhat.com>
Tue, 10 Sep 2013 19:01:22 +0000 (19:01 +0000)
committerDJ Delorie <dj@redhat.com>
Tue, 10 Sep 2013 19:01:22 +0000 (19:01 +0000)
libiberty/ChangeLog
libiberty/cp-demangle.c
libiberty/testsuite/demangle-expected

index ff35eb18276f34b6d6846c2046c7c3d5d29178d0..3ebf3c17662ab86e151b501ba5b9667da565c6f8 100644 (file)
@@ -1,3 +1,27 @@
+2013-09-10  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR bootstrap/58386
+       Revert:
+
+       2013-09-10  Gary Benson  <gbenson@redhat.com>
+
+       * cp-demangle.c: Include hashtab.h.
+       (struct d_print_info): New field saved_scopes.
+       (d_print_init): Initialize the above.
+       (d_print_free): New function.
+       (cplus_demangle_print_callback): Call the above.
+       (struct d_saved_scope): New structure.
+       (d_store_scope): New function.
+       (d_free_scope) Likewise.
+       (d_restore_scope) Likewise.
+       (d_hash_saved_scope) Likewise.
+       (d_equal_saved_scope) Likewise.
+       (d_print_comp): New variable saved_scope.
+       [DEMANGLE_COMPONENT_REFERENCE,
+       DEMANGLE_COMPONENT_RVALUE_REFERENCE]: Capture scope the first
+       time the component is traversed, and use the captured scope for
+       subsequent traversals.
+
 2013-09-10  Gary Benson  <gbenson@redhat.com>
 
        * cp-demangle.c: Include hashtab.h.
index d44e82a4cda74d2415e11462c86731497ef50cc6..70f54389c892957a113f627c4cfc806a79f63afb 100644 (file)
@@ -128,7 +128,6 @@ extern char *alloca ();
 #include "libiberty.h"
 #include "demangle.h"
 #include "cp-demangle.h"
-#include "hashtab.h"
 
 /* If IN_GLIBCPP_V3 is defined, some functions are made static.  We
    also rename them via #define to avoid compiler errors when the
@@ -303,10 +302,6 @@ struct d_print_info
   int pack_index;
   /* Number of d_print_flush calls so far.  */
   unsigned long int flush_count;
-  /* Table mapping demangle components to scopes saved when first
-     traversing those components.  These are used while evaluating
-     substitutions.  */
-  htab_t saved_scopes;
 };
 
 #ifdef CP_DEMANGLE_DEBUG
@@ -3670,17 +3665,6 @@ d_print_init (struct d_print_info *dpi, demangle_callbackref callback,
   dpi->opaque = opaque;
 
   dpi->demangle_failure = 0;
-
-  dpi->saved_scopes = NULL;
-}
-
-/* Free a print information structure.  */
-
-static void
-d_print_free (struct d_print_info *dpi)
-{
-  if (dpi->saved_scopes != NULL)
-    htab_delete (dpi->saved_scopes);
 }
 
 /* Indicate that an error occurred during printing, and test for error.  */
@@ -3765,7 +3749,6 @@ cplus_demangle_print_callback (int options,
                                demangle_callbackref callback, void *opaque)
 {
   struct d_print_info dpi;
-  int success;
 
   d_print_init (&dpi, callback, opaque);
 
@@ -3773,9 +3756,7 @@ cplus_demangle_print_callback (int options,
 
   d_print_flush (&dpi);
 
-  success = ! d_print_saw_error (&dpi);
-  d_print_free (&dpi);
-  return success;
+  return ! d_print_saw_error (&dpi);
 }
 
 /* Turn components into a human readable string.  OPTIONS is the
@@ -3932,114 +3913,6 @@ d_print_subexpr (struct d_print_info *dpi, int options,
     d_append_char (dpi, ')');
 }
 
-/* A demangle component and some scope captured when it was first
-   traversed.  */
-
-struct d_saved_scope
-{
-  /* The component whose scope this is.  Used as the key for the
-     saved_scopes hashtable in d_print_info.  May be NULL if this
-     scope will not be inserted into that table.  */
-  const struct demangle_component *container;
-  /* Nonzero if the below items are copies and require freeing
-     when this scope is freed.  */
-  int is_copy;
-  /* The list of templates, if any, that was current when this
-     scope was captured.  */
-  struct d_print_template *templates;
-};
-
-/* Allocate a scope and populate it with the current values from DPI.
-   CONTAINER is the demangle component to which the scope refers, and
-   is used as the key for the saved_scopes hashtable in d_print_info.
-   CONTAINER may be NULL if this scope will not be inserted into that
-   table.  If COPY is nonzero then items that may have been allocated
-   on the stack will be copied before storing.  */
-
-static struct d_saved_scope *
-d_store_scope (const struct d_print_info *dpi,
-              const struct demangle_component *container, int copy)
-{
-  struct d_saved_scope *scope = XNEW (struct d_saved_scope);
-
-  scope->container = container;
-  scope->is_copy = copy;
-
-  if (copy)
-    {
-      struct d_print_template *ts, **tl = &scope->templates;
-
-      for (ts = dpi->templates; ts != NULL; ts = ts->next)
-       {
-         struct d_print_template *td = XNEW (struct d_print_template);
-
-         *tl = td;
-         tl = &td->next;
-         td->template_decl = ts->template_decl;
-       }
-      *tl = NULL;
-    }
-  else
-    scope->templates = dpi->templates;
-
-  return scope;
-}
-
-/* Free a scope allocated by d_store_scope.  */
-
-static void
-d_free_scope (void *p)
-{
-  struct d_saved_scope *scope = (struct d_saved_scope *) p;
-
-  if (scope->is_copy)
-    {
-      struct d_print_template *ts, *tn;
-
-      for (ts = scope->templates; ts != NULL; ts = tn)
-       {
-         tn = ts->next;
-         free (ts);
-       }
-    }
-
-  free (scope);
-}
-
-/* Restore a stored scope to DPI, optionally freeing it afterwards.  */
-
-static void
-d_restore_scope (struct d_print_info *dpi, struct d_saved_scope *scope,
-                int free_after)
-{
-  dpi->templates = scope->templates;
-
-  if (free_after)
-    d_free_scope (scope);
-}
-
-/* Returns a hash code for the saved scope referenced by p.  */
-
-static hashval_t
-d_hash_saved_scope (const void *p)
-{
-  const struct d_saved_scope *s = (const struct d_saved_scope *) p;
-
-  return htab_hash_pointer (s->container);
-}
-
-/* Returns non-zero if the saved scopes referenced by p1 and p2
-   are equal.  */
-
-static int
-d_equal_saved_scope (const void *p1, const void *p2)
-{
-  const struct d_saved_scope *s1 = (const struct d_saved_scope *) p1;
-  const struct d_saved_scope *s2 = (const struct d_saved_scope *) p2;
-
-  return s1->container == s2->container;
-}
-
 /* Subroutine to handle components.  */
 
 static void
@@ -4050,10 +3923,6 @@ d_print_comp (struct d_print_info *dpi, int options,
      without needing to modify *dc.  */
   const struct demangle_component *mod_inner = NULL;
 
-  /* Variable used to store the current scope while a previously
-     captured scope is used.  */
-  struct d_saved_scope *saved_scope = NULL;
-
   if (dc == NULL)
     {
       d_print_error (dpi);
@@ -4422,43 +4291,12 @@ d_print_comp (struct d_print_info *dpi, int options,
        const struct demangle_component *sub = d_left (dc);
        if (sub->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM)
          {
-           struct demangle_component *a;
-           struct d_saved_scope lookup;
-           void **slot;
-
-           if (dpi->saved_scopes == NULL)
-             dpi->saved_scopes = htab_create_alloc (1,
-                                                    d_hash_saved_scope,
-                                                    d_equal_saved_scope,
-                                                    d_free_scope,
-                                                    xcalloc, free);
-
-           lookup.container = sub;
-           slot = htab_find_slot (dpi->saved_scopes, &lookup, INSERT);
-           if (*slot == HTAB_EMPTY_ENTRY)
-             {
-               /* This is the first time SUB has been traversed.
-                  We need to capture some scope so it can be
-                  restored if SUB is reentered as a substitution.  */
-               *slot = d_store_scope (dpi, sub, 1);
-             }
-           else
-             {
-               /* This traversal is reentering SUB as a substition.
-                  Restore the original scope temporarily.  */
-               saved_scope = d_store_scope (dpi, NULL, 0);
-               d_restore_scope (dpi, (struct d_saved_scope *) *slot, 0);
-             }
-
-           a = d_lookup_template_argument (dpi, sub);
+           struct demangle_component *a = d_lookup_template_argument (dpi, sub);
            if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST)
              a = d_index_template_argument (a, dpi->pack_index);
 
            if (a == NULL)
              {
-               if (saved_scope != NULL)
-                 d_restore_scope (dpi, saved_scope, 1);
-
                d_print_error (dpi);
                return;
              }
@@ -4506,9 +4344,6 @@ d_print_comp (struct d_print_info *dpi, int options,
 
        dpi->modifiers = dpm.next;
 
-       if (saved_scope != NULL)
-         d_restore_scope (dpi, saved_scope, 1);
-
        return;
       }
 
index d3a3603f346787d37fe8d12839eb4512e6d0a31e..1259e4a9f495fe2dcff1cda674ed6cc8270fa577 100644 (file)
@@ -4291,6 +4291,3 @@ void m<void () &&>(void (A::*)() &&)
 --format=gnu-v3
 _Z1nIM1AKFvvREEvT_
 void n<void (A::*)() const &>(void (A::*)() const &)
---format=gnu-v3
-_ZSt7forwardIRN1x14refobjiteratorINS0_3refINS0_4mime30multipart_section_processorObjIZ15get_body_parserIZZN14mime_processor21make_section_iteratorERKNS2_INS3_10sectionObjENS0_10ptrrefBaseEEEbENKUlvE_clEvEUlSB_bE_ZZNS6_21make_section_iteratorESB_bENKSC_clEvEUlSB_E0_ENS1_INS2_INS0_20outputrefiteratorObjIiEES8_EEEERKSsSB_OT_OT0_EUlmE_NS3_32make_multipart_default_discarderISP_EEEES8_EEEEEOT_RNSt16remove_referenceISW_E4typeE
-x::refobjiterator<x::ref<x::mime::multipart_section_processorObj<x::refobjiterator<x::ref<x::outputrefiteratorObj<int>, x::ptrrefBase> > get_body_parser<mime_processor::make_section_iterator(x::ref<x::mime::sectionObj, x::ptrrefBase> const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref<x::mime::sectionObj, x::ptrrefBase> const&, bool)#1}, mime_processor::make_section_iterator(x::ref<x::mime::sectionObj, x::ptrrefBase> const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref<x::mime::sectionObj, x::ptrrefBase> const&)#2}>(std::string const&, x::ref<x::mime::sectionObj, x::ptrrefBase> const&, mime_processor::make_section_iterator(x::ref<x::mime::sectionObj, x::ptrrefBase> const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref<x::mime::sectionObj, x::ptrrefBase> const&, bool)#1}&&, mime_processor::make_section_iterator(x::ref<x::mime::sectionObj, x::ptrrefBase> const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref<x::mime::sectionObj, x::ptrrefBase> const&)#2}&&)::{lambda(unsigned long)#1}, x::mime::make_multipart_default_discarder<mime_processor::make_section_iterator(x::ref<x::mime::sectionObj, x::ptrrefBase> const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref<x::mime::sectionObj, x::ptrrefBase> const&, bool)#1}&&> >, x::ptrrefBase> >& std::forward<x::refobjiterator<x::ref<x::mime::multipart_section_processorObj<x::refobjiterator<x::ref<x::outputrefiteratorObj<int>, x::ptrrefBase> > get_body_parser<mime_processor::make_section_iterator(x::ref<x::mime::sectionObj, x::ptrrefBase> const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref<x::mime::sectionObj, x::ptrrefBase> const&, bool)#1}, mime_processor::make_section_iterator(x::ref<x::mime::sectionObj, x::ptrrefBase> const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref<x::mime::sectionObj, x::ptrrefBase> const&)#2}>(std::string const&, x::ref<x::mime::sectionObj, x::ptrrefBase> const&, mime_processor::make_section_iterator(x::ref<x::mime::sectionObj, x::ptrrefBase> const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref<x::mime::sectionObj, x::ptrrefBase> const&, bool)#1}&&, mime_processor::make_section_iterator(x::ref<x::mime::sectionObj, x::ptrrefBase> const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref<x::mime::sectionObj, x::ptrrefBase> const&)#2}&&)::{lambda(unsigned long)#1}, x::mime::make_multipart_default_discarder<mime_processor::make_section_iterator(x::ref<x::mime::sectionObj, x::ptrrefBase> const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref<x::mime::sectionObj, x::ptrrefBase> const&, bool)#1}&&> >, x::ptrrefBase> >&>(std::remove_reference<x::mime::multipart_section_processorObj<x::refobjiterator<x::ref<x::outputrefiteratorObj<int>, x::ptrrefBase> > get_body_parser<mime_processor::make_section_iterator(x::ref<x::mime::sectionObj, x::ptrrefBase> const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref<x::mime::sectionObj, x::ptrrefBase> const&, bool)#1}, mime_processor::make_section_iterator(x::ref<x::mime::sectionObj, x::ptrrefBase> const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref<x::mime::sectionObj, x::ptrrefBase> const&)#2}>(std::string const&, x::ref<x::mime::sectionObj, x::ptrrefBase> const&, mime_processor::make_section_iterator(x::ref<x::mime::sectionObj, x::ptrrefBase> const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref<x::mime::sectionObj, x::ptrrefBase> const&, bool)#1}&&, mime_processor::make_section_iterator(x::ref<x::mime::sectionObj, x::ptrrefBase> const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref<x::mime::sectionObj, x::ptrrefBase> const&)#2}&&)::{lambda(unsigned long)#1}, x::mime::make_multipart_default_discarder<mime_processor::make_section_iterator(x::ref<x::mime::sectionObj, x::ptrrefBase> const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref<x::mime::sectionObj, x::ptrrefBase> const&, bool)#1}&&> > >::type&)