On Fri, Oct 3, 2014 at 12:00 PM, Mark Wielaard <m...@redhat.com> wrote:
> Thanks for that reference. I was just stepping through gdb's
> gdbarch_return_in_first_hidden_param_p to understand why Siva's example
> did indeed seem to go wrong under GDB. That code is a little hairy with
> all the arch specific indirections, so I am happy I can stop now :)

I agree that GDB's code here is a spaghetti. The function
gdbarch_return_in_first_hidden_param_p seems like an arch related
function, but on most arch's it defaults to the language specific
function language_pass_by_reference via
default_return_in_first_hidden_param_p.

> I can adjust my patch so that it does mark the declaration with
> DW_AT_artificial if it is DECL_COPY_CONSTRUCTOR_P or DECL_DESTRUCTOR_P.
> But maybe that is probably better done as a separate patch.

I have been meaning to send a patch to mark members declared default
with DW_AT_artificial. I have attached what I had in mind with this
mail. If you think it is reasonable, I can send it formally in a
different thread.

> Or does it make sense to mark all defaulted special function members as
> artificial instead of having a separate attribute for it? The (small)
> advantage of having a separate attribute is that the consumer knows
> whether it was explicitly defaulted.

It might still be of value, may be to answer questions like "why is
the member marked as artificial?".

gcc/cp/ChangeLog:

2014-10-03  Siva Chandra Reddy  <sivachan...@google.com>

        * decl2.c (grokfield): Mark special methods declared as default
        to be artificial.

gcc/testsuite/ChangeLog:

2014-10-03  Siva Chandra Reddy  <sivachan...@google.com>

        * g++.dg/dwarf2/default-ctor-dtor.C: New test.
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index 4be4847..6a9a047 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -957,6 +957,7 @@ grokfield (const cp_declarator *declarator,
                  DECL_DEFAULTED_FN (value) = 1;
                  DECL_INITIALIZED_IN_CLASS_P (value) = 1;
                  DECL_DECLARED_INLINE_P (value) = 1;
+                 DECL_ARTIFICIAL (value) = 1;
                }
            }
          else if (TREE_CODE (init) == DEFAULT_ARG)
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/default-ctor-dtor.C 
b/gcc/testsuite/g++.dg/debug/dwarf2/default-ctor-dtor.C
new file mode 100644
index 0000000..82c5e8d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/default-ctor-dtor.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -O0 -std=c++11 -fno-merge-debug-strings" }
+
+class A
+{
+public:
+  A () {}
+  A (const A &) = default;
+  ~A () = default;
+
+  int a;
+};
+
+int
+main ()
+{
+  A a;
+
+  return a.a;
+}
+
+// { dg-final { scan-assembler-times 
"DW_TAG_subprogram.*DW_AT_artificial.*DW_TAG_formal_parameter.*DW_TAG_formal_parameter.*DW_TAG_subprogram.*DW_AT_artificial.*DW_TAG_formal_parameter.*DW_TAG_formal_parameter"
 1 } }

Reply via email to