+2018-04-26 Pedro Alves <palves@redhat.com>
+
+ * elfread.c (elf_gnu_ifunc_resolver_return_stop): Use
+ find_function_start_sal instead of find_pc_line.
+
2018-04-26 Pedro Alves <palves@redhat.com>
* breakpoint.c (set_breakpoint_location_function): Handle
b->type = bp_breakpoint;
update_breakpoint_locations (b, current_program_space,
- find_pc_line (resolved_pc, 0), {});
+ find_function_start_sal (resolved_pc, NULL, true),
+ {});
}
/* A helper function for elf_symfile_read that reads the minimal
+2018-04-26 Pedro Alves <palves@redhat.com>
+
+ * gdb.base/gnu-ifunc.exp (set-break): Test that GDB resolves
+ ifunc breakpoint locations correctly of ifunc breakpoints set
+ while the program resolves the ifunc.
+
2018-04-26 Pedro Alves <palves@redhat.com>
* gdb.base/gnu-ifunc-final.c: New file.
return 1
}
+ gdb_breakpoint [gdb_get_line_number "break-at-call"]
+ gdb_continue_to_breakpoint "break-at-call" ".*break-at-call.*"
+
set ws "\[ \t\]+"
set dot "\\.?"
"Breakpoint $decimal at gnu-indirect-function resolver at $hex"
gdb_test "info breakpoints" \
"$decimal${ws}STT_GNU_IFUNC resolver${ws}keep${ws}y${ws}$hex <${gnu_ifunc_resolver}>"
+
+ # Make the breakpoint conditional on a condition that always
+ # fails. This is so that when the ifunc-resolver breakpoint
+ # triggers, GDB resumes the program immediately.
+ gdb_test_no_output "condition \$bpnum 0"
}
global final_src
with_test_prefix "resolve" {
- delete_breakpoints
gdb_breakpoint [gdb_get_line_number "break-at-exit"]
gdb_continue_to_breakpoint "break-at-exit" ".*break-at-exit.*"
}
with_test_prefix "after resolving" {
- delete_breakpoints
-
if {!$final_debug} {
# Set a breakpoint both at the ifunc, and at the ifunc's
# target. GDB should resolve both to the same address.
gdb_test "break gnu_ifunc" "Breakpoint .* at $hex: file .*$final_src, line $lineno\\."
set location "$decimal${ws}breakpoint${ws}keep${ws}y${ws}$hex in final at .*$final_src:$lineno"
}
- gdb_test "info breakpoints" "$location\r\n$location"
+
+ # The first location here is for the breakpoint that was set
+ # before the ifunc was resolved. It should be resolved by
+ # now, and it should have the exact same address/line as the
+ # other two locations.
+ gdb_test "info breakpoints" "$location\r\n.*$location\r\n$location"
}
}