Detect and report incompatible gdb_compile options
authorGary Benson <gbenson@redhat.com>
Mon, 2 Nov 2020 14:19:29 +0000 (14:19 +0000)
committerGary Benson <gbenson@redhat.com>
Mon, 2 Nov 2020 14:19:29 +0000 (14:19 +0000)
In commits 221db974e653659edb280787af1b3efdd1615083 and
68d654afdfcff840ebb3ae432ed72dca0521d670, these patches:

    2020-06-24  Pedro Alves  <palves@redhat.com>

* lib/gdb.exp (gdb_compile): Pass "-x c++" explicitly when
compiling C++ programs.

    2020-09-25  Gary Benson <gbenson@redhat.com>

* lib/gdb.exp (gdb_compile): Pass "-x c++" earlier, and only
for .c files.

attempted to fix problems with testcases that compile .c files
using the C++ compiler.  These patches cause gdb_compile to add
"-x c++" to the compiler options when using Clang.  This fix does
not work for gdb.base/print-file-var.exp, however, which attempts
to compile a .c input file to an executable linked with shared
libraries: the resulting command caused the compiler to attempt
to parse the .so files as C++.  This commit causes gdb_compile
to reject this combination of options.

gdb/testsuite/ChangeLog:

* lib/gdb.exp (gdb_compile): Inhibit passing "-x c++"
for .c files compiled as C++ with Clang if any shared
libraries are specified.

gdb/testsuite/ChangeLog
gdb/testsuite/lib/gdb.exp

index be14e5a433ac2140c447fa75b8c8cc951ed1e334..330a5eb79ee0163fa104446cab31ef5452e72bfe 100644 (file)
@@ -1,3 +1,9 @@
+2020-11-02  Gary Benson <gbenson@redhat.com>
+
+       * lib/gdb.exp (gdb_compile): Inhibit passing "-x c++"
+       for .c files compiled as C++ with Clang if any shared
+       libraries are specified.
+
 2020-11-02  Gary Benson <gbenson@redhat.com>
 
        * lib/attributes.h: New header.
index 003bd3069ece3dbbf646626ff27f09561e0b9ece..6c98ae0729b3928376438ed6aa5aa36be34c7df0 100644 (file)
@@ -3960,9 +3960,20 @@ proc gdb_compile {source dest type options} {
     # explicitly force C++ language.
     if { [lsearch -exact $options getting_compiler_info] == -1
         && [lsearch -exact $options c++] != -1
-        && [string match *.c $source] != 0
-        && [test_compiler_info "clang-*"] } {
-       lappend new_options early_flags=-x\ c++
+        && [string match *.c $source] != 0 } {
+
+       # gdb_compile cannot handle this combination of options, the
+       # result is a command like "clang -x c++ foo.c bar.so -o baz"
+       # which tells Clang to treat bar.so as C++.  The solution is
+       # to call gdb_compile twice--once to compile, once to link--
+       # either directly, or via build_executable_from_specs.
+       if { [lsearch $options shlib=*] != -1 } {
+           error "incompatible gdb_compile options"
+       }
+
+       if {[test_compiler_info "clang-*"]} {
+           lappend new_options early_flags=-x\ c++
+       }
     }
 
     # Place (and look for) Fortran `.mod` files in the output