Created attachment 6051 [details] c++ code, build/run scripts, outputs The virtual function getMyVal() of MyClass returns a MyVal object as value, and MyVal object size is small, and MyVal object has copy constructor. When I use "p myClass->getMyVal()", the gdb calls the copy ctor of MyVal badly, and copy ctor overwrite the vptr of the myClass. When I remove the copy ctor of MyVal, or I add some dummy members to MyVal, the gdb will work correctly. Tested in Ubuntu 11.10, 64 bit. (On Ubuntu 11.10, 32 bit, work correctly) See attached files. --8<-- a.cc: class MyVal { int val; // when added next line, the gdb print work correctly when dimension >= 4 // int dummy[4]; public: MyVal() { val = 42; } MyVal(int _val) { val = _val; } // when remove the next copy ctor, the gdb print work correctly MyVal(const MyVal& other) { val = other.val; } }; class MyClassBase { public: virtual MyVal getMyVal() = 0; }; class MyClass : public MyClassBase { MyVal myVal; public: virtual MyVal getMyVal() { return myVal; } }; int main(int argc, const char **argv) { MyClassBase *myClass = new MyClass(); MyVal m; m = myClass->getMyVal(); m = myClass->getMyVal(); } --8<-- debugging: gdb a.out start n n p *myClass # {_vptr.MyClassBase = <valid_vptr_address>} p myClass->getMyVal() # {val = <address of myClass>} p *myClass # {_vptr.MyClassBase = 0x0} p myClass->getMyVal() #Cannot access memory at address 0x0
I think the source of the problem is bad calling convention. FWIW, amd64-tdep.c does not align with http://mentorembedded.github.io/cxx-abi/abi.html#return-value. I do not think the fix is straight forward (consider c++11 with =default annotations on the destructors and constructors which is not emitted in the DWARF by gcc currently). One could probably come up with a fix which can improve the situation but not fix this problem thoroughly.
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "gdb and binutils". The branch, master has been updated via ebb8ece2ef50ba3f86e8b4ab7a22a4c7734d114b (commit) via 2d1c107c1b8835f4e85c35320d8595a4a6fcaebe (commit) via 82c48ac732edb0155288a93ef3dd39625ff2d2e1 (commit) via 778811d5e7eb96b5ecb848033ffaa2df455a921e (commit) from 91dc4e0a22515bec2d60a8a402970bca5042f26f (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=ebb8ece2ef50ba3f86e8b4ab7a22a4c7734d114b commit ebb8ece2ef50ba3f86e8b4ab7a22a4c7734d114b Author: Siva Chandra <sivachandra@chromium.org> Date: Tue Sep 9 06:50:26 2014 -0700 Fix gnuv3_pass_by_reference to treat dynamic classes as non-trivial. gdb/ChangeLog: * gnu-v3-abi.c (gnuv3_pass_by_reference): Treat dynamic classes as non-trivial. https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=2d1c107c1b8835f4e85c35320d8595a4a6fcaebe commit 2d1c107c1b8835f4e85c35320d8595a4a6fcaebe Author: Siva Chandra <sivachandra@chromium.org> Date: Tue Sep 9 06:46:14 2014 -0700 Add new non-trial return value tests. gdb/testsuite/ChangeLog: * gdb.cp/non-trivial-retval.cc: Add new test cases. * gdb.cp/non-trivial-retval.exp: Add new tests. https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=82c48ac732edb0155288a93ef3dd39625ff2d2e1 commit 82c48ac732edb0155288a93ef3dd39625ff2d2e1 Author: Siva Chandra <sivachandra@chromium.org> Date: Tue Sep 9 06:03:42 2014 -0700 Fix gnuv3_pass_by_reference to lookup copy c-tors with qualified args. Before this, a copy constructor declared as in the following snippet was not being treated as a copy constructor. class A { public: A (A &); // OK. A (const A &); // Not being treated as a copy constructor because of the // 'const' qualifier. }; gdb/ChangeLog: PR c++/13403 PR c++/15154 * gnu-v3-abi.c (gnuv3_pass_by_reference): Lookup copy constructors with qualified args. https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=778811d5e7eb96b5ecb848033ffaa2df455a921e commit 778811d5e7eb96b5ecb848033ffaa2df455a921e Author: Siva Chandra <sivachandra@chromium.org> Date: Mon Sep 8 07:04:59 2014 -0700 Non trivial return value tests. gdb/testsuite/ChangeLog: PR c++/13403 PR c++/15154 * gdb.cp/non-trivial-retval.cc: New file. * gdb.cp/non-trivial-retval.exp: New file. ----------------------------------------------------------------------- Summary of changes: gdb/ChangeLog | 12 +++ gdb/gnu-v3-abi.c | 21 ++++- gdb/testsuite/ChangeLog | 12 +++ gdb/testsuite/gdb.cp/non-trivial-retval.cc | 119 +++++++++++++++++++++++++++ gdb/testsuite/gdb.cp/non-trivial-retval.exp | 36 ++++++++ 5 files changed, 195 insertions(+), 5 deletions(-) create mode 100644 gdb/testsuite/gdb.cp/non-trivial-retval.cc create mode 100644 gdb/testsuite/gdb.cp/non-trivial-retval.exp