op-validate.sed revision 29055185fb21b3a557f1a3a549ebde4b47189f65
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync# $Id$
ee29f83d0638dba8e0380d7f594fe2d726d9403cvboxsync## @file
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync#
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync# Just some quit sed hacks for validating an op.S assembly file.
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync# Will try this with gcc 4.x later to see if we can permit gcc 4
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync# to build op.c by using this script as guard against bad code.
9496b6f77d66eb89f088668752b8838d578d6e10vboxsync#
9496b6f77d66eb89f088668752b8838d578d6e10vboxsync
9496b6f77d66eb89f088668752b8838d578d6e10vboxsync## @todo need to check that we've the got two __op_label[0-1].op_goto_tb[0-1] symbols!
9496b6f77d66eb89f088668752b8838d578d6e10vboxsync
9496b6f77d66eb89f088668752b8838d578d6e10vboxsync# if (ret) goto return
9496b6f77d66eb89f088668752b8838d578d6e10vboxsync/^[[:space:]]*ret[[:space:]]*$/b return
9496b6f77d66eb89f088668752b8838d578d6e10vboxsync#/^[[:space:]]*retn[[:space:]]*$/b bad
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync# if (jmp) goto jump
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync/^[[:space:]]*[^j]/b skip_jump_checks
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync/^[[:space:]]*jmp[[:space:]][[:space:]]*/b jump
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync/^[[:space:]]*ja[[:space:]][[:space:]]*/b jump
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^[[:space:]]*jae[[:space:]][[:space:]]*/b jump
9c049cf1885a9852ff3ba60a5a28c4530e2ef26bvboxsync/^[[:space:]]*jb[[:space:]][[:space:]]*/b jump
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^[[:space:]]*jbe[[:space:]][[:space:]]*/b jump
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^[[:space:]]*jc[[:space:]][[:space:]]*/b jump
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^[[:space:]]*je[[:space:]][[:space:]]*/b jump
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^[[:space:]]*jg[[:space:]][[:space:]]*/b jump
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^[[:space:]]*jge[[:space:]][[:space:]]*/b jump
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^[[:space:]]*jl[[:space:]][[:space:]]*/b jump
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^[[:space:]]*jle[[:space:]][[:space:]]*/b jump
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^[[:space:]]*jnae[[:space:]][[:space:]]*/b jump
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^[[:space:]]*jnb[[:space:]][[:space:]]*/b jump
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^[[:space:]]*jnbe[[:space:]][[:space:]]*/b jump
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^[[:space:]]*jnc[[:space:]][[:space:]]*/b jump
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^[[:space:]]*jne[[:space:]][[:space:]]*/b jump
9a1578b66f9e563cf99c75ffa881db476f477e3avboxsync/^[[:space:]]*jng[[:space:]][[:space:]]*/b jump
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^[[:space:]]*jnge[[:space:]][[:space:]]*/b jump
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^[[:space:]]*jnl[[:space:]][[:space:]]*/b jump
18673eee0624b4581d3d56ab9ad9d10ebc7f5bddvboxsync/^[[:space:]]*jnle[[:space:]][[:space:]]*/b jump
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^[[:space:]]*jno[[:space:]][[:space:]]*/b jump
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^[[:space:]]*jnp[[:space:]][[:space:]]*/b jump
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^[[:space:]]*jns[[:space:]][[:space:]]*/b jump
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^[[:space:]]*jnz[[:space:]][[:space:]]*/b jump
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^[[:space:]]*jo[[:space:]][[:space:]]*/b jump
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^[[:space:]]*jp[[:space:]][[:space:]]*/b jump
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^[[:space:]]*jpe[[:space:]][[:space:]]*/b jump
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^[[:space:]]*jpo[[:space:]][[:space:]]*/b jump
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^[[:space:]]*js[[:space:]][[:space:]]*/b jump
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^[[:space:]]*jz[[:space:]][[:space:]]*/b jump
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync:skip_jump_checks
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync# Everything else is discarded!
7bff28e0cedd8656acd24b420759649184d8cf00vboxsyncd
7bff28e0cedd8656acd24b420759649184d8cf00vboxsyncb end
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync#
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync# Verify that all ret statements are at the end of a function by
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync# inspecting what's on the following line. It must either be a
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync# .size statement, a .LfeXXXX label, a .LfeXXXX label or #NO_APP comment.
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync#
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync# @todo figure out how to discard the first line in a simpler fashion.
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync:return
7bff28e0cedd8656acd24b420759649184d8cf00vboxsyncN
7bff28e0cedd8656acd24b420759649184d8cf00vboxsyncs/^[[:blank:]]*ret[[:blank:]]*\n*[[:blank:]]*//
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/\.Lfe[0-9][0-9]*:/d
97674677e4f2aeae576c39f966568dd664ba7979vboxsync/\.LFE[0-9][0-9]*:/d
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/size[[:space:]]/d
9ced981a0263f6280ccbf5dc64c0e81fbe4a2fdavboxsync/^[/#]NO_APP[[:space:]]*$/d
9ced981a0263f6280ccbf5dc64c0e81fbe4a2fdavboxsync/^$/!b bad
c4c106ad74e0ad745ac49a2c4182c4f42ced7248vboxsyncb end
97674677e4f2aeae576c39f966568dd664ba7979vboxsync
97674677e4f2aeae576c39f966568dd664ba7979vboxsync#
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync# Verify that all jumps are to internal labels or to few select
eecfcc5748685e35d0d4d835fb30d5494ad62734vboxsync# external labels.
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync#
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync#/^[[:blank:]]*jmp/
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync:jump
7bff28e0cedd8656acd24b420759649184d8cf00vboxsyncs/^[[:space:]]*j[a-z]*[[:space:]][[:space:]]*//
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^\.L/d
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^[1-9][fb]$/d
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^__op_gen_label1$/d
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync# two very special cases.
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^\*__op_param1+48[[:space:]][[:space:]]*#[[:space:]]*<variable>.tb_next[[:space:]]*$/d
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^\*__op_param1+52[[:space:]][[:space:]]*#[[:space:]]*<variable>.tb_next[[:space:]]*$/d
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync/^$/!b bad
7bff28e0cedd8656acd24b420759649184d8cf00vboxsyncb end
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync
f6cc81e94c29cc9b39b896cf32ecfe0501b4a1e5vboxsync# An error was found
97674677e4f2aeae576c39f966568dd664ba7979vboxsync:bad
84bebd094718692856715fb7ed9e592c9421e039vboxsyncq 1
97674677e4f2aeae576c39f966568dd664ba7979vboxsync
97674677e4f2aeae576c39f966568dd664ba7979vboxsync# next expression
97674677e4f2aeae576c39f966568dd664ba7979vboxsync:end
97674677e4f2aeae576c39f966568dd664ba7979vboxsync
7bff28e0cedd8656acd24b420759649184d8cf00vboxsync