diff options
Diffstat (limited to 'runtime/syntax/dtrace.vim')
-rw-r--r-- | runtime/syntax/dtrace.vim | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/runtime/syntax/dtrace.vim b/runtime/syntax/dtrace.vim new file mode 100644 index 000000000..2f2d6e2cc --- /dev/null +++ b/runtime/syntax/dtrace.vim @@ -0,0 +1,150 @@ +" DTrace D script syntax file. To avoid confusion with the D programming +" language, I call this script dtrace.vim instead of d.vim. +" Language: D script as described in "Solaris Dynamic Tracing Guide", +" http://docs.sun.com/app/docs/doc/817-6223 +" Version: 1.5 +" Last Change: 2008/04/05 +" Maintainer: Nicolas Weber <nicolasweber@gmx.de> + +" dtrace lexer and parser are at +" http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/lib/libdtrace/common/dt_lex.l +" http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/lib/libdtrace/common/dt_grammar.y + +if version < 600 + syntax clear +elseif exists("b:current_syntax") + finish +endif + +" Read the C syntax to start with +if version < 600 + so <sfile>:p:h/c.vim +else + runtime! syntax/c.vim + unlet b:current_syntax +endif + +syn clear cCommentL " dtrace doesn't support // style comments + +" First line may start with #!, also make sure a '-s' flag is somewhere in +" that line. +syn match dtraceComment "\%^#!.*-s.*" + +" Probe descriptors need explicit matches, so that keywords in probe +" descriptors don't show up as errors. Note that this regex detects probes +" as "something with three ':' in it". This works in practice, but it's not +" really correct. Also add special case code for BEGIN, END and ERROR, since +" they are common. +" Be careful not to detect '/*some:::node*/\n/**/' as probe, as it's +" commented out. +" XXX: This allows a probe description to end with ',', even if it's not +" followed by another probe. +" XXX: This doesn't work if followed by a comment. +let s:oneProbe = '\%(BEGIN\|END\|ERROR\|\S\{-}:\S\{-}:\S\{-}:\S\{-}\)\_s*' +exec 'syn match dtraceProbe "'.s:oneProbe.'\%(,\_s*'.s:oneProbe.'\)*\ze\_s\%({\|\/[^*]\|\%$\)"' + +" Note: We have to be careful to not make this match /* */ comments. +" Also be careful not to eat `c = a / b; b = a / 2;`. We use the same +" technique as the dtrace lexer: a predicate has to be followed by {, ;, or +" EOF. Also note that dtrace doesn't allow an empty predicate // (we do). +" This regex doesn't allow a divison operator in the predicate. +" Make sure that this matches the empty predicate as well. +" XXX: This doesn't work if followed by a comment. +syn match dtracePredicate "/\*\@!\_[^/]*/\ze\_s*\%({\|;\|\%$\)" + "contains=ALLBUT,dtraceOption " this lets the region contain too much stuff + +" Pragmas. +" dtrace seems not to support whitespace before or after the '='. dtrace +" supports only one option per #pragma, and no continuations of #pragma over +" several lines with '\'. +" Note that dtrace treats units (Hz etc) as case-insenstive, we allow only +" sane unit capitalization in this script (ie 'ns', 'us', 'ms', 's' have to be +" small, Hertz can be 'Hz' or 'hz') +" XXX: "cpu" is always highlighted as builtin var, not as option + +" auto or manual: bufresize +syn match dtraceOption contained "bufresize=\%(auto\|manual\)\s*$" + +" scalar: cpu jstackframes jstackstrsize nspec stackframes stackindent ustackframes +syn match dtraceOption contained "\%(cpu\|jstackframes\|jstackstrsize\|nspec\|stackframes\|stackindent\|ustackframes\)=\d\+\s*$" + +" size: aggsize bufsize dynvarsize specsize strsize +" size defaults to something if no unit is given (ie., having no unit is ok) +syn match dtraceOption contained "\%(aggsize\|bufsize\|dynvarsize\|specsize\|strsize\)=\d\+\%(k\|m\|g\|t\|K\|M\|G\|T\)\=\s*$" + +" time: aggrate cleanrate statusrate switchrate +" time defaults to hz if no unit is given +syn match dtraceOption contained "\%(aggrate\|cleanrate\|statusrate\|switchrate\)=\d\+\%(hz\|Hz\|ns\|us\|ms\|s\)\=\s*$" + +" No type: defaultargs destructive flowindent grabanon quiet rawbytes +syn match dtraceOption contained "\%(defaultargs\|destructive\|flowindent\|grabanon\|quiet\|rawbytes\)\s*$" + + +" Turn reserved but unspecified keywords into errors +syn keyword dtraceReservedKeyword auto break case continue counter default do +syn keyword dtraceReservedKeyword else for goto if import probe provider +syn keyword dtraceReservedKeyword register restrict return static switch while + +" Add dtrace-specific stuff +syn keyword dtraceOperator sizeof offsetof stringof xlate +syn keyword dtraceStatement self inline xlate this translator + +" Builtin variables +syn keyword dtraceIdentifier arg0 arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 +syn keyword dtraceIdentifier args caller chip cpu curcpu curlwpsinfo curpsinfo +syn keyword dtraceIdentifier curthread cwd epid errno execname gid id ipl lgrp +syn keyword dtraceIdentifier pid ppid probefunc probemod probename probeprov +syn keyword dtraceIdentifier pset root stackdepth tid timestamp uid uregs +syn keyword dtraceIdentifier vtimestamp walltimestamp +syn keyword dtraceIdentifier ustackdepth + +" Macro Variables +syn match dtraceConstant "$[0-9]\+" +syn match dtraceConstant "$\(egid\|euid\|gid\|pgid\|ppid\)" +syn match dtraceConstant "$\(projid\|sid\|target\|taskid\|uid\)" + +" Data Recording Actions +syn keyword dtraceFunction trace tracemem printf printa stack ustack jstack + +" Process Destructive Actions +syn keyword dtraceFunction stop raise copyout copyoutstr system + +" Kernel Destructive Actions +syn keyword dtraceFunction breakpoint panic chill + +" Special Actions +syn keyword dtraceFunction speculate commit discard exit + +" Subroutines +syn keyword dtraceFunction alloca basename bcopy cleanpath copyin copyinstr +syn keyword dtraceFunction copyinto dirname msgdsize msgsize mutex_owned +syn keyword dtraceFunction mutex_owner mutex_type_adaptive progenyof +syn keyword dtraceFunction rand rw_iswriter rw_write_held speculation +syn keyword dtraceFunction strjoin strlen + +" Aggregating Functions +syn keyword dtraceAggregatingFunction count sum avg min max lquantize quantize + +syn keyword dtraceType int8_t int16_t int32_t int64_t intptr_t +syn keyword dtraceType uint8_t uint16_t uint32_t uint64_t uintptr_t +syn keyword dtraceType string +syn keyword dtraceType pid_t id_t + + +" Define the default highlighting. +" We use `hi def link` directly, this requires 5.8. +hi def link dtraceReservedKeyword Error +hi def link dtracePredicate String +hi def link dtraceProbe dtraceStatement +hi def link dtraceStatement Statement +hi def link dtraceConstant Constant +hi def link dtraceIdentifier Identifier +hi def link dtraceAggregatingFunction dtraceFunction +hi def link dtraceFunction Function +hi def link dtraceType Type +hi def link dtraceOperator Operator +hi def link dtraceComment Comment +hi def link dtraceNumber Number +hi def link dtraceOption Identifier + +let b:current_syntax = "dtrace" |