[gdb/contrib] Use temp dir for gdb-add-index in cc-with-tweaks.sh

Message ID 20200417114635.GA32265@delia
State New
Headers show
Series
  • [gdb/contrib] Use temp dir for gdb-add-index in cc-with-tweaks.sh
Related show

Commit Message

Tom de Vries April 17, 2020, 11:46 a.m.
Hi,

When running test-case gdb.dwarf2/gdb-index.exp cleanly by issuing this
command:
...
$ rm -Rf build/gdb/testsuite/outputs/gdb.dwarf2/gdb-index
...
before running, it passes both with native and target board
cc-with-gdb-index.

But when we run the test-case first with native and then with
cc-with-gdb-index without intermediate cleanup, we get instead:
...
 Running src/gdb/testsuite/gdb.dwarf2/gdb-index.exp ...
 gdb compile failed, cc-with-tweaks.sh: Index file \
   build/gdb/testsuite/outputs/gdb.dwarf2/gdb-index/gdb-index.gdb-index \
   exists, won't clobber.

                 === gdb Summary ===

 # of untested testcases         1
...

What happens is that the native run produces a file
build/gdb/testsuite/outputs/gdb.dwarf2/gdb-index/gdb-index.gdb-index, which
causes gdb/contrib/cc-with-tweaks.sh to hit this code:
...
index_file="${output_file}.gdb-index"
if [ "$want_index" = true ] && [ -f "$index_file" ]
then
    echo "$myname: Index file $index_file exists, won't clobber." >&2
    exit 1
fi
...

The gdb-add-index script has a problem that it uses temp files alongside the
executable, filed as PR25843.

The code in cc-with-tweaks.sh attempts to detect the case that creating such a
temp file would overwrite an pre-existing file.  It however does this only for
a single file, while gdb-add-index uses more temporary files:
- <exec>.gdb-index
- <exec>.debug_names
- <exec>.debug_str
- <exec>.debug_str.merge
- <exec>.debug_str.err

Fix this by working around PR25843 in a more generic way:
- move the executable into a temp directory
- execute gdb-add-index, allowing it to create any temp file alongside the
  executable in the temp directory
- move the executable back to the original location

Tested on x86_64-linux, with target board cc-with-debug-index.

Any comments?

Thanks,
- Tom

[gdb/contrib] Use temp dir for gdb-add-index in cc-with-tweaks.sh

gdb/ChangeLog:

2020-04-17  Tom de Vries  <tdevries@suse.de>

	* contrib/cc-with-tweaks.sh: Remove <exec>.gdb-index file handling.
	Run gdb-add-index inside temp dir.

---
 gdb/contrib/cc-with-tweaks.sh | 14 +++++---------
 1 file changed, 5 insertions(+), 9 deletions(-)

Comments

Tom de Vries April 24, 2020, 9:32 a.m. | #1
On 17-04-2020 13:46, Tom de Vries wrote:
> Hi,

> 

> When running test-case gdb.dwarf2/gdb-index.exp cleanly by issuing this

> command:

> ...

> $ rm -Rf build/gdb/testsuite/outputs/gdb.dwarf2/gdb-index

> ...

> before running, it passes both with native and target board

> cc-with-gdb-index.

> 

> But when we run the test-case first with native and then with

> cc-with-gdb-index without intermediate cleanup, we get instead:

> ...

>  Running src/gdb/testsuite/gdb.dwarf2/gdb-index.exp ...

>  gdb compile failed, cc-with-tweaks.sh: Index file \

>    build/gdb/testsuite/outputs/gdb.dwarf2/gdb-index/gdb-index.gdb-index \

>    exists, won't clobber.

> 

>                  === gdb Summary ===

> 

>  # of untested testcases         1

> ...

> 

> What happens is that the native run produces a file

> build/gdb/testsuite/outputs/gdb.dwarf2/gdb-index/gdb-index.gdb-index, which

> causes gdb/contrib/cc-with-tweaks.sh to hit this code:

> ...

> index_file="${output_file}.gdb-index"

> if [ "$want_index" = true ] && [ -f "$index_file" ]

> then

>     echo "$myname: Index file $index_file exists, won't clobber." >&2

>     exit 1

> fi

> ...

> 

> The gdb-add-index script has a problem that it uses temp files alongside the

> executable, filed as PR25843.

> 

> The code in cc-with-tweaks.sh attempts to detect the case that creating such a

> temp file would overwrite an pre-existing file.  It however does this only for

> a single file, while gdb-add-index uses more temporary files:

> - <exec>.gdb-index

> - <exec>.debug_names

> - <exec>.debug_str

> - <exec>.debug_str.merge

> - <exec>.debug_str.err

> 

> Fix this by working around PR25843 in a more generic way:

> - move the executable into a temp directory

> - execute gdb-add-index, allowing it to create any temp file alongside the

>   executable in the temp directory

> - move the executable back to the original location

> 

> Tested on x86_64-linux, with target board cc-with-debug-index.

> 

> Any comments?

> 


Committed.

Thanks,
- Tom
> 

> [gdb/contrib] Use temp dir for gdb-add-index in cc-with-tweaks.sh

> 

> gdb/ChangeLog:

> 

> 2020-04-17  Tom de Vries  <tdevries@suse.de>

> 

> 	* contrib/cc-with-tweaks.sh: Remove <exec>.gdb-index file handling.

> 	Run gdb-add-index inside temp dir.

> 

> ---

>  gdb/contrib/cc-with-tweaks.sh | 14 +++++---------

>  1 file changed, 5 insertions(+), 9 deletions(-)

> 

> diff --git a/gdb/contrib/cc-with-tweaks.sh b/gdb/contrib/cc-with-tweaks.sh

> index 7cad3ac7ee..2998a9d218 100755

> --- a/gdb/contrib/cc-with-tweaks.sh

> +++ b/gdb/contrib/cc-with-tweaks.sh

> @@ -144,13 +144,6 @@ then

>      exit $?

>  fi

>  

> -index_file="${output_file}.gdb-index"

> -if [ "$want_index" = true ] && [ -f "$index_file" ]

> -then

> -    echo "$myname: Index file $index_file exists, won't clobber." >&2

> -    exit 1

> -fi

> -

>  output_dir="${output_file%/*}"

>  [ "$output_dir" = "$output_file" ] && output_dir="."

>  

> @@ -176,12 +169,16 @@ if [ "$want_objcopy_compress" = true ]; then

>  fi

>  

>  if [ "$want_index" = true ]; then

> +    get_tmpdir

> +    mv "$output_file" "$tmpdir"

> +    tmpfile="$tmpdir/$(basename $output_file)"

>      # Filter out these messages which would stop dejagnu testcase run:

>      # echo "$myname: No index was created for $file" 1>&2

>      # echo "$myname: [Was there no debuginfo? Was there already an index?]" 1>&2

> -    GDB=$GDB $GDB_ADD_INDEX $index_options "$output_file" 2>&1 \

> +    GDB=$GDB $GDB_ADD_INDEX $index_options "$tmpfile" 2>&1 \

>  	| grep -v "^${GDB_ADD_INDEX##*/}: " >&2

>      rc=${PIPESTATUS[0]}

> +    mv "$tmpfile" "$output_file"

>      [ $rc != 0 ] && exit $rc

>  fi

>  

> @@ -237,5 +234,4 @@ if [ "$want_dwp" = true ]; then

>      fi

>  fi

>  

> -rm -f "$index_file"

>  exit $rc

>

Patch

diff --git a/gdb/contrib/cc-with-tweaks.sh b/gdb/contrib/cc-with-tweaks.sh
index 7cad3ac7ee..2998a9d218 100755
--- a/gdb/contrib/cc-with-tweaks.sh
+++ b/gdb/contrib/cc-with-tweaks.sh
@@ -144,13 +144,6 @@  then
     exit $?
 fi
 
-index_file="${output_file}.gdb-index"
-if [ "$want_index" = true ] && [ -f "$index_file" ]
-then
-    echo "$myname: Index file $index_file exists, won't clobber." >&2
-    exit 1
-fi
-
 output_dir="${output_file%/*}"
 [ "$output_dir" = "$output_file" ] && output_dir="."
 
@@ -176,12 +169,16 @@  if [ "$want_objcopy_compress" = true ]; then
 fi
 
 if [ "$want_index" = true ]; then
+    get_tmpdir
+    mv "$output_file" "$tmpdir"
+    tmpfile="$tmpdir/$(basename $output_file)"
     # Filter out these messages which would stop dejagnu testcase run:
     # echo "$myname: No index was created for $file" 1>&2
     # echo "$myname: [Was there no debuginfo? Was there already an index?]" 1>&2
-    GDB=$GDB $GDB_ADD_INDEX $index_options "$output_file" 2>&1 \
+    GDB=$GDB $GDB_ADD_INDEX $index_options "$tmpfile" 2>&1 \
 	| grep -v "^${GDB_ADD_INDEX##*/}: " >&2
     rc=${PIPESTATUS[0]}
+    mv "$tmpfile" "$output_file"
     [ $rc != 0 ] && exit $rc
 fi
 
@@ -237,5 +234,4 @@  if [ "$want_dwp" = true ]; then
     fi
 fi
 
-rm -f "$index_file"
 exit $rc