Home | History | Annotate | Line # | Download | only in gdb.dwarf2
calling-convention.exp revision 1.1.1.2
      1  1.1.1.2  christos # Copyright 2022-2024 Free Software Foundation, Inc.
      2      1.1  christos 
      3      1.1  christos # This program is free software; you can redistribute it and/or modify
      4      1.1  christos # it under the terms of the GNU General Public License as published by
      5      1.1  christos # the Free Software Foundation; either version 3 of the License, or
      6      1.1  christos # (at your option) any later version.
      7      1.1  christos #
      8      1.1  christos # This program is distributed in the hope that it will be useful,
      9      1.1  christos # but WITHOUT ANY WARRANTY; without even the implied warranty of
     10      1.1  christos # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     11      1.1  christos # GNU General Public License for more details.
     12      1.1  christos #
     13      1.1  christos # You should have received a copy of the GNU General Public License
     14      1.1  christos # along with this program.  If not, see <http://www.gnu.org/licenses/>.
     15      1.1  christos 
     16      1.1  christos # This testcase checks that if a function has the DW_AT_calling_convention
     17      1.1  christos # attribute with the value DW_CC_nocall, then GDB will not:
     18      1.1  christos # - call the function,
     19      1.1  christos # - try to access the value returned by the function when using the finish
     20      1.1  christos #   command,
     21      1.1  christos # - force a user-provided return value when using the return command.
     22      1.1  christos #
     23      1.1  christos # In every case, GDB prints a message to the user indicating the issue.  For
     24      1.1  christos # the return command, GDB asks the user to confirm if the specified value
     25      1.1  christos # should be forced.
     26      1.1  christos 
     27      1.1  christos load_lib dwarf.exp
     28      1.1  christos 
     29      1.1  christos # This test can only be run on targets which support DWARF-2 and use gas.
     30  1.1.1.2  christos require dwarf2_support
     31      1.1  christos 
     32      1.1  christos standard_testfile .c .S
     33      1.1  christos 
     34      1.1  christos # First compile the .c file so we can ask GDB what is sizeof(int).
     35      1.1  christos if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } {
     36      1.1  christos     untested "failed to compile"
     37      1.1  christos     return -1
     38      1.1  christos }
     39      1.1  christos 
     40      1.1  christos # Make some DWARF for the test.
     41      1.1  christos set asm_file [standard_output_file $srcfile2]
     42      1.1  christos Dwarf::assemble $asm_file {
     43      1.1  christos     cu {} {
     44      1.1  christos 	compile_unit {
     45      1.1  christos 	    {language @DW_LANG_C}
     46      1.1  christos 	    {name "calling-convention"}
     47      1.1  christos 	} {
     48      1.1  christos 	    declare_labels int_label
     49      1.1  christos 
     50      1.1  christos 	    int_label: base_type {
     51      1.1  christos 		{byte_size [get_sizeof "int" 4] sdata}
     52      1.1  christos 		{encoding @DW_ATE_signed}
     53      1.1  christos 		{name "int"}
     54      1.1  christos 	    }
     55      1.1  christos 
     56      1.1  christos 	    subprogram {
     57      1.1  christos 		{MACRO_AT_func { foo }}
     58      1.1  christos 		{type :$int_label}
     59      1.1  christos 		{calling_convention @DW_CC_nocall}
     60      1.1  christos 	    }
     61      1.1  christos 
     62      1.1  christos 	    subprogram {
     63      1.1  christos 		{MACRO_AT_func { main }}
     64      1.1  christos 		{type :$int_label}
     65      1.1  christos 	    }
     66      1.1  christos 	}
     67      1.1  christos     }
     68      1.1  christos }
     69      1.1  christos 
     70      1.1  christos if { [prepare_for_testing "failed to prepare" ${testfile} \
     71      1.1  christos 	  [list $srcfile $asm_file] {nodebug}] } {
     72      1.1  christos     return -1
     73      1.1  christos }
     74      1.1  christos 
     75      1.1  christos if {![runto_main]} {
     76      1.1  christos     return -1
     77      1.1  christos }
     78      1.1  christos 
     79      1.1  christos gdb_test "call foo ()" \
     80      1.1  christos     "Cannot call the function 'foo' which does not follow the target calling convention."
     81      1.1  christos gdb_breakpoint "foo"
     82      1.1  christos gdb_continue_to_breakpoint "foo"
     83      1.1  christos 
     84      1.1  christos gdb_test "return 35" \
     85      1.1  christos        "Not confirmed" \
     86      1.1  christos        "return 35" \
     87      1.1  christos        [multi_line \
     88      1.1  christos            "Function 'foo' does not follow the target calling convention\\." \
     89      1.1  christos            "If you continue, setting the return value will probably lead to unpredictable behaviors\\." \
     90      1.1  christos            "Make foo return now\\? \\(y or n\\) $"] \
     91      1.1  christos        "n"
     92      1.1  christos 
     93      1.1  christos gdb_test "finish" [multi_line \
     94      1.1  christos     "Run till exit from #0  $hex in foo \\(\\)" \
     95      1.1  christos     "warning: Function 'foo' does not follow the target calling convention, cannot determine its returned value\." \
     96      1.1  christos     "$hex in main \\(\\)" \
     97      1.1  christos     "Value returned has type: int. Cannot determine contents"]
     98