| # Copyright 2022-2023 Free Software Foundation, Inc. |
| # |
| # This program is free software; you can redistribute it and/or modify |
| # it under the terms of the GNU General Public License as published by |
| # the Free Software Foundation; either version 3 of the License, or |
| # (at your option) any later version. |
| # |
| # This program is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with this program. If not, see <http://www.gnu.org/licenses/>. |
| |
| # Test floating-point literal extension. |
| |
| load_lib "ada.exp" |
| |
| require allow_ada_tests |
| |
| standard_ada_testfile prog |
| |
| if {[gdb_compile_ada "${srcfile}" "${binfile}" executable {debug}] != ""} { |
| return -1 |
| } |
| |
| # Given a floating point EXPRESSION, return the size of the result. |
| |
| proc float_size { expression } { |
| |
| set size 0 |
| gdb_test_multiple "ptype ${expression}" "" { |
| -re -wrap "<16-byte float>" { |
| set size 16 |
| } |
| -re -wrap "<12-byte float>" { |
| set size 12 |
| } |
| -re -wrap "<\\d+-byte float>" { |
| # Assume 8 for anything less than or equal to 8. |
| set size 8 |
| } |
| } |
| |
| return $size |
| } |
| |
| clean_restart ${testfile} |
| |
| set bp_location [gdb_get_line_number "BREAK" ${testdir}/prog.adb] |
| runto "prog.adb:$bp_location" |
| |
| gdb_test "print 16f#41b80000#" " = 23.0" |
| gdb_test "print val_float" " = 23.0" |
| gdb_test "print val_float := 16f#41b80000#" " = 23.0" |
| gdb_test "print val_float" " = 23.0" \ |
| "print val_float after assignment" |
| |
| gdb_test "print 16lf#bc0d83c94fb6d2ac#" " = -2.0e-19" |
| gdb_test "print val_double" " = -2.0e-19" |
| gdb_test "print val_double := 16lf#bc0d83c94fb6d2ac#" " = -2.0e-19" |
| gdb_test "print val_double" " = -2.0e-19" \ |
| "print val_double after assignment" |
| |
| # Fetch the size of a compiler-generated long double. |
| set compiler_long_double_size [float_size "long_long_float" ] |
| |
| # Fetch the size of an internal long double type in GDB. |
| set gdb_long_double_size [float_size "16llf#0#" ] |
| |
| # Different architectures use different long double formats. For |
| # example, IEEE quad versus i387 long doubles. Account for that in the |
| # tests below. |
| |
| # Get the used long double format. |
| set long_double_format "" |
| set cmd "maint print architecture" |
| gdb_test_multiple $cmd "" { |
| -re "^[string_to_regexp $cmd](?=\r\n)" { |
| exp_continue |
| } |
| -re "^\r\ngdbarch_dump: long_double_format = (\[^\r\n\]*)(?=\r\n)" { |
| set long_double_format $expect_out(1,string) |
| exp_continue |
| } |
| -re "^\r\n$gdb_prompt $" { |
| pass $gdb_test_name |
| } |
| -re "^\r\n(\[^\r\n\]*)(?=\r\n)" { |
| exp_continue |
| } |
| } |
| |
| # Set default values for 128-bit IEEE quad long doubles. |
| set valid_long_double "16llf#4000921fb54442d18469898cc51701b8#" |
| set printed_long_double "3.1415926535897932384626433832795028" |
| set invalid_long_double "" |
| set has_invalid_long_double 0 |
| |
| switch -glob $long_double_format { |
| floatformat_ibm_long_double_* { |
| set w1 c1e1c00000000000 |
| set w2 4544adf4b7320335 |
| switch $long_double_format { |
| floatformat_ibm_long_double_big { |
| set valid_long_double "16llf#$w2$w1#" |
| } |
| floatformat_ibm_long_double_little { |
| set valid_long_double "16llf#$w1$w2#" |
| } |
| } |
| set printed_long_double "50000000000000000000000000.0" |
| } |
| } |
| |
| if { [istarget x86_64-*-* ] || [istarget i?86-*-*] } { |
| # i387 long double have invalid values |
| set has_invalid_long_double 1 |
| if { $compiler_long_double_size == 16 } { |
| # 5.0e+25 in i387 128-bit long double. |
| set valid_long_double "16llf#7ffff7ff4054a56fa5b99019a5c8#" |
| set invalid_long_double "16llf#a56fa5b99019a5c800007ffff7ff4054#" |
| set printed_long_double "5.0e\\+25" |
| } elseif { $compiler_long_double_size == 12 } { |
| # 5.0e+25 in i387 80-bit long double. |
| set valid_long_double "16llf#56554054a56fa5b99019a5c8#" |
| set invalid_long_double "16llf#9019a5c800007ffff7ff4054#" |
| set printed_long_double "5.0e\\+25" |
| } |
| } |
| |
| # Exercise GDB-side long doubles. |
| if { $gdb_long_double_size > 8 } { |
| gdb_test "print ${valid_long_double}" " = ${printed_long_double}" |
| gdb_test "print \$foo:=${valid_long_double}" "= ${printed_long_double}" |
| gdb_test "print \$foo" "= ${printed_long_double}" \ |
| "print internal long double variable after assignment" |
| } |
| |
| # Exercise compiler-side long doubles. |
| if { $compiler_long_double_size > 8 } { |
| gdb_test "print val_long_double" " = 5.0e\\+25" |
| gdb_test "print val_long_double := ${valid_long_double}" \ |
| " = ${printed_long_double}" |
| gdb_test "print val_long_double" " = ${printed_long_double}" \ |
| "print val_long_double after assignment" |
| } |
| |
| # If the target has invalid long double values, test it now. |
| if { $has_invalid_long_double } { |
| gdb_test "print ${invalid_long_double}" \ |
| " = <invalid float value>" "print invalid long double value" |
| } |