? alloca-cleanup.patch Index: gdb/p-valprint.c =================================================================== RCS file: /cvs/src/src/gdb/p-valprint.c,v retrieving revision 1.100 diff -u -r1.100 p-valprint.c --- gdb/p-valprint.c 18 May 2012 21:02:49 -0000 1.100 +++ gdb/p-valprint.c 23 Jul 2012 12:34:37 -0000 @@ -797,8 +797,11 @@ if (boffset < 0 || boffset >= TYPE_LENGTH (type)) { - /* FIXME (alloc): not safe is baseclass is really really big. */ - gdb_byte *buf = alloca (TYPE_LENGTH (baseclass)); + gdb_byte *buf; + struct cleanup *back_to; + + buf = xmalloc (TYPE_LENGTH (baseclass)); + back_to = make_cleanup (xfree, buf); base_valaddr = buf; if (target_read_memory (address + boffset, buf, @@ -807,6 +810,7 @@ address = address + boffset; thisoffset = 0; boffset = 0; + do_cleanups (back_to); } else base_valaddr = valaddr; Index: gdb/valops.c =================================================================== RCS file: /cvs/src/src/gdb/valops.c,v retrieving revision 1.297 diff -u -r1.297 valops.c --- gdb/valops.c 24 Jun 2012 07:28:10 -0000 1.297 +++ gdb/valops.c 23 Jul 2012 12:34:40 -0000 @@ -2281,8 +2281,13 @@ if (offset < 0 || offset >= TYPE_LENGTH (type)) { - gdb_byte *tmp = alloca (TYPE_LENGTH (baseclass)); - CORE_ADDR address = value_address (*arg1p); + gdb_byte *tmp; + struct cleanup *back_to; + CORE_ADDR address; + + tmp = xmalloc (TYPE_LENGTH (baseclass)); + back_to = make_cleanup (xfree, tmp); + address = value_address (*arg1p); if (target_read_memory (address + offset, tmp, TYPE_LENGTH (baseclass)) != 0) @@ -2293,6 +2298,7 @@ address + offset); base_valaddr = value_contents_for_printing (base_val); this_offset = 0; + do_cleanups (back_to); } else {