⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 macscp.exp

📁 这个是LINUX下的GDB调度工具的源码
💻 EXP
字号:
# Test macro scoping.# Copyright 2002 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 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  # Please email any bugs, comments, and/or additions to this file to:# bug-gdb@prep.ai.mit.eduif $tracelevel then {    strace $tracelevel}set prms_id 0set bug_id 0set testfile "macscp"set binfile ${objdir}/${subdir}/${testfile}if  {[gdb_compile "${srcdir}/${subdir}/macscp1.c" "${binfile}" executable {debug}] != "" } {    gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."}gdb_exitgdb_startgdb_reinitialize_dir $srcdir/$subdirgdb_load ${binfile}# Ask GDB to show the current definition of MACRO, and return a list# describing the result.## The return value has the form {FILE1 FILE2 ... DEF}, which means# that MACRO has the definition `DEF', and was defined in `FILE1',# which was included from `FILE2', included from ... .## If GDB says that MACRO has no definition, return the string `undefined'.## If GDB complains that it doesn't have any information about# preprocessor macro definitions, return the string `no-macro-info'.# # If expect times out waiting for GDB, we return the string `timeout'.## If GDB's output doesn't otherwise match what we're expecting, we# return the empty string.proc info_macro {macro} {    global gdb_prompt    global decimal    set filepat {macscp[0-9]+\.[ch]}    set definition {}    set location {}    send_gdb "info macro ${macro}\n"    set debug_me 0    if {$debug_me} {exp_internal 1}    gdb_expect {        -re "Defined at \[^\r\n\]*(${filepat}):${decimal}\[\r\n\]" {            # `location' and `definition' should be empty when we see            # this message.            if {[llength $location] == 0 && [llength $definition] == 0} {                set location $expect_out(1,string)                exp_continue            } else {                # Exit this expect loop, with a result indicating failure.                set definition {}            }        }        -re "The symbol `${macro}' has no definition as a C/C\\+\\+ preprocessor macro\[^\r\n\]*\[\r\n\]" {            # `location' and `definition' should be empty when we see            # this message.            if {[llength $location] == 0 && [llength $definition] == 0} {                set definition undefined                exp_continue            } else {                # Exit this expect loop, with a result indicating failure.                set definition {}            }        }        -re "^\[\r\n\]*  included at \[^\r\n\]*(${filepat}):${decimal}\[\r\n\]" {            # `location' should *not* be empty when we see this            # message.  It should have recorded at least the initial            # `Defined at ' message (for definitions) or ` at' message            # (for undefined symbols).            if {[llength $location] != 0} {                lappend location $expect_out(1,string)                exp_continue            } else {                # Exit this expect loop, with a result indicating failure.                set definition {}            }        }        -re "^\[\r\n\]*at \[^\r\n\]*(${filepat}):${decimal}\[\r\n\]" {            # This appears after a `has no definition' message.            # `location' should be empty when we see it.            if {[string compare $definition undefined] == 0 \                    && [llength $location] == 0} {                set location $expect_out(1,string)                exp_continue            } else {                # Exit this expect loop, with a result indicating failure.                set definition {}            }        }        -re "#define ${macro} (\[^\r\n\]*)\[\r\n\]" {            # `definition' should be empty when we see this message.            if {[string compare $definition ""] == 0} {                set definition $expect_out(1,string)                exp_continue            } else {                # Exit this expect loop, with a result indicating failure.                set definition {}            }        }        -re "has no preprocessor macro information.*$gdb_prompt $" {            set definition no-macro-info        }        -re "$gdb_prompt $" {            # Exit the expect loop; let the existing value of `definition'            # indicate failure or success.        }        timeout {            set definition timeout        }    }    if {$debug_me} {exp_internal 0}    switch -exact -- $definition {        no-macro-info { return no-macro-info }        timeout { return timeout }        undefined -        default {            if {[llength $location] >= 1} {                return [concat $location [list $definition]]            } else {                return {}            }        }    }}# Call info_macro to show the definition of MACRO.  Expect a result of# EXPECTED.  Use WHERE in pass/fail messages to identify the context.# Return non-zero if we should abort the entire test file, or zero if# we can continue.proc check_macro {macro expected where} {    set func_def [info_macro $macro]    if {[string compare $func_def $expected] == 0} {        pass "info macro $macro $where"    } else {        switch -exact -- $func_def {            no-macro-info {                xfail "executable includes no macro debugging information"                return 1            }            timeout {                fail "info macro $macro $where (timeout)"            }            default {                fail "info macro $macro $where"            }        }    }    return 0}    # List the function FUNC, and then show the definition of MACRO,# expecting the result EXPECTED.proc list_and_check_macro {func macro expected} {    gdb_test "list $func" ".*${func}.*"    return [check_macro $macro $expected "after `list $func'"]}if {[list_and_check_macro main WHERE {macscp1.c {before macscp1_3}}]} {    return 0}list_and_check_macro macscp2_2 WHERE {macscp2.h macscp1.c {before macscp2_2}}list_and_check_macro macscp3_2 WHERE {macscp3.h macscp1.c {before macscp3_2}}# Although GDB's macro table structures distinguish between multiple# #inclusions of the same file, GDB's other structures don't.  So the# `list' command here doesn't reliably select one #inclusion or the# other, even though it could.  It would be nice to eventually change# GDB's structures to handle this correctly.gdb_test "list macscp4_2_from_macscp2" ".*macscp4_2_, MACSCP4_INCLUSION.*"switch -exact -- [info_macro WHERE] {    {macscp4.h macscp2.h macscp1.c {before macscp4_2_..., from macscp2.h}} {        pass "info macro WHERE after `list macscp_4_2_from_macscp2'"    }    {macscp4.h macscp3.h macscp1.c {before macscp4_2_..., from macscp3.h}} {        # setup_kfail "gdb/555"        fail "info macro WHERE after `list macscp_4_2_from_macscp2' (gdb/555)"    }    timeout {         fail "info macro WHERE after `list macscp_4_2_from_macscp2' (timeout)"    }    default { fail "info macro WHERE after `list macscp_4_2_from_macscp2'" }}gdb_test "list macscp4_2_from_macscp3" ".*macscp4_2_, MACSCP4_INCLUSION.*"switch -exact -- [info_macro WHERE] {    {macscp4.h macscp3.h macscp1.c {before macscp4_2_..., from macscp3.h}} {        pass "info macro WHERE after `list macscp_4_2_from_macscp3'"    }    {macscp4.h macscp2.h macscp1.c {before macscp4_2_..., from macscp2.h}} {        # setup_kfail "gdb/555"        fail "info macro WHERE after `list macscp_4_2_from_macscp3' (gdb/555)"    }    timeout {        fail "info macro WHERE after `list macscp_4_2_from_macscp3' (timeout)"    }    default { fail "info macro WHERE after `list macscp_4_2_from_macscp3'" }}#### Test the selection of the macro scope by the current frame.### A table of functions, in the order they will be reached, which is### also the order they appear in the preprocessed output.  Each entry### has the form {FUNCNAME WHERE KFAILWHERE}, where:### - FUNCNAME is the name of the function,### - WHERE is the definition we expect to see for the macro `WHERE', as###   returned by `info_macro', and### - KFAILWHERE is an alternate definition which should be reported###   as a `known failure', due to GDB's inability to distinguish multiple###   #inclusions of the same file.### KFAILWHERE may be omitted.set funcs {    {        macscp1_1        {macscp1.c {before macscp1_1}}    }    {        macscp2_1        {macscp2.h macscp1.c {before macscp2_1}}    }    {        macscp4_1_from_macscp2        {macscp4.h macscp2.h macscp1.c {before macscp4_1_..., from macscp2.h}}        {macscp4.h macscp3.h macscp1.c {before macscp4_1_..., from macscp3.h}}    }    {        macscp4_2_from_macscp2        {macscp4.h macscp2.h macscp1.c {before macscp4_2_..., from macscp2.h}}        {macscp4.h macscp3.h macscp1.c {before macscp4_2_..., from macscp3.h}}    }    {        macscp2_2        {macscp2.h macscp1.c {before macscp2_2}}    }    {        macscp1_2        {macscp1.c {before macscp1_2}}    }    {        macscp3_1        {macscp3.h macscp1.c {before macscp3_1}}    }    {        macscp4_1_from_macscp3        {macscp4.h macscp3.h macscp1.c {before macscp4_1_..., from macscp3.h}}        {macscp4.h macscp2.h macscp1.c {before macscp4_1_..., from macscp2.h}}    }    {        macscp4_2_from_macscp3        {macscp4.h macscp3.h macscp1.c {before macscp4_2_..., from macscp3.h}}        {macscp4.h macscp2.h macscp1.c {before macscp4_2_..., from macscp2.h}}    }    {        macscp3_2        {macscp3.h macscp1.c {before macscp3_2}}    }    {        macscp1_3        {macscp1.c {before macscp1_3}}    }}# Start the program running.if {! [runto_main]} {    fail "macro tests suppressed: couldn't run to main"    return 0}# Set a breakpoint on each of the functions.foreach func_entry $funcs {    set func [lindex $func_entry 0]    gdb_test "break $func" "Breakpoint.*"}# Run to each of the breakpoints and check the definition (or lack# thereof) of each macro.for {set i 0} {$i < [llength $funcs]} {incr i} {    set func_entry [lindex $funcs $i]    set func [lindex $func_entry 0]    set expected [lindex $func_entry 1]    set kfail_expected [lindex $func_entry 2]    # Run to the breakpoint for $func.    gdb_test "continue" "Breakpoint $decimal, $func .*" "continue to $func"    # Check the macro WHERE.    set result [info_macro WHERE]    if {[string compare $result $expected] == 0} {        pass "info macro WHERE stopped in $func"    } elseif {[string compare $result $kfail_expected] == 0} {        # setup_kfail "gdb/555"        fail "info macro WHERE stopped in $func (gdb/555)"    } elseif {[string compare $result timeout] == 0} {        fail "info macro WHERE stopped in $func (timeout)"    } else {        fail "info macro WHERE stopped in $func"    }    # Check that the BEFORE_<func> macros for all prior functions are    # #defined, and that those for all subsequent functions are not.    for {set j 0} {$j < [llength $funcs]} {incr j} {        if {$j != $i} {            set func_j_entry [lindex $funcs $j]            set func_j [lindex $func_j_entry 0]            set before_macro "BEFORE_[string toupper $func_j]"            set test_name \                    "$before_macro defined/undefined when stopped at $func"            set result [info_macro $before_macro]            # We can't get the right scope info when we're stopped in            # the macro4_ functions.            if {[string match macscp4_* $func]} {                # setup_kfail "gdb/555"                set test_name "$test_name (gdb/555)"            }            if {$j < $i} {                if {[llength $result] >= 2 && \                        [string compare [lindex $result end] {}] == 0} {                    pass $test_name                } elseif {[string compare $result timeout] == 0} {                    fail "$test_name (timeout)"                } else {                    fail "$test_name"                }            } elseif {$j > $i} {                switch -- [lindex $result end] {                    undefined { pass $test_name }                    timeout { fail "$test_name (timeout)" }                    default {                         fail "$test_name"                    }                }            }            set until_macro "UNTIL_[string toupper $func_j]"            set test_name \                    "$until_macro defined/undefined when stopped at $func"            set result [info_macro $until_macro]            # We can't get the right scope info when we're stopped in            # the macro4_ functions.            if {[string match macscp4_* $func]} {                # setup_kfail "gdb/555"                set test_name "$test_name (gdb/555)"            }            if {$j <= $i} {                switch -- [lindex $result end] {                    undefined { pass $test_name }                    timeout { fail "$test_name (timeout)" }                    default {                         fail "$test_name"                    }                }            } elseif {$j > $i} {                if {[llength $result] >= 2 && \                        [string compare [lindex $result end] {}] == 0} {                    pass $test_name                } elseif {[string compare $result timeout] == 0} {                    fail "$test_name (timeout)"                } else {                    fail "$test_name"                }            }        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -