From 43a9b631fc1ea45b4537e99c467d47782c76dd5d Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Sun, 21 Jan 2007 22:41:41 +0000 Subject: [PATCH] * gdb.arch/i386-gnu-cfi.exp, gdb.arch/i386-gnu-cfi.c, gdb.arch/i386-gnu-cfi-asm.S: New files. --- gdb/testsuite/ChangeLog | 6 + gdb/testsuite/gdb.arch/i386-gnu-cfi-asm.S | 357 ++++++++++++++++++++++ gdb/testsuite/gdb.arch/i386-gnu-cfi.c | 31 ++ gdb/testsuite/gdb.arch/i386-gnu-cfi.exp | 94 ++++++ 4 files changed, 488 insertions(+) create mode 100644 gdb/testsuite/gdb.arch/i386-gnu-cfi-asm.S create mode 100644 gdb/testsuite/gdb.arch/i386-gnu-cfi.c create mode 100644 gdb/testsuite/gdb.arch/i386-gnu-cfi.exp diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index c1f1879b149..2eff777dd45 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2007-01-11 Jan Kratochvil + Daniel Jacobowitz + + * gdb.arch/i386-gnu-cfi.exp, gdb.arch/i386-gnu-cfi.c, + gdb.arch/i386-gnu-cfi-asm.S: New files. + 2007-01-14 Jan Kratochvil * lib/gdb.exp: Abort on missing `site.exp'. diff --git a/gdb/testsuite/gdb.arch/i386-gnu-cfi-asm.S b/gdb/testsuite/gdb.arch/i386-gnu-cfi-asm.S new file mode 100644 index 00000000000..a65908da017 --- /dev/null +++ b/gdb/testsuite/gdb.arch/i386-gnu-cfi-asm.S @@ -0,0 +1,357 @@ +/* Copyright 2007 Free Software Foundation, Inc. + * + * 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Please email any bugs, comments, and/or additions to this file to: + * bug-gdb@gnu.org + * + * This file is part of the gdb testsuite. + * + * It was generated using + * "gcc -g -O9 -S -o gate.s gate.c -fasynchronous-unwind-tables", + * using the following source file: + * + * + * void *gate (void *(*gate) (void *data), void *data) + * { + * return 1 + (*gate) (data); + * } + * + * Changes are marked as `CHANGE' below. + */ + + .file "gate.c" + .section .debug_abbrev,"",@progbits +.Ldebug_abbrev0: + .section .debug_info,"",@progbits +.Ldebug_info0: + .section .debug_line,"",@progbits +.Ldebug_line0: + .text +.Ltext0: + .p2align 4,,15 +.globl gate + .type gate, @function +gate: +.LFB2: + .file 1 "gate.c" + .loc 1 2 0 +.LVL0: + pushl %ebp +.LCFI0: + movl %esp, %ebp +.LCFI1: + subl $8, %esp +.LCFI2: + .loc 1 3 0 + movl 12(%ebp), %eax + movl %eax, (%esp) + call *8(%ebp) + .loc 1 4 0 + leave + .loc 1 3 0 + addl $1, %eax + .loc 1 4 0 + ret +.LFE2: + .size gate, .-gate + .section .debug_frame,"",@progbits +.Lframe0: + .long .LECIE0-.LSCIE0 +.LSCIE0: + .long 0xffffffff + .byte 0x1 + .string "" + .uleb128 0x1 + .sleb128 -4 + .byte 0x8 + .byte 0xc + .uleb128 0x4 + .uleb128 0x4 + .byte 0x88 + .uleb128 0x1 + .align 4 +.LECIE0: +.LSFDE0: + .long .LEFDE0-.LASFDE0 +.LASFDE0: + .long .Lframe0 + .long .LFB2 + .long .LFE2-.LFB2 + .byte 0x4 + .long .LCFI0-.LFB2 + .byte 0xe + .uleb128 0x8 + .byte 0x85 + .uleb128 0x2 + + /* CHANGE */ + .byte 0x2f + .uleb128 0x1 + .uleb128 0x0 + /* CHANGE */ + + .byte 0x4 + .long .LCFI1-.LCFI0 + .byte 0xd + .uleb128 0x5 + .align 4 +.LEFDE0: + .section .eh_frame,"a",@progbits +.Lframe1: + .long .LECIE1-.LSCIE1 +.LSCIE1: + .long 0x0 + .byte 0x1 + .string "" + .uleb128 0x1 + .sleb128 -4 + .byte 0x8 + .byte 0xc + .uleb128 0x4 + .uleb128 0x4 + .byte 0x88 + .uleb128 0x1 + .align 4 +.LECIE1: +.LSFDE1: + .long .LEFDE1-.LASFDE1 +.LASFDE1: + .long .LASFDE1-.Lframe1 + .long .LFB2 + .long .LFE2-.LFB2 + .byte 0x4 + .long .LCFI0-.LFB2 + .byte 0xe + .uleb128 0x8 + .byte 0x85 + .uleb128 0x2 + + /* CHANGE */ + .byte 0x2f + .uleb128 0x1 + .uleb128 0x0 + /* CHANGE */ + + .byte 0x4 + .long .LCFI1-.LCFI0 + .byte 0xd + .uleb128 0x5 + .align 4 +.LEFDE1: + .text +.Letext0: + .section .debug_loc,"",@progbits +.Ldebug_loc0: +.LLST0: + .long .LFB2-.Ltext0 + .long .LCFI0-.Ltext0 + .value 0x2 + .byte 0x74 + .sleb128 4 + .long .LCFI0-.Ltext0 + .long .LCFI1-.Ltext0 + .value 0x2 + .byte 0x74 + .sleb128 8 + .long .LCFI1-.Ltext0 + .long .LFE2-.Ltext0 + .value 0x2 + .byte 0x75 + .sleb128 8 + .long 0x0 + .long 0x0 + .section .debug_info + .long 0x74 + .value 0x2 + .long .Ldebug_abbrev0 + .byte 0x4 + .uleb128 0x1 + .long .Ldebug_line0 + .long .Letext0 + .long .Ltext0 + .long .LASF2 + .byte 0x1 + .long .LASF3 + .long .LASF4 + .uleb128 0x2 + .long 0x5f + .byte 0x1 + .long .LASF0 + .byte 0x1 + .byte 0x2 + .byte 0x1 + .long 0x5f + .long .LFB2 + .long .LFE2 + .long .LLST0 + .uleb128 0x3 + .long .LASF0 + .byte 0x1 + .byte 0x1 + .long 0x71 + .byte 0x2 + .byte 0x91 + .sleb128 0 + .uleb128 0x3 + .long .LASF1 + .byte 0x1 + .byte 0x1 + .long 0x5f + .byte 0x2 + .byte 0x91 + .sleb128 4 + .byte 0x0 + .uleb128 0x4 + .byte 0x4 + .uleb128 0x5 + .long 0x71 + .byte 0x1 + .long 0x5f + .uleb128 0x6 + .long 0x5f + .byte 0x0 + .uleb128 0x7 + .byte 0x4 + .long 0x61 + .byte 0x0 + .section .debug_abbrev + .uleb128 0x1 + .uleb128 0x11 + .byte 0x1 + .uleb128 0x10 + .uleb128 0x6 + .uleb128 0x12 + .uleb128 0x1 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x25 + .uleb128 0xe + .uleb128 0x13 + .uleb128 0xb + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x1b + .uleb128 0xe + .byte 0x0 + .byte 0x0 + .uleb128 0x2 + .uleb128 0x2e + .byte 0x1 + .uleb128 0x1 + .uleb128 0x13 + .uleb128 0x3f + .uleb128 0xc + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x27 + .uleb128 0xc + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x1 + .uleb128 0x40 + .uleb128 0x6 + .byte 0x0 + .byte 0x0 + .uleb128 0x3 + .uleb128 0x5 + .byte 0x0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0xa + .byte 0x0 + .byte 0x0 + .uleb128 0x4 + .uleb128 0xf + .byte 0x0 + .uleb128 0xb + .uleb128 0xb + .byte 0x0 + .byte 0x0 + .uleb128 0x5 + .uleb128 0x15 + .byte 0x1 + .uleb128 0x1 + .uleb128 0x13 + .uleb128 0x27 + .uleb128 0xc + .uleb128 0x49 + .uleb128 0x13 + .byte 0x0 + .byte 0x0 + .uleb128 0x6 + .uleb128 0x5 + .byte 0x0 + .uleb128 0x49 + .uleb128 0x13 + .byte 0x0 + .byte 0x0 + .uleb128 0x7 + .uleb128 0xf + .byte 0x0 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0x0 + .byte 0x0 + .byte 0x0 + .section .debug_pubnames,"",@progbits + .long 0x17 + .value 0x2 + .long .Ldebug_info0 + .long 0x78 + .long 0x25 + .string "gate" + .long 0x0 + .section .debug_aranges,"",@progbits + .long 0x1c + .value 0x2 + .long .Ldebug_info0 + .byte 0x4 + .byte 0x0 + .value 0x0 + .value 0x0 + .long .Ltext0 + .long .Letext0-.Ltext0 + .long 0x0 + .long 0x0 + .section .debug_str,"MS",@progbits,1 +.LASF1: + .string "data" +.LASF0: + .string "gate" +.LASF3: + .string "gate.c" +.LASF4: + .string "/home/jkratoch/redhat/bz165025" +.LASF2: + .string "GNU C 4.1.1 20061213 (Red Hat 4.1.1-46)" + .ident "GCC: (GNU) 4.1.1 20061213 (Red Hat 4.1.1-46)" + .section .note.GNU-stack,"",@progbits diff --git a/gdb/testsuite/gdb.arch/i386-gnu-cfi.c b/gdb/testsuite/gdb.arch/i386-gnu-cfi.c new file mode 100644 index 00000000000..e8d04ce97f2 --- /dev/null +++ b/gdb/testsuite/gdb.arch/i386-gnu-cfi.c @@ -0,0 +1,31 @@ +/* Unwinding of DW_CFA_GNU_negative_offset_extended test program. + + Copyright 2007, Free Software Foundation, Inc. + + This file is part of GDB. + + 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 + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +/* i386-gnu-cfi-asm.S: */ +extern void *gate (void *(*gate) (void *data), void *data); + +int main (void) +{ + gate ((void *(*) (void *data)) abort, NULL); + return 0; +} diff --git a/gdb/testsuite/gdb.arch/i386-gnu-cfi.exp b/gdb/testsuite/gdb.arch/i386-gnu-cfi.exp new file mode 100644 index 00000000000..a3d24d795c3 --- /dev/null +++ b/gdb/testsuite/gdb.arch/i386-gnu-cfi.exp @@ -0,0 +1,94 @@ +# Copyright 2007 Free Software Foundation, Inc. + +# 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 +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@gnu.org + +# This file is part of the gdb testsuite. + +# Unwinding of DW_CFA_GNU_negative_offset_extended test program. + +if $tracelevel { + strace $tracelevel +} + +# Test i386 unwinder. + +set prms_id 0 +set bug_id 0 + +if ![istarget "i?86-*-*"] then { + verbose "Skipping i386 unwinder tests." + return +} + +set testfile "i386-gnu-cfi" +set srcfilec ${testfile}.c +set srcfileasm ${testfile}-asm.S +set binfile ${objdir}/${subdir}/${testfile} + +# some targets have leading underscores on assembly symbols. +# TODO: detect this automatically +set additional_flags "" +if [istarget "i?86-*-cygwin*"] then { + set additional_flags "additional_flags=-DSYMBOL_PREFIX=\"_\"" +} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfilec} ${srcdir}/${subdir}/${srcfileasm}" "${binfile}" executable [list debug $additional_flags]] != "" } { + untested i386-gnu-cfi.exp + return -1 +} + +# Get things started. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +# We should stop in abort(3). + +gdb_run_cmd + +gdb_test_multiple {} "continue to abort()" { + -re ".*Program received signal SIGABRT,.*$gdb_prompt $" { + pass "continue to abort()" + } +} + +# Backtrace would crash before. + +gdb_test "bt" \ + "main \\(\\) at .*${testfile}.c.*" \ + "backtrace" + +# Check we see the inserted `DW_CFA_GNU_negative_offset_extended' CFI. +# We see there the original CFI-stored filename `gate.c'. + +gdb_test "up 3" \ + "gate \\(\[^()\]*\\) at .*gate.c.*" \ + "shift up to the modified frame" + +gdb_test_multiple "info frame" "Existence of the CFI inserted register" { + -re "Stack level 3, frame at (0x\[0-9a-f\]+):.*Saved registers:.* ecx at (0x\[0-9a-f\]+),.*" { + pass "Existence of the CFI inserted register" + if { [string compare $expect_out(1,string) $expect_out(2,string)] } then { + fail "Value of the CFI inserted register" + } else { + pass "Value of the CFI inserted register" + } + } +} -- 2.30.2