Fix gdb.dwarf2/dwz.exp for thumb mode
Commit Message
Yao Qi <yao@codesourcery.com> writes:
> +asm (".section \".text\"");
> +asm (".balign 8");
> +asm ("main_start: .globl main_start");
> +
> int
> main()
Doug expressed the concern that this approach is fragile to clang,
because clang will move the label after function main. After some
experiments, I find a reliable approach: define a label main_label
inside function main, so neither gcc or clang moves it out of
function. We can get the address of main by main_label minus the offset
of main_label to main.
In this updated patch, we compile main.c to object, and gets
main_label's offset to main. Then, we can produce the correct address
of main in the debug information.
@@ -27,8 +27,9 @@ if {[gdb_compile ${srcdir}/${subdir}/${srcfile} ${binfile}1.o \
return -1
}
-# Start GDB and load object file, compute the function length which is
-# needed in the Dwarf Assembler below.
+# Start GDB and load object file, compute the function length and the
+# offset from main to main_label which are needed in the Dwarf Assembler
+# below.
clean_restart ${testfile}1.o
set main_length ""
@@ -59,9 +60,17 @@ gdb_test_multiple $test $test {
}
}
-if { $main_length == "" } {
+set main_label_offset ""
+set test "p main_label"
+gdb_test_multiple $test $test {
+ -re ".* = {.*} $hex <main\\+($decimal)>.*\r\n$gdb_prompt $" {
+ set main_label_offset $expect_out(1,string)
+ }
+}
+
+if { $main_length == "" || $main_label_offset == "" } {
# Bail out here, because we can't do the following tests if
- # $main_length is unknown.
+ # $main_length or $main_label_offset is unknown.
return -1
}
@@ -71,7 +80,7 @@ gdb_exit
set asm_file [standard_output_file $srcfile2]
Dwarf::assemble $asm_file {
declare_labels partial_label int_label int_label2
- global main_length
+ global main_length main_label_offset
extern main
@@ -79,8 +88,8 @@ Dwarf::assemble $asm_file {
partial_label: partial_unit {} {
subprogram {
{name main}
- {low_pc main addr}
- {high_pc "main + $main_length" addr}
+ {low_pc "main_label - $main_label_offset" addr}
+ {high_pc "main_label - $main_label_offset + $main_length" addr}
}
}
}
@@ -20,5 +20,6 @@
int
main()
{
+ asm ("main_label: .globl main_label");
return 0;
}