Fix gdb.dwarf2/dwz.exp for thumb mode

Message ID 87k356lfa8.fsf@codesourcery.com
State New, archived
Headers

Commit Message

Yao Qi Sept. 14, 2014, 9:31 a.m. UTC
  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.
  

Patch

diff --git a/gdb/testsuite/gdb.dwarf2/dwz.exp b/gdb/testsuite/gdb.dwarf2/dwz.exp
index 9175f9e..229f512 100644
--- a/gdb/testsuite/gdb.dwarf2/dwz.exp
+++ b/gdb/testsuite/gdb.dwarf2/dwz.exp
@@ -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}
 	    }
 	}
     }
diff --git a/gdb/testsuite/gdb.dwarf2/main.c b/gdb/testsuite/gdb.dwarf2/main.c
index 3ddd194..e6d4715 100644
--- a/gdb/testsuite/gdb.dwarf2/main.c
+++ b/gdb/testsuite/gdb.dwarf2/main.c
@@ -20,5 +20,6 @@ 
 int
 main()
 {
+  asm ("main_label: .globl main_label");
   return 0;
 }