# Copyright (C) 2016 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 symbol lookup when there are multiple circular imports.

load_lib "d-support.exp"
load_lib "dwarf.exp"

if { [skip_d_tests] } { continue }

# This test can only be run on targets which support DWARF-2 and use gas.
if {![dwarf2_support]} {
    return 0
}

standard_testfile circular.c circular-dw.S

# Make some DWARF for the test.
set asm_file [standard_output_file $srcfile2]
Dwarf::assemble $asm_file {
    cu {} {
	compile_unit {
	    {language @DW_LANG_D}
	} {
	    declare_labels circular1_label circular2_label circular3_label
	    declare_labels circular4_label circular5_label

	    extern circular1_found_start circular1_found_end

	    circular1_label: module {
		{name circular1}
	    } {
		imported_module {
		    {import :$circular2_label}
		}
		imported_module {
		    {import :$circular3_label}
		}
		imported_module {
		    {import :$circular4_label}
		}
		imported_module {
		    {import :$circular5_label}
		}

		subprogram {
		    {name found}
		    {external 1 flag_present}
		    {low_pc circular1_found_start addr}
		    {high_pc circular1_found_end addr}
		}
	    }

	    circular2_label: module {
		{name circular2}
	    } {
		imported_module {
		    {import :$circular1_label}
		}
		imported_module {
		    {import :$circular3_label}
		}
		imported_module {
		    {import :$circular4_label}
		}
		imported_module {
		    {import :$circular5_label}
		}
	    }

	    circular3_label: module {
		{name circular3}
	    } {
		imported_module {
		    {import :$circular1_label}
		}
		imported_module {
		    {import :$circular2_label}
		}
		imported_module {
		    {import :$circular4_label}
		}
		imported_module {
		    {import :$circular5_label}
		}
	    }

	    circular4_label: module {
		{name circular4}
	    } {
		imported_module {
		    {import :$circular1_label}
		}
		imported_module {
		    {import :$circular2_label}
		}
		imported_module {
		    {import :$circular3_label}
		}
		imported_module {
		    {import :$circular5_label}
		}
	    }

	    circular5_label: module {
		{name circular5}
	    } {
		imported_module {
		    {import :$circular1_label}
		}
		imported_module {
		    {import :$circular2_label}
		}
		imported_module {
		    {import :$circular3_label}
		}
		imported_module {
		    {import :$circular4_label}
		}
	    }
	}
    }
}

if { [prepare_for_testing ${testfile}.exp ${testfile} \
          [list $srcfile $asm_file] {nodebug}] } {
    return -1
}

gdb_test_no_output "set language d"

if {![runto "circular1.found"]} {
    return -1
}

# This last test shouldn't timeout.
gdb_test "print notfound" "No symbol \"notfound\" in current context."
