# Copyright (C) 2025-2026 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/>.

# Tests for gdb.printing.make_visualizer; specifically that the
# optimized-out and synthetic pointer cases work properly.

load_lib dwarf.exp
load_lib gdb-python.exp

require dwarf2_support
require allow_python_tests

# Use a simple plain-"main" source file.
standard_testfile py-progspace.c -dw.S

if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug}]} {
    return
}

if {![runto_main]} {
    return
}

# Get size to create fake DWARF for the test.
set ptr_size [get_sizeof "void *" 96]

set asm_file [standard_output_file ${srcfile2}]
Dwarf::assemble $asm_file {
    cu {} {
	compile_unit {} {
	    declare_labels i32_type i32_array \
		struct_label variable_label pointer_label

	    i32_type: DW_TAG_base_type {
		DW_AT_name "int32_t"
		DW_AT_encoding @DW_ATE_signed
		DW_AT_byte_size 4 DW_FORM_sdata
	    }

	    i32_array: DW_TAG_array_type {
		DW_AT_name array_type
		DW_AT_type :$i32_type
	    } {
		DW_TAG_subrange_type {
		    DW_AT_type :$i32_type
		    DW_AT_lower_bound 0 DW_FORM_data1
		    DW_AT_upper_bound 3 DW_FORM_data1
		}
	    }

	    # Used for testing optimized-out elements of an array.
	    DW_TAG_variable {
		DW_AT_name i32_noptr
		DW_AT_type :$i32_array
		DW_AT_location {
		    DW_OP_constu 1779823878
		    DW_OP_stack_value
		    DW_OP_piece 4
		} SPECIAL_expr
	    }

	    struct_label: DW_TAG_structure_type {
		DW_AT_name i32_noptr
		DW_AT_byte_size 4 DW_FORM_sdata
	    } {
		DW_TAG_member {
		    DW_AT_name f
		    DW_AT_type :$i32_type
		    DW_AT_data_member_location 0 DW_FORM_data1
		}
	    }

	    pointer_label: DW_TAG_pointer_type {
		DW_AT_byte_size $::ptr_size DW_FORM_sdata
		DW_AT_type :$struct_label
	    }

	    variable_label: DW_TAG_variable {
		DW_AT_name v
		DW_AT_location {
		    DW_OP_implicit_value 0x1 0x1 0x1 0x1
		} SPECIAL_expr
		DW_AT_type :$struct_label
	    }

	    # Used for testing synthetic pointers.
	    DW_TAG_variable {
		DW_AT_name synthptr
		DW_AT_location {
		    DW_OP_GNU_implicit_pointer $variable_label 0
		} SPECIAL_expr
		DW_AT_type :$pointer_label
	    }

	    # Optimized-out pointer.
	    DW_TAG_variable {
		DW_AT_name optoutptr
		DW_AT_location { } SPECIAL_expr
		DW_AT_type :$pointer_label
	    }
	}
    }
}

if {[prepare_for_testing "failed to prepare" ${testfile} \
	 [list $srcfile $asm_file] {nodebug}]} {
    return
}

# Need a frame to evaluate a synthetic pointer.
if {![runto_main]} {
    return
}

gdb_test_no_output "python import gdb"
gdb_test_no_output "python import gdb.printing"

gdb_test_no_output "python val = gdb.parse_and_eval('i32_noptr')" \
    "fetch i32_noptr"
gdb_test_no_output "python vz = gdb.printing.make_visualizer(val)" \
    "create i32_noptr visualizer"
gdb_test "python print(isinstance(vz, gdb.printing.NoOpArrayPrinter))" \
    True \
    "i32_noptr uses array printer"

gdb_test_no_output "python vz1 = gdb.printing.make_visualizer(val\[0\])" \
    "create visualizer for valid element"
gdb_test "python print(isinstance(vz1, gdb.printing.NoOpScalarPrinter))" \
    True \
    "valid element uses scalar printer"
gdb_test "python print(vz1.to_string())" \
    1779823878 \
    "string form of valid element"

gdb_test_no_output "python vz2 = gdb.printing.make_visualizer(val\[1\])" \
    "create visualizer for optimized-out element"
gdb_test "python print(isinstance(vz2, gdb.printing.NoOpScalarPrinter))" \
    True \
    "optimized-out element uses scalar printer"
gdb_test "python print(vz2.to_string())" \
    "<optimized out>" \
    "string form of optimized-out element"

gdb_test_no_output "python val2 = gdb.parse_and_eval('synthptr')" \
    "fetch synthetic pointer"
gdb_test_no_output "python vzv2 = gdb.printing.make_visualizer(val2)" \
    "create synthetic pointer visualizer"
gdb_test "python print(isinstance(vzv2, gdb.printing.NoOpPointerReferencePrinter))" \
    True \
    "synthetic pointer uses pointer printer"
gdb_test "python print(vzv2.child(0)\[1\])" \
    "{f = 16843009}" \
    "child of synthetic pointer"

gdb_test_no_output "python val3 = gdb.parse_and_eval('optoutptr')" \
    "fetch optimized-out pointer"
gdb_test_no_output "python vzv3 = gdb.printing.make_visualizer(val3)" \
    "create optimized-out pointer visualizer"
gdb_test "python print(isinstance(vzv3, gdb.printing.NoOpScalarPrinter))" \
    True \
    "optimized-out pointer uses scalar printer"
gdb_test "python print(vzv3.to_string())" \
    "<optimized out>" \
    "string representation of optimized-out pointer"
