[2/2] Testsuite: Add gdb_simple_compile

Message ID 20180906105549.4366-3-alan.hayward@arm.com
State New, archived
Headers

Commit Message

Alan Hayward Sept. 6, 2018, 10:55 a.m. UTC
  Simplfy gdb.exp by adding a function that will attempt to
compile a piece of code, then clean up, leaving the created
object.

gdb/testsuite

2018-09-06  Alan Hayward  <alan.hayward@arm.com>

        * lib/gdb.exp (gdb_simple_compile): Add proc.
        (is_elf_target): Use gdb_simple_compile.
        (skip_altivec_tests): Likewise.
        (skip_vsx_tests): Likewise.
        (skip_tsx_tests): Likewise.
        (skip_btrace_tests): Likewise.
        (skip_btrace_pt_tests): Likewise.
        (gdb_can_simple_compile): Likewise.
        (gdb_has_argv0): Likewise.
        (gdb_target_symbol_prefix): Likewise.
        (target_supports_scheduler_locking): Likewise.
---
 gdb/testsuite/lib/gdb.exp | 253 +++++++++++++++-------------------------------
 1 file changed, 84 insertions(+), 169 deletions(-)
  

Comments

Tom Tromey Sept. 6, 2018, 3:10 p.m. UTC | #1
>>>>> "Alan" == Alan Hayward <alan.hayward@arm.com> writes:

Alan> Simplfy gdb.exp by adding a function that will attempt to
Alan> compile a piece of code, then clean up, leaving the created
Alan> object.

Thanks for doing this.

Alan> +    global obj
Alan> +    set src { int foo () {return 0;} }
Alan> +    if {![gdb_simple_compile elf_target $src]} {
Alan> +        return 0
Alan>      }

It would be better not to use a global for this.

One possibility is to have the caller pass in the variable name and then
to have the callee use upvar.  Or, some other parts of gdb.exp just pick
a variable name to inject into the caller using upvar.  The first is
maybe a little nicer.

Alan>      # Make sure we have a compiler that understands altivec.
Alan> -    set compile_flags {debug nowarnings}

I hadn't noticed this in the first patch but I see now that
gdb_can_simple_compile / gdb_simple_compile set the default compiler flags.

Maybe it would be better to have this just be a default and let callers
override it?

Tom
  
Alan Hayward Sept. 9, 2018, 5:13 p.m. UTC | #2
> On 6 Sep 2018, at 16:10, Tom Tromey <tom@tromey.com> wrote:

> 

>>>>>> "Alan" == Alan Hayward <alan.hayward@arm.com> writes:

> 

> Alan> Simplfy gdb.exp by adding a function that will attempt to

> Alan> compile a piece of code, then clean up, leaving the created

> Alan> object.

> 

> Thanks for doing this.

> 

> Alan> +    global obj

> Alan> +    set src { int foo () {return 0;} }

> Alan> +    if {![gdb_simple_compile elf_target $src]} {

> Alan> +        return 0

> Alan>      }

> 

> It would be better not to use a global for this.

> 

> One possibility is to have the caller pass in the variable name and then

> to have the callee use upvar.  Or, some other parts of gdb.exp just pick

> a variable name to inject into the caller using upvar.  The first is

> maybe a little nicer.


I’ll look into using upvar.

> 

> Alan>      # Make sure we have a compiler that understands altivec.

> Alan> -    set compile_flags {debug nowarnings}

> 

> I hadn't noticed this in the first patch but I see now that

> gdb_can_simple_compile / gdb_simple_compile set the default compiler flags.

> 

> Maybe it would be better to have this just be a default and let callers

> override it?


My reasoning was that you would always want both debug and nowarnings.
Didn’t see anywhere that didn’t use them. So I always append those two to
the passed in flags. Happy to move them to the default param.


Alan.
  
Tom Tromey Sept. 9, 2018, 6:44 p.m. UTC | #3
>>>>> "Alan" == Alan Hayward <Alan.Hayward@arm.com> writes:

>> I hadn't noticed this in the first patch but I see now that
>> gdb_can_simple_compile / gdb_simple_compile set the default compiler flags.
>> 
>> Maybe it would be better to have this just be a default and let callers
>> override it?

Alan> My reasoning was that you would always want both debug and nowarnings.
Alan> Didn’t see anywhere that didn’t use them. So I always append those two to
Alan> the passed in flags. Happy to move them to the default param.

It's fine with me if you'd rather keep it, but I think it would be nice
if the proc's intro comment mentioned this.

Tom
  

Patch

diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
index 43c9b03d01..c7efcecae8 100644
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -2376,21 +2376,10 @@  proc readline_is_used { } {
 gdb_caching_proc is_elf_target {
     set me "is_elf_target"
 
-    set src [standard_temp_file is_elf_target[pid].c]
-    set obj [standard_temp_file is_elf_target[pid].o]
-
-    gdb_produce_source $src {
-	int foo () {return 0;}
-    }
-
-    verbose "$me:  compiling testfile $src" 2
-    set lines [gdb_compile $src $obj object {quiet}]
-
-    file delete $src
-
-    if ![string match "" $lines] then {
-	verbose "$me:  testfile compilation failed, returning 0" 2
-	return 0
+    global obj
+    set src { int foo () {return 0;} }
+    if {![gdb_simple_compile elf_target $src]} {
+        return 0
     }
 
     set fp_obj [open $obj "r"]
@@ -2554,27 +2543,22 @@  gdb_caching_proc skip_altivec_tests {
     }
 
     # Make sure we have a compiler that understands altivec.
-    set compile_flags {debug nowarnings}
     if [get_compiler_info] {
        warning "Could not get compiler info"
        return 1
     }
     if [test_compiler_info gcc*] {
-        set compile_flags "$compile_flags additional_flags=-maltivec"
+        set compile_flags "{additional_flags=-maltivec}"
     } elseif [test_compiler_info xlc*] {
-        set compile_flags "$compile_flags additional_flags=-qaltivec"
+        set compile_flags "{additional_flags=-qaltivec}"
     } else {
         verbose "Could not compile with altivec support, returning 1" 2
         return 1
     }
 
-    # Set up, compile, and execute a test program containing VMX instructions.
-    # Include the current process ID in the file names to prevent conflicts
-    # with invocations for multiple testsuites.
-    set src [standard_temp_file vmx[pid].c]
-    set exe [standard_temp_file vmx[pid].x]
-
-    gdb_produce_source $src {
+    # Compile a test program containing VMX instructions.
+    global obj
+    set src {
 	int main() {
 	    #ifdef __MACH__
 	    asm volatile ("vor v0,v0,v0");
@@ -2584,22 +2568,16 @@  gdb_caching_proc skip_altivec_tests {
 	    return 0;
 	}
     }
-
-    verbose "$me:  compiling testfile $src" 2
-    set lines [gdb_compile $src $exe executable $compile_flags]
-    file delete $src
-
-    if ![string match "" $lines] then {
-        verbose "$me:  testfile compilation failed, returning 1" 2
+    if {![gdb_simple_compile $me $src executable $compile_flags]} {
         return 1
     }
 
-    # No error message, compilation succeeded so now run it via gdb.
+    # Compilation succeeded so now run it via gdb.
 
     gdb_exit
     gdb_start
     gdb_reinitialize_dir $srcdir/$subdir
-    gdb_load "$exe"
+    gdb_load "$obj"
     gdb_run_cmd
     gdb_expect {
         -re ".*Illegal instruction.*${gdb_prompt} $" {
@@ -2616,7 +2594,7 @@  gdb_caching_proc skip_altivec_tests {
         }
     }
     gdb_exit
-    remote_file build delete $exe
+    remote_file build delete $obj
 
     verbose "$me:  returning $skip_vmx_tests" 2
     return $skip_vmx_tests
@@ -2638,24 +2616,22 @@  gdb_caching_proc skip_vsx_tests {
     }
 
     # Make sure we have a compiler that understands altivec.
-    set compile_flags {debug nowarnings quiet}
     if [get_compiler_info] {
        warning "Could not get compiler info"
        return 1
     }
     if [test_compiler_info gcc*] {
-        set compile_flags "$compile_flags additional_flags=-mvsx"
+        set compile_flags "{additional_flags=-mvsx}"
     } elseif [test_compiler_info xlc*] {
-        set compile_flags "$compile_flags additional_flags=-qasm=gcc"
+        set compile_flags "{additional_flags=-qasm=gcc}"
     } else {
         verbose "Could not compile with vsx support, returning 1" 2
         return 1
     }
 
-    set src [standard_temp_file vsx[pid].c]
-    set exe [standard_temp_file vsx[pid].x]
-
-    gdb_produce_source $src {
+    # Compile a test program containing VSX instructions.
+    global obj
+    set src {
 	int main() {
 	    double a[2] = { 1.0, 2.0 };
 	    #ifdef __MACH__
@@ -2666,13 +2642,7 @@  gdb_caching_proc skip_vsx_tests {
 	    return 0;
 	}
     }
-
-    verbose "$me:  compiling testfile $src" 2
-    set lines [gdb_compile $src $exe executable $compile_flags]
-    file delete $src
-
-    if ![string match "" $lines] then {
-        verbose "$me:  testfile compilation failed, returning 1" 2
+    if {![gdb_simple_compile $me $src executable $compile_flags]} {
         return 1
     }
 
@@ -2681,7 +2651,7 @@  gdb_caching_proc skip_vsx_tests {
     gdb_exit
     gdb_start
     gdb_reinitialize_dir $srcdir/$subdir
-    gdb_load "$exe"
+    gdb_load "$obj"
     gdb_run_cmd
     gdb_expect {
         -re ".*Illegal instruction.*${gdb_prompt} $" {
@@ -2698,7 +2668,7 @@  gdb_caching_proc skip_vsx_tests {
         }
     }
     gdb_exit
-    remote_file build delete $exe
+    remote_file build delete $obj
 
     verbose "$me:  returning $skip_vsx_tests" 2
     return $skip_vsx_tests
@@ -2712,24 +2682,17 @@  gdb_caching_proc skip_tsx_tests {
 
     set me "skip_tsx_tests"
 
-    set src [standard_temp_file tsx[pid].c]
-    set exe [standard_temp_file tsx[pid].x]
-
-    gdb_produce_source $src {
-    int main() {
-        asm volatile ("xbegin .L0");
-        asm volatile ("xend");
-        asm volatile (".L0: nop");
-        return 0;
-    }
+    # Compile a test program.
+    global obj
+    set src {
+        int main() {
+            asm volatile ("xbegin .L0");
+            asm volatile ("xend");
+            asm volatile (".L0: nop");
+            return 0;
+        }
     }
-
-    verbose "$me:  compiling testfile $src" 2
-    set lines [gdb_compile $src $exe executable {nowarnings quiet}]
-    file delete $src
-
-    if ![string match "" $lines] then {
-        verbose "$me:  testfile compilation failed." 2
+    if {![gdb_simple_compile $me $src executable]} {
         return 1
     }
 
@@ -2738,7 +2701,7 @@  gdb_caching_proc skip_tsx_tests {
     gdb_exit
     gdb_start
     gdb_reinitialize_dir $srcdir/$subdir
-    gdb_load "$exe"
+    gdb_load "$obj"
     gdb_run_cmd
     gdb_expect {
         -re ".*Illegal instruction.*${gdb_prompt} $" {
@@ -2755,7 +2718,7 @@  gdb_caching_proc skip_tsx_tests {
         }
     }
     gdb_exit
-    remote_file build delete $exe
+    remote_file build delete $obj
 
     verbose "$me:  returning $skip_tsx_tests" 2
     return $skip_tsx_tests
@@ -2773,24 +2736,11 @@  gdb_caching_proc skip_btrace_tests {
         return 1
     }
 
-    # Set up, compile, and execute a test program.
-    # Include the current process ID in the file names to prevent conflicts
-    # with invocations for multiple testsuites.
-    set src [standard_temp_file btrace[pid].c]
-    set exe [standard_temp_file btrace[pid].x]
-
-    gdb_produce_source $src {
-	int main(void) { return 0; }
-    }
-
-    verbose "$me:  compiling testfile $src" 2
-    set compile_flags {debug nowarnings quiet}
-    set lines [gdb_compile $src $exe executable $compile_flags]
-
-    if ![string match "" $lines] then {
-        verbose "$me:  testfile compilation failed, returning 1" 2
-	file delete $src
-        return 1
+    # Compile a test program.
+    global obj
+    set src { int main() { return 0; } }
+    if {![gdb_simple_compile $me $src executable]} {
+        return 0
     }
 
     # No error message, compilation succeeded so now run it via gdb.
@@ -2798,12 +2748,10 @@  gdb_caching_proc skip_btrace_tests {
     gdb_exit
     gdb_start
     gdb_reinitialize_dir $srcdir/$subdir
-    gdb_load $exe
+    gdb_load $obj
     if ![runto_main] {
-	file delete $src
         return 1
     }
-    file delete $src
     # In case of an unexpected output, we return 2 as a fail value.
     set skip_btrace_tests 2
     gdb_test_multiple "record btrace" "check btrace support" {
@@ -2821,7 +2769,7 @@  gdb_caching_proc skip_btrace_tests {
         }
     }
     gdb_exit
-    remote_file build delete $exe
+    remote_file build delete $obj
 
     verbose "$me:  returning $skip_btrace_tests" 2
     return $skip_btrace_tests
@@ -2840,24 +2788,11 @@  gdb_caching_proc skip_btrace_pt_tests {
         return 1
     }
 
-    # Set up, compile, and execute a test program.
-    # Include the current process ID in the file names to prevent conflicts
-    # with invocations for multiple testsuites.
-    set src [standard_temp_file btrace[pid].c]
-    set exe [standard_temp_file btrace[pid].x]
-
-    gdb_produce_source $src {
-	int main(void) { return 0; }
-    }
-
-    verbose "$me:  compiling testfile $src" 2
-    set compile_flags {debug nowarnings quiet}
-    set lines [gdb_compile $src $exe executable $compile_flags]
-
-    if ![string match "" $lines] then {
-        verbose "$me:  testfile compilation failed, returning 1" 2
-	file delete $src
-        return 1
+    # Compile a test program.
+    global obj
+    set src { int main() { return 0; } }
+    if {![gdb_simple_compile $me $src executable]} {
+        return 0
     }
 
     # No error message, compilation succeeded so now run it via gdb.
@@ -2865,12 +2800,10 @@  gdb_caching_proc skip_btrace_pt_tests {
     gdb_exit
     gdb_start
     gdb_reinitialize_dir $srcdir/$subdir
-    gdb_load $exe
+    gdb_load $obj
     if ![runto_main] {
-	file delete $src
         return 1
     }
-    file delete $src
     # In case of an unexpected output, we return 2 as a fail value.
     set skip_btrace_tests 2
     gdb_test_multiple "record btrace pt" "check btrace pt support" {
@@ -2891,7 +2824,7 @@  gdb_caching_proc skip_btrace_pt_tests {
         }
     }
     gdb_exit
-    remote_file build delete $exe
+    remote_file build delete $obj
 
     verbose "$me:  returning $skip_btrace_tests" 2
     return $skip_btrace_tests
@@ -3407,9 +3340,10 @@  gdb_caching_proc universal_compile_options {
 
 # Compile the code in $code to a file based on $name.
 # Return 1 if code can be compiled
-# Delete all created files and objects.
+# Leave the file name of the resulting object in the global $obj.
 
-proc gdb_can_simple_compile {name code {type object} {compile_flags {}}} {
+proc gdb_simple_compile {name code {type object} {compile_flags {}}} {
+    global obj
 
     switch -regexp -- $type {
         "executable" {
@@ -3435,7 +3369,6 @@  proc gdb_can_simple_compile {name code {type object} {compile_flags {}}} {
     set lines [gdb_compile $src $obj $type $compile_flags]
 
     file delete $src
-    file delete $obj
 
     if ![string match "" $lines] then {
         verbose "$name:  compilation failed, returning 0" 2
@@ -3444,6 +3377,17 @@  proc gdb_can_simple_compile {name code {type object} {compile_flags {}}} {
     return 1
 }
 
+# Compile the code in $code to an object.
+# Return 1 if code can be compiled.
+# Delete all created files and objects.
+
+proc gdb_can_simple_compile {name code {type object} {compile_flags ""}} {
+    global obj
+    set ret [gdb_simple_compile $name $code $type $compile_flags]
+    file delete $obj
+    return $ret
+}
+
 # Some targets need to always link a special object in.  Save its path here.
 global gdb_saved_set_unbuffered_mode_obj
 set gdb_saved_set_unbuffered_mode_obj ""
@@ -5145,18 +5089,15 @@  gdb_caching_proc gdb_skip_xml_test {
 gdb_caching_proc gdb_has_argv0 {
     set result 0
 
-    # Set up, compile, and execute a test program to check whether
-    # argv[0] is available.
-    set src [standard_temp_file has_argv0[pid].c]
-    set exe [standard_temp_file has_argv0[pid].x]
+    # Compile and execute a test program to check whether argv[0] is available.
 
-    gdb_produce_source $src {
+    global obj
+    gdb_simple_compile has_argv0 {
 	int main (int argc, char **argv) {
 	    return 0;
 	}
-    }
+    } executable
 
-    gdb_compile $src $exe executable {debug}
 
     # Helper proc.
     proc gdb_has_argv0_1 { exe } {
@@ -5227,11 +5168,10 @@  gdb_caching_proc gdb_has_argv0 {
 	return $retval
     }
 
-    set result [gdb_has_argv0_1 $exe]
+    set result [gdb_has_argv0_1 $obj]
 
     gdb_exit
-    file delete $src
-    file delete $exe
+    file delete $obj
 
     if { !$result
       && ([istarget *-*-linux*]
@@ -5938,37 +5878,25 @@  proc core_find {binfile {deletefiles {}} {arg ""}} {
 # for linker symbol prefixes.
 
 gdb_caching_proc gdb_target_symbol_prefix {
-    # Set up and compile a simple test program...
-    set src [standard_temp_file main[pid].c]
-    set exe [standard_temp_file main[pid].x]
-
-    gdb_produce_source $src {
-	int main() {
-	    return 0;
-	}
+    # Compile a simple test program...
+    global obj
+    set src { int main() { return 0; } }
+    if {![gdb_simple_compile target_symbol_prefix $src executable]} {
+        return 0
     }
 
-    verbose "compiling testfile $src" 2
-    set compile_flags {debug nowarnings quiet}
-    set lines [gdb_compile $src $exe executable $compile_flags]
-
     set prefix ""
 
-    if ![string match "" $lines] then {
-        verbose "gdb_target_symbol_prefix: testfile compilation failed, returning null prefix" 2
-    } else {
-	set objdump_program [gdb_find_objdump]
-	set result [catch "exec $objdump_program --syms $exe" output]
+    set objdump_program [gdb_find_objdump]
+    set result [catch "exec $objdump_program --syms $obj" output]
 
-	if { $result == 0 \
-	     && ![regexp -lineanchor \
-	          { ([^ a-zA-Z0-9]*)main$} $output dummy prefix] } {
-	    verbose "gdb_target_symbol_prefix: Could not find main in objdump output; returning null prefix" 2
-	}
+    if { $result == 0 \
+	&& ![regexp -lineanchor \
+	     { ([^ a-zA-Z0-9]*)main$} $output dummy prefix] } {
+	verbose "gdb_target_symbol_prefix: Could not find main in objdump output; returning null prefix" 2
     }
 
-    file delete $src
-    file delete $exe
+    file delete $obj
 
     return $prefix
 }
@@ -5980,26 +5908,13 @@  gdb_caching_proc target_supports_scheduler_locking {
 
     set me "gdb_target_supports_scheduler_locking"
 
-    set src [standard_temp_file has_schedlock[pid].c]
-    set exe [standard_temp_file has_schedlock[pid].x]
-
-    gdb_produce_source $src {
-	int main () {
-	    return 0;
-	}
-    }
-
-    verbose "$me:  compiling testfile $src" 2
-    set compile_flags {debug nowarnings}
-    set lines [gdb_compile $src $exe executable $compile_flags]
-    file delete $src
-
-    if ![string match "" $lines] then {
-        verbose "$me:  testfile compilation failed, returning 0" 2
+    global obj
+    set src { int main() { return 0; } }
+    if {![gdb_simple_compile $me $src executable]} {
         return 0
     }
 
-    clean_restart $exe
+    clean_restart $obj
     gdb_start_cmd
 
     set supports_schedule_locking -1
@@ -6038,7 +5953,7 @@  gdb_caching_proc target_supports_scheduler_locking {
     }
 
     gdb_exit
-    remote_file build delete $exe
+    remote_file build delete $obj
     verbose "$me:  returning $supports_schedule_locking" 2
     return $supports_schedule_locking
 }