# This file is part of ltrace.
# Copyright (C) 2013 Petr Machata, Red Hat 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 2 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, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301 USA

proc do_tests {bin appendage} {
    ltraceMatch1 [ltraceRun -e *xyz -- $bin] {xyz\(} == 2

    # If the actual entry point that xyz resolves to is not traced, it
    # should get xyz's name.  But we don't mind if somebody implements
    # the late lookup and actually names the symbol properly.

    set log [ltraceRun -L -x xyz -- $bin]
    ltraceMatch1 $log [format {xyz\.IFUNC%s\(\)} $appendage] == 1
    ltraceMatch1 $log [format {(xyz|abc)%s\(} $appendage] == 2

    # If we request abc's tracing explicitly, than it definitely needs
    # to be presented as abc, not as xyz.

    set log [ltraceRun -L -x xyz+abc -- $bin]
    ltraceMatch1 $log [format {xyz\.IFUNC%s\(\)} $appendage] == 1
    ltraceMatch1 $log [format {abc%s\(} $appendage] == 2
}

set src [ltraceSource c {
    int abc (int a) { return a + 1; }

    __asm__(".type xyz, \%gnu_indirect_function");

    int xyz (int a);
    extern void *xyz_ifunc(void) __asm__("xyz");
    extern void *xyz_ifunc(void) {
	return &abc;
    }

    int
    main(int argc, char *argv[])
    {
      return xyz (xyz (argc));
    }
}]

foreach ext {{} .pie} {
	set bin1 [ltraceCompile $ext $src]
	do_tests $bin1 ""
}

set lib [ltraceCompile lib.so $src]

foreach ext {{} .pie} {
    set bin2 [ltraceCompile $ext $lib [ltraceSource c {/* Empty.  */}]]
    do_tests $bin2 @lib.so
}

ltraceDone
