Bram Moolenaar | 446cb83 | 2008-06-24 21:56:24 +0000 | [diff] [blame] | 1 | " DTrace D script syntax file. To avoid confusion with the D programming |
| 2 | " language, I call this script dtrace.vim instead of d.vim. |
| 3 | " Language: D script as described in "Solaris Dynamic Tracing Guide", |
| 4 | " http://docs.sun.com/app/docs/doc/817-6223 |
| 5 | " Version: 1.5 |
| 6 | " Last Change: 2008/04/05 |
| 7 | " Maintainer: Nicolas Weber <nicolasweber@gmx.de> |
| 8 | |
| 9 | " dtrace lexer and parser are at |
| 10 | " http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/lib/libdtrace/common/dt_lex.l |
| 11 | " http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/lib/libdtrace/common/dt_grammar.y |
| 12 | |
| 13 | if version < 600 |
| 14 | syntax clear |
| 15 | elseif exists("b:current_syntax") |
| 16 | finish |
| 17 | endif |
| 18 | |
| 19 | " Read the C syntax to start with |
| 20 | if version < 600 |
| 21 | so <sfile>:p:h/c.vim |
| 22 | else |
| 23 | runtime! syntax/c.vim |
| 24 | unlet b:current_syntax |
| 25 | endif |
| 26 | |
| 27 | syn clear cCommentL " dtrace doesn't support // style comments |
| 28 | |
| 29 | " First line may start with #!, also make sure a '-s' flag is somewhere in |
| 30 | " that line. |
| 31 | syn match dtraceComment "\%^#!.*-s.*" |
| 32 | |
| 33 | " Probe descriptors need explicit matches, so that keywords in probe |
| 34 | " descriptors don't show up as errors. Note that this regex detects probes |
| 35 | " as "something with three ':' in it". This works in practice, but it's not |
| 36 | " really correct. Also add special case code for BEGIN, END and ERROR, since |
| 37 | " they are common. |
| 38 | " Be careful not to detect '/*some:::node*/\n/**/' as probe, as it's |
| 39 | " commented out. |
| 40 | " XXX: This allows a probe description to end with ',', even if it's not |
| 41 | " followed by another probe. |
| 42 | " XXX: This doesn't work if followed by a comment. |
| 43 | let s:oneProbe = '\%(BEGIN\|END\|ERROR\|\S\{-}:\S\{-}:\S\{-}:\S\{-}\)\_s*' |
| 44 | exec 'syn match dtraceProbe "'.s:oneProbe.'\%(,\_s*'.s:oneProbe.'\)*\ze\_s\%({\|\/[^*]\|\%$\)"' |
| 45 | |
| 46 | " Note: We have to be careful to not make this match /* */ comments. |
| 47 | " Also be careful not to eat `c = a / b; b = a / 2;`. We use the same |
| 48 | " technique as the dtrace lexer: a predicate has to be followed by {, ;, or |
| 49 | " EOF. Also note that dtrace doesn't allow an empty predicate // (we do). |
| 50 | " This regex doesn't allow a divison operator in the predicate. |
| 51 | " Make sure that this matches the empty predicate as well. |
| 52 | " XXX: This doesn't work if followed by a comment. |
| 53 | syn match dtracePredicate "/\*\@!\_[^/]*/\ze\_s*\%({\|;\|\%$\)" |
| 54 | "contains=ALLBUT,dtraceOption " this lets the region contain too much stuff |
| 55 | |
| 56 | " Pragmas. |
| 57 | " dtrace seems not to support whitespace before or after the '='. dtrace |
| 58 | " supports only one option per #pragma, and no continuations of #pragma over |
| 59 | " several lines with '\'. |
| 60 | " Note that dtrace treats units (Hz etc) as case-insenstive, we allow only |
| 61 | " sane unit capitalization in this script (ie 'ns', 'us', 'ms', 's' have to be |
| 62 | " small, Hertz can be 'Hz' or 'hz') |
| 63 | " XXX: "cpu" is always highlighted as builtin var, not as option |
| 64 | |
| 65 | " auto or manual: bufresize |
| 66 | syn match dtraceOption contained "bufresize=\%(auto\|manual\)\s*$" |
| 67 | |
| 68 | " scalar: cpu jstackframes jstackstrsize nspec stackframes stackindent ustackframes |
| 69 | syn match dtraceOption contained "\%(cpu\|jstackframes\|jstackstrsize\|nspec\|stackframes\|stackindent\|ustackframes\)=\d\+\s*$" |
| 70 | |
| 71 | " size: aggsize bufsize dynvarsize specsize strsize |
| 72 | " size defaults to something if no unit is given (ie., having no unit is ok) |
| 73 | syn match dtraceOption contained "\%(aggsize\|bufsize\|dynvarsize\|specsize\|strsize\)=\d\+\%(k\|m\|g\|t\|K\|M\|G\|T\)\=\s*$" |
| 74 | |
| 75 | " time: aggrate cleanrate statusrate switchrate |
| 76 | " time defaults to hz if no unit is given |
| 77 | syn match dtraceOption contained "\%(aggrate\|cleanrate\|statusrate\|switchrate\)=\d\+\%(hz\|Hz\|ns\|us\|ms\|s\)\=\s*$" |
| 78 | |
| 79 | " No type: defaultargs destructive flowindent grabanon quiet rawbytes |
| 80 | syn match dtraceOption contained "\%(defaultargs\|destructive\|flowindent\|grabanon\|quiet\|rawbytes\)\s*$" |
| 81 | |
| 82 | |
| 83 | " Turn reserved but unspecified keywords into errors |
| 84 | syn keyword dtraceReservedKeyword auto break case continue counter default do |
| 85 | syn keyword dtraceReservedKeyword else for goto if import probe provider |
| 86 | syn keyword dtraceReservedKeyword register restrict return static switch while |
| 87 | |
| 88 | " Add dtrace-specific stuff |
| 89 | syn keyword dtraceOperator sizeof offsetof stringof xlate |
| 90 | syn keyword dtraceStatement self inline xlate this translator |
| 91 | |
| 92 | " Builtin variables |
| 93 | syn keyword dtraceIdentifier arg0 arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 |
| 94 | syn keyword dtraceIdentifier args caller chip cpu curcpu curlwpsinfo curpsinfo |
| 95 | syn keyword dtraceIdentifier curthread cwd epid errno execname gid id ipl lgrp |
| 96 | syn keyword dtraceIdentifier pid ppid probefunc probemod probename probeprov |
| 97 | syn keyword dtraceIdentifier pset root stackdepth tid timestamp uid uregs |
| 98 | syn keyword dtraceIdentifier vtimestamp walltimestamp |
| 99 | syn keyword dtraceIdentifier ustackdepth |
| 100 | |
| 101 | " Macro Variables |
| 102 | syn match dtraceConstant "$[0-9]\+" |
| 103 | syn match dtraceConstant "$\(egid\|euid\|gid\|pgid\|ppid\)" |
| 104 | syn match dtraceConstant "$\(projid\|sid\|target\|taskid\|uid\)" |
| 105 | |
| 106 | " Data Recording Actions |
| 107 | syn keyword dtraceFunction trace tracemem printf printa stack ustack jstack |
| 108 | |
| 109 | " Process Destructive Actions |
| 110 | syn keyword dtraceFunction stop raise copyout copyoutstr system |
| 111 | |
| 112 | " Kernel Destructive Actions |
| 113 | syn keyword dtraceFunction breakpoint panic chill |
| 114 | |
| 115 | " Special Actions |
| 116 | syn keyword dtraceFunction speculate commit discard exit |
| 117 | |
| 118 | " Subroutines |
| 119 | syn keyword dtraceFunction alloca basename bcopy cleanpath copyin copyinstr |
| 120 | syn keyword dtraceFunction copyinto dirname msgdsize msgsize mutex_owned |
| 121 | syn keyword dtraceFunction mutex_owner mutex_type_adaptive progenyof |
| 122 | syn keyword dtraceFunction rand rw_iswriter rw_write_held speculation |
| 123 | syn keyword dtraceFunction strjoin strlen |
| 124 | |
| 125 | " Aggregating Functions |
| 126 | syn keyword dtraceAggregatingFunction count sum avg min max lquantize quantize |
| 127 | |
| 128 | syn keyword dtraceType int8_t int16_t int32_t int64_t intptr_t |
| 129 | syn keyword dtraceType uint8_t uint16_t uint32_t uint64_t uintptr_t |
| 130 | syn keyword dtraceType string |
| 131 | syn keyword dtraceType pid_t id_t |
| 132 | |
| 133 | |
| 134 | " Define the default highlighting. |
| 135 | " We use `hi def link` directly, this requires 5.8. |
| 136 | hi def link dtraceReservedKeyword Error |
| 137 | hi def link dtracePredicate String |
| 138 | hi def link dtraceProbe dtraceStatement |
| 139 | hi def link dtraceStatement Statement |
| 140 | hi def link dtraceConstant Constant |
| 141 | hi def link dtraceIdentifier Identifier |
| 142 | hi def link dtraceAggregatingFunction dtraceFunction |
| 143 | hi def link dtraceFunction Function |
| 144 | hi def link dtraceType Type |
| 145 | hi def link dtraceOperator Operator |
| 146 | hi def link dtraceComment Comment |
| 147 | hi def link dtraceNumber Number |
| 148 | hi def link dtraceOption Identifier |
| 149 | |
| 150 | let b:current_syntax = "dtrace" |