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