Commit | Line | Data |
---|---|---|
9b254dd1 | 1 | # Copyright 2007, 2008 Free Software Foundation, Inc. |
2711e456 DJ |
2 | |
3 | # This program is free software; you can redistribute it and/or modify | |
4 | # it under the terms of the GNU General Public License as published by | |
e22f8b7c | 5 | # the Free Software Foundation; either version 3 of the License, or |
2711e456 | 6 | # (at your option) any later version. |
e22f8b7c | 7 | # |
2711e456 DJ |
8 | # This program is distributed in the hope that it will be useful, |
9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
11 | # GNU General Public License for more details. | |
e22f8b7c | 12 | # |
2711e456 | 13 | # You should have received a copy of the GNU General Public License |
e22f8b7c | 14 | # along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
2711e456 DJ |
15 | |
16 | # Test loading symbols from unrelocated C++ object files. | |
17 | ||
18 | set testfile cp-relocate | |
19 | set srcfile ${testfile}.cc | |
20 | set binfile ${objdir}/${subdir}/${testfile}.o | |
21 | ||
22 | if { [skip_cplus_tests] } { continue } | |
23 | ||
24 | if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" object {c++ debug}] != "" } { | |
25 | untested cp-relocate.exp | |
26 | return -1 | |
27 | } | |
28 | ||
29 | proc get_func_address { func } { | |
30 | global gdb_prompt hex | |
31 | ||
32 | set rfunc [string_to_regexp $func] | |
33 | gdb_test_multiple "print '${func}'" "get address of ${func}" { | |
34 | -re "\\\$\[0-9\]+ = \\{.*\\} (0|($hex) <${rfunc}>)\[\r\n\]+${gdb_prompt} $" { | |
35 | # $1 = {int ()} 0x24 <function_bar> | |
36 | # But if the function is at zero, the name may be omitted. | |
37 | pass "get address of ${func}" | |
38 | if { $expect_out(1,string) == "0" } { | |
39 | return "0x0" | |
40 | } else { | |
41 | return $expect_out(2,string) | |
42 | } | |
43 | } | |
44 | } | |
45 | return "" | |
46 | } | |
47 | ||
48 | # Load the file as an executable; GDB should assign non-overlapping | |
49 | # section offsets. | |
50 | gdb_exit | |
51 | gdb_start | |
52 | gdb_reinitialize_dir $srcdir/$subdir | |
53 | gdb_file_cmd ${binfile} | |
54 | ||
55 | # Find the interesting functions. We go to a little effort to find | |
56 | # the right function names here, to work around PR c++/40. | |
57 | set func1_name "" | |
58 | set func2_name "" | |
59 | gdb_test_multiple "info functions func<.>" "info functions" { | |
60 | -re "\r\nint (\[^\r\]*func<1>\[^\r]*);" { | |
61 | set func1_name $expect_out(1,string) | |
62 | exp_continue | |
63 | } | |
64 | -re "\r\nint (\[^\r\]*func<2>\[^\r]*);" { | |
65 | set func2_name $expect_out(1,string) | |
66 | exp_continue | |
67 | } | |
68 | -re "$gdb_prompt $" { | |
69 | if { ${func1_name} != "" && ${func2_name} != "" } { | |
70 | pass "info functions" | |
71 | } else { | |
72 | fail "info functions" | |
73 | return -1 | |
74 | } | |
75 | } | |
76 | } | |
77 | ||
78 | # Check that all the functions have different addresses. | |
79 | set func1_addr [get_func_address "$func1_name"] | |
80 | set func2_addr [get_func_address "$func2_name"] | |
81 | set caller_addr [get_func_address "caller"] | |
82 | ||
83 | if { "${func1_addr}" == "${func2_addr}" | |
84 | || "${func1_addr}" == "${func2_addr}" | |
85 | || "${func2_addr}" == "${caller_addr}" } { | |
86 | fail "C++ functions have different addresses" | |
87 | } else { | |
88 | pass "C++ functions have different addresses" | |
89 | } | |
90 | ||
91 | # Figure out the names of the sections containing the template | |
92 | # functions. | |
93 | set func1_sec "" | |
94 | set func2_sec "" | |
95 | gdb_test_multiple "info file" "info file" { | |
96 | -re "($hex) - ($hex) is (\[^\r\]*)\r" { | |
97 | if { $expect_out(1,string) <= $func1_addr | |
98 | && $expect_out(2,string) > $func1_addr } { | |
99 | set func1_sec $expect_out(3,string) | |
100 | } elseif { $expect_out(1,string) <= $func2_addr | |
101 | && $expect_out(2,string) > $func2_addr } { | |
102 | set func2_sec $expect_out(3,string) | |
103 | } | |
104 | exp_continue | |
105 | } | |
106 | -re "$gdb_prompt $" { | |
107 | if { ${func1_sec} != "" && ${func2_sec} != "" } { | |
108 | pass "info file" | |
109 | } else { | |
110 | fail "info file" | |
111 | return -1 | |
112 | } | |
113 | } | |
114 | } | |
115 | ||
116 | if { $func1_sec == $func2_sec } { | |
117 | untested "cp-relocate.exp - template functions in same sections" | |
118 | return -1 | |
119 | } | |
120 | ||
121 | # Now start a clean GDB, for add-symbol-file tests. | |
122 | gdb_exit | |
123 | gdb_start | |
124 | gdb_reinitialize_dir $srcdir/$subdir | |
125 | ||
36acd84e | 126 | gdb_test "add-symbol-file ${binfile} 0 -s ${func1_sec} 0x10000 -s ${func2_sec} 0x20000" \ |
2711e456 | 127 | "Reading symbols from .*${testfile}\\.o\\.\\.\\.done\\.(|\r\nUsing host libthread_db library .*libthread_db.so.*\\.)" \ |
c499ed39 | 128 | "add-symbol-file ${testfile}.o" \ |
2711e456 DJ |
129 | "add symbol table from file \".*${testfile}\\.o\" at.*\\(y or n\\) " \ |
130 | "y" | |
131 | ||
132 | # Make sure the function addresses were updated. | |
133 | gdb_test "break *'$func1_name'" \ | |
36acd84e | 134 | "Breakpoint $decimal at 0x1....: file .*" |
2711e456 | 135 | gdb_test "break *'$func2_name'" \ |
36acd84e | 136 | "Breakpoint $decimal at 0x2....: file .*" |