# Copyright 2019 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 . # Tests GDB's handling of 'set print max-depth'. # Only test C++ if we are able. Always use C. if { [skip_cplus_tests] || [get_compiler_info "c++"] } { set lang {c} } else { set lang {c c++} } foreach l $lang { set dir "$l" remote_exec host "rm -rf [standard_output_file ${dir}]" remote_exec host "mkdir -p [standard_output_file ${dir}]" } proc compile_and_run_tests { lang } { global testfile global srcfile global binfile global hex standard_testfile .c # Create the additional flags. set flags "debug" lappend flags $lang if { "$lang" == "c++" } { lappend flags "additional_flags=-std=c++11" } set dir "$lang" set binfile [standard_output_file ${dir}/${testfile}] if { [prepare_for_testing "failed to prepare" "${binfile}" "${srcfile}" "${flags}"] } { return 0 } # Advance to main. if { ![runto_main] } then { fail "can't run to main" return 0 } # The max-depth setting has no effect as the anonymous scopes are # ignored and the members are aggregated into the parent scope. gdb_print_expr_at_depths "s1" {"{...}" \ "{x = 0, y = 0}"\ "{x = 0, y = 0}"} gdb_print_expr_at_depths "s2" {"{...}" \ "{x = 0, y = 0, {z = 0, a = 0}}" \ "{x = 0, y = 0, {z = 0, a = 0}}"} gdb_print_expr_at_depths "s3" {"{...}" \ "{x = 0, y = 0, {z = 0, a = 0, {b = 0, c = 0}}}" \ "{x = 0, y = 0, {z = 0, a = 0, {b = 0, c = 0}}}" \ "{x = 0, y = 0, {z = 0, a = 0, {b = 0, c = 0}}}"} # Increasing max-depth unfurls more of the object. gdb_print_expr_at_depths "s4" {"{...}" \ "{x = 0, y = 0, l1 = {...}}" \ "{x = 0, y = 0, l1 = {x = 0, y = 0, l2 = {...}}}" \ "{x = 0, y = 0, l1 = {x = 0, y = 0, l2 = {x = 0, y = 0}}}"} # Check handling of unions, in this case 'raw' is printed instead of # just {...} as this is not useful. gdb_print_expr_at_depths "s5" {"{...}" \ "{{raw = {...}, {x = 0, y = 0, z = 0}}}" \ "{{raw = \\{0, 0, 0\\}, {x = 0, y = 0, z = 0}}}"} # Check handling of typedefs. gdb_print_expr_at_depths "s6" {"{...}" \ "{{raw = {...}, {x = 0, y = 0, z = 0}}}" \ "{{raw = \\{0, 0, 0\\}, {x = 0, y = 0, z = 0}}}"} # Multiple anonymous structures in parallel. gdb_print_expr_at_depths "s7" {"{...}" \ "{{x = 0, y = 0}, {z = 0, a = 0}, {b = 0, c = 0}}" \ "{{x = 0, y = 0}, {z = 0, a = 0}, {b = 0, c = 0}}"} # Flip flop between named and anonymous. Expected to unfurl to the # first non-anonymous type. gdb_print_expr_at_depths "s8" {"{...}" \ "{x = 0, y = 0, d1 = {...}}" \ "{x = 0, y = 0, d1 = {z = 0, a = 0, {b = 0, c = 0}}}"} # Imbalanced tree, this will unfurl one size more than the other as # one side has more anonymous levels. gdb_print_expr_at_depths "s9" {"{...}" \ "{x = 0, y = 0, {k = 0, j = 0, d1 = {...}}, d2 = {...}}" \ "{x = 0, y = 0, {k = 0, j = 0, d1 = {z = 0, a = 0, {b = 0, c = 0}}}, d2 = {z = 0, a = 0, {b = 0, c = 0}}}"} # Arrays are treated as an extra level, while scalars are not. gdb_print_expr_at_depths "s10" {"{...}" \ "{x = {...}, y = 0, {k = {...}, j = 0, d1 = {...}}, d2 = {...}}" \ "{x = \\{0, 0, 0, 0, 0, 0, 0, 0, 0, 0\\}, y = 0, {k = \\{0, 0, 0, 0, 0, 0, 0, 0, 0, 0\\}, j = 0, d1 = {z = 0, a = 0, {b = {...}, c = 0}}}, d2 = {z = 0, a = 0, {b = {...}, c = 0}}}" \ "{x = \\{0, 0, 0, 0, 0, 0, 0, 0, 0, 0\\}, y = 0, {k = \\{0, 0, 0, 0, 0, 0, 0, 0, 0, 0\\}, j = 0, d1 = {z = 0, a = 0, {b = \\{0, 0, 0, 0, 0, 0, 0, 0, 0, 0\\}, c = 0}}}, d2 = {z = 0, a = 0, {b = \\{0, 0, 0, 0, 0, 0, 0, 0, 0, 0\\}, c = 0}}}"} # Strings are treated as scalars. gdb_print_expr_at_depths "s11" {"{...}" \ "{x = 0, s = \"\\\\000\\\\000\\\\000\\\\000\\\\000\\\\000\\\\000\\\\000\\\\000\", {z = 0, a = 0}}"} if { $lang == "c++" } { gdb_print_expr_at_depths "c1" {"{...}" \ "{c1 = 1}" } gdb_print_expr_at_depths "c2" { "{...}" "{c2 = 2}" } gdb_print_expr_at_depths "c3" { "{...}" \ "{ = {...}, c3 = 3}" \ "{ = {c2 = 2}, c3 = 3}" } gdb_print_expr_at_depths "c4" { "{...}" "{c4 = 4}" } gdb_print_expr_at_depths "c5" { "{...}" \ "{ = {...}, c5 = 5}" \ "{ = {c4 = 4}, c5 = 5}" } gdb_print_expr_at_depths "c6" { "{...}" \ "{ = {...}, c6 = 6}" \ "{ = { = {...}, c5 = 5}, c6 = 6}" \ "{ = { = {c4 = 4}, c5 = 5}, c6 = 6}" } gdb_print_expr_at_depths "c7" { "{...}" \ "{ = {...}, = {...}, = {...}, c7 = 7}" \ "{ = {c1 = 1}, = { = {...}, c3 = 3}, = { = {...}, c6 = 6}, c7 = 7}" \ "{ = {c1 = 1}, = { = {c2 = 2}, c3 = 3}, = { = { = {...}, c5 = 5}, c6 = 6}, c7 = 7}" \ "{ = {c1 = 1}, = { = {c2 = 2}, c3 = 3}, = { = { = {c4 = 4}, c5 = 5}, c6 = 6}, c7 = 7}" } gdb_print_expr_at_depths "v1" [list "{...}" "{v1 = 1}" ] gdb_print_expr_at_depths "v2" [list "{...}" \ "{ = {...}, _vptr.V2 = $hex , v2 = 2}" \ "{ = {v1 = 1}, _vptr.V2 = $hex , v2 = 2}" ] gdb_print_expr_at_depths "v3" [list "{...}" \ "{ = {...}, _vptr.V3 = $hex , v3 = 3}" \ "{ = {v1 = 1}, _vptr.V3 = $hex , v3 = 3}" ] gdb_print_expr_at_depths "v4" [list "{...}" \ "{ = {...}, _vptr.V4 = $hex \]+>, v4 = 4}" \ "{ = { = {...}, _vptr.V2 = $hex , v2 = 2}, _vptr.V4 = $hex \]+>, v4 = 4}" \ "{ = { = {v1 = 1}, _vptr.V2 = $hex , v2 = 2}, _vptr.V4 = $hex \]+>, v4 = 4}" ] gdb_print_expr_at_depths "v5" [list "{...}" \ "{ = {...}, _vptr.V5 = $hex \]+>, v5 = 1}" \ "{ = { = {...}, _vptr.V2 = $hex , v2 = 2}, _vptr.V5 = $hex \]+>, v5 = 1}" \ "{ = { = {v1 = 1}, _vptr.V2 = $hex , v2 = 2}, _vptr.V5 = $hex \]+>, v5 = 1}" ] gdb_print_expr_at_depths "v6" [list "{...}" \ "{ = {...}, = {...}, _vptr.V6 = $hex \]+>, v6 = 1}" \ "{ = { = {...}, _vptr.V2 = $hex \]+>, v2 = 2}, = {_vptr.V3 = $hex , v3 = 3}, _vptr.V6 = $hex \]+>, v6 = 1}" \ "{ = { = {v1 = 1}, _vptr.V2 = $hex \]+>, v2 = 2}, = {_vptr.V3 = $hex , v3 = 3}, _vptr.V6 = $hex \]+>, v6 = 1}" ] gdb_print_expr_at_depths "v7" [list "{...}" \ "{ = {...}, = {...}, = {...}, _vptr.V7 = $hex \]+>, v7 = 1}" \ "{ = { = {...}, _vptr.V4 = $hex \]+>, v4 = 4}, = {_vptr.V5 = $hex \]+>, v5 = 1}, = { = {...}, _vptr.V6 = $hex \]+>, v6 = 1}, _vptr.V7 = $hex \]+>, v7 = 1}" \ "{ = { = { = {...}, _vptr.V2 = $hex \]+>, v2 = 2}, _vptr.V4 = $hex \]+>, v4 = 4}, = {_vptr.V5 = $hex \]+>, v5 = 1}, = { = {_vptr.V3 = $hex , v3 = 3}, _vptr.V6 = $hex \]+>, v6 = 1}, _vptr.V7 = $hex \]+>, v7 = 1}" \ "{ = { = { = {v1 = 1}, _vptr.V2 = $hex \]+>, v2 = 2}, _vptr.V4 = $hex \]+>, v4 = 4}, = {_vptr.V5 = $hex \]+>, v5 = 1}, = { = {_vptr.V3 = $hex , v3 = 3}, _vptr.V6 = $hex \]+>, v6 = 1}, _vptr.V7 = $hex \]+>, v7 = 1}" ] } } foreach_with_prefix l $lang { compile_and_run_tests $l }