16ff6d951SJohn Birrell %{ 26ff6d951SJohn Birrell /* 36ff6d951SJohn Birrell * CDDL HEADER START 46ff6d951SJohn Birrell * 56ff6d951SJohn Birrell * The contents of this file are subject to the terms of the 66ff6d951SJohn Birrell * Common Development and Distribution License, Version 1.0 only 76ff6d951SJohn Birrell * (the "License"). You may not use this file except in compliance 86ff6d951SJohn Birrell * with the License. 96ff6d951SJohn Birrell * 106ff6d951SJohn Birrell * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 116ff6d951SJohn Birrell * or http://www.opensolaris.org/os/licensing. 126ff6d951SJohn Birrell * See the License for the specific language governing permissions 136ff6d951SJohn Birrell * and limitations under the License. 146ff6d951SJohn Birrell * 156ff6d951SJohn Birrell * When distributing Covered Code, include this CDDL HEADER in each 166ff6d951SJohn Birrell * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 176ff6d951SJohn Birrell * If applicable, add the following below this CDDL HEADER, with the 186ff6d951SJohn Birrell * fields enclosed by brackets "[]" replaced with your own identifying 196ff6d951SJohn Birrell * information: Portions Copyright [yyyy] [name of copyright owner] 206ff6d951SJohn Birrell * 216ff6d951SJohn Birrell * CDDL HEADER END 226ff6d951SJohn Birrell * 236ff6d951SJohn Birrell * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 246ff6d951SJohn Birrell * Use is subject to license terms. 256ff6d951SJohn Birrell */ 268e648814SRui Paulo 278e648814SRui Paulo /* 288e648814SRui Paulo * Copyright (c) 2014, 2016 by Delphix. All rights reserved. 298e648814SRui Paulo * Copyright (c) 2013, Joyent, Inc. All rights reserved. 306ff6d951SJohn Birrell */ 316ff6d951SJohn Birrell 326ff6d951SJohn Birrell #include <dt_impl.h> 336ff6d951SJohn Birrell 346ff6d951SJohn Birrell #define OP1(op, c) dt_node_op1(op, c) 356ff6d951SJohn Birrell #define OP2(op, l, r) dt_node_op2(op, l, r) 366ff6d951SJohn Birrell #define OP3(x, y, z) dt_node_op3(x, y, z) 376ff6d951SJohn Birrell #define LINK(l, r) dt_node_link(l, r) 386ff6d951SJohn Birrell #define DUP(s) strdup(s) 396ff6d951SJohn Birrell 406ff6d951SJohn Birrell %} 416ff6d951SJohn Birrell 426ff6d951SJohn Birrell %union { 436ff6d951SJohn Birrell dt_node_t *l_node; 446ff6d951SJohn Birrell dt_decl_t *l_decl; 456ff6d951SJohn Birrell char *l_str; 466ff6d951SJohn Birrell uintmax_t l_int; 476ff6d951SJohn Birrell int l_tok; 486ff6d951SJohn Birrell } 496ff6d951SJohn Birrell 506ff6d951SJohn Birrell %token DT_TOK_COMMA DT_TOK_ELLIPSIS 516ff6d951SJohn Birrell %token DT_TOK_ASGN DT_TOK_ADD_EQ DT_TOK_SUB_EQ DT_TOK_MUL_EQ 526ff6d951SJohn Birrell %token DT_TOK_DIV_EQ DT_TOK_MOD_EQ DT_TOK_AND_EQ DT_TOK_XOR_EQ DT_TOK_OR_EQ 536ff6d951SJohn Birrell %token DT_TOK_LSH_EQ DT_TOK_RSH_EQ DT_TOK_QUESTION DT_TOK_COLON 546ff6d951SJohn Birrell %token DT_TOK_LOR DT_TOK_LXOR DT_TOK_LAND 556ff6d951SJohn Birrell %token DT_TOK_BOR DT_TOK_XOR DT_TOK_BAND DT_TOK_EQU DT_TOK_NEQ 566ff6d951SJohn Birrell %token DT_TOK_LT DT_TOK_LE DT_TOK_GT DT_TOK_GE DT_TOK_LSH DT_TOK_RSH 576ff6d951SJohn Birrell %token DT_TOK_ADD DT_TOK_SUB DT_TOK_MUL DT_TOK_DIV DT_TOK_MOD 586ff6d951SJohn Birrell %token DT_TOK_LNEG DT_TOK_BNEG DT_TOK_ADDADD DT_TOK_SUBSUB 596ff6d951SJohn Birrell %token DT_TOK_PREINC DT_TOK_POSTINC DT_TOK_PREDEC DT_TOK_POSTDEC 606ff6d951SJohn Birrell %token DT_TOK_IPOS DT_TOK_INEG DT_TOK_DEREF DT_TOK_ADDROF 616ff6d951SJohn Birrell %token DT_TOK_OFFSETOF DT_TOK_SIZEOF DT_TOK_STRINGOF DT_TOK_XLATE 626ff6d951SJohn Birrell %token DT_TOK_LPAR DT_TOK_RPAR DT_TOK_LBRAC DT_TOK_RBRAC DT_TOK_PTR DT_TOK_DOT 636ff6d951SJohn Birrell 646ff6d951SJohn Birrell %token <l_str> DT_TOK_STRING 656ff6d951SJohn Birrell %token <l_str> DT_TOK_IDENT 666ff6d951SJohn Birrell %token <l_str> DT_TOK_PSPEC 676ff6d951SJohn Birrell %token <l_str> DT_TOK_AGG 686ff6d951SJohn Birrell %token <l_str> DT_TOK_TNAME 696ff6d951SJohn Birrell %token <l_int> DT_TOK_INT 706ff6d951SJohn Birrell 716ff6d951SJohn Birrell %token DT_KEY_AUTO 726ff6d951SJohn Birrell %token DT_KEY_BREAK 736ff6d951SJohn Birrell %token DT_KEY_CASE 746ff6d951SJohn Birrell %token DT_KEY_CHAR 756ff6d951SJohn Birrell %token DT_KEY_CONST 766ff6d951SJohn Birrell %token DT_KEY_CONTINUE 776ff6d951SJohn Birrell %token DT_KEY_COUNTER 786ff6d951SJohn Birrell %token DT_KEY_DEFAULT 796ff6d951SJohn Birrell %token DT_KEY_DO 806ff6d951SJohn Birrell %token DT_KEY_DOUBLE 816ff6d951SJohn Birrell %token DT_KEY_ELSE 826ff6d951SJohn Birrell %token DT_KEY_ENUM 836ff6d951SJohn Birrell %token DT_KEY_EXTERN 846ff6d951SJohn Birrell %token DT_KEY_FLOAT 856ff6d951SJohn Birrell %token DT_KEY_FOR 866ff6d951SJohn Birrell %token DT_KEY_GOTO 876ff6d951SJohn Birrell %token DT_KEY_IF 886ff6d951SJohn Birrell %token DT_KEY_IMPORT 896ff6d951SJohn Birrell %token DT_KEY_INLINE 906ff6d951SJohn Birrell %token DT_KEY_INT 916ff6d951SJohn Birrell %token DT_KEY_LONG 926ff6d951SJohn Birrell %token DT_KEY_PROBE 936ff6d951SJohn Birrell %token DT_KEY_PROVIDER 946ff6d951SJohn Birrell %token DT_KEY_REGISTER 956ff6d951SJohn Birrell %token DT_KEY_RESTRICT 966ff6d951SJohn Birrell %token DT_KEY_RETURN 976ff6d951SJohn Birrell %token DT_KEY_SELF 986ff6d951SJohn Birrell %token DT_KEY_SHORT 996ff6d951SJohn Birrell %token DT_KEY_SIGNED 1006ff6d951SJohn Birrell %token DT_KEY_STATIC 1016ff6d951SJohn Birrell %token DT_KEY_STRING 1026ff6d951SJohn Birrell %token DT_KEY_STRUCT 1036ff6d951SJohn Birrell %token DT_KEY_SWITCH 1046ff6d951SJohn Birrell %token DT_KEY_THIS 1056ff6d951SJohn Birrell %token DT_KEY_TYPEDEF 1066ff6d951SJohn Birrell %token DT_KEY_UNION 1078e648814SRui Paulo %token DT_KEY_UNSIGNED 1086ff6d951SJohn Birrell %token DT_KEY_USERLAND 1096ff6d951SJohn Birrell %token DT_KEY_VOID 1106ff6d951SJohn Birrell %token DT_KEY_VOLATILE 1116ff6d951SJohn Birrell %token DT_KEY_WHILE 1126ff6d951SJohn Birrell %token DT_KEY_XLATOR 1136ff6d951SJohn Birrell 1146ff6d951SJohn Birrell %token DT_TOK_EPRED 1156ff6d951SJohn Birrell %token DT_CTX_DEXPR 1166ff6d951SJohn Birrell %token DT_CTX_DPROG 1176ff6d951SJohn Birrell %token DT_CTX_DTYPE 1186ff6d951SJohn Birrell %token DT_TOK_EOF 0 1196ff6d951SJohn Birrell 1206ff6d951SJohn Birrell %left DT_TOK_COMMA 1216ff6d951SJohn Birrell %right DT_TOK_ASGN DT_TOK_ADD_EQ DT_TOK_SUB_EQ DT_TOK_MUL_EQ DT_TOK_DIV_EQ 1226ff6d951SJohn Birrell DT_TOK_MOD_EQ DT_TOK_AND_EQ DT_TOK_XOR_EQ DT_TOK_OR_EQ DT_TOK_LSH_EQ 1236ff6d951SJohn Birrell DT_TOK_RSH_EQ 1246ff6d951SJohn Birrell %left DT_TOK_QUESTION DT_TOK_COLON 1256ff6d951SJohn Birrell %left DT_TOK_LOR 1266ff6d951SJohn Birrell %left DT_TOK_LXOR 1276ff6d951SJohn Birrell %left DT_TOK_LAND 1286ff6d951SJohn Birrell %left DT_TOK_BOR 1296ff6d951SJohn Birrell %left DT_TOK_XOR 1306ff6d951SJohn Birrell %left DT_TOK_BAND 1316ff6d951SJohn Birrell %left DT_TOK_EQU DT_TOK_NEQ 1326ff6d951SJohn Birrell %left DT_TOK_LT DT_TOK_LE DT_TOK_GT DT_TOK_GE 1336ff6d951SJohn Birrell %left DT_TOK_LSH DT_TOK_RSH 1346ff6d951SJohn Birrell %left DT_TOK_ADD DT_TOK_SUB 1356ff6d951SJohn Birrell %left DT_TOK_MUL DT_TOK_DIV DT_TOK_MOD 1366ff6d951SJohn Birrell %right DT_TOK_LNEG DT_TOK_BNEG DT_TOK_ADDADD DT_TOK_SUBSUB 1376ff6d951SJohn Birrell DT_TOK_IPOS DT_TOK_INEG 1386ff6d951SJohn Birrell %right DT_TOK_DEREF DT_TOK_ADDROF DT_TOK_SIZEOF DT_TOK_STRINGOF DT_TOK_XLATE 1396ff6d951SJohn Birrell %left DT_TOK_LPAR DT_TOK_RPAR DT_TOK_LBRAC DT_TOK_RBRAC DT_TOK_PTR DT_TOK_DOT 1406ff6d951SJohn Birrell 1416ff6d951SJohn Birrell %type <l_node> d_expression 1426ff6d951SJohn Birrell %type <l_node> d_program 1436ff6d951SJohn Birrell %type <l_node> d_type 1446ff6d951SJohn Birrell 1456ff6d951SJohn Birrell %type <l_node> translation_unit 1466ff6d951SJohn Birrell %type <l_node> external_declaration 1476ff6d951SJohn Birrell %type <l_node> inline_definition 1486ff6d951SJohn Birrell %type <l_node> translator_definition 1496ff6d951SJohn Birrell %type <l_node> translator_member_list 1506ff6d951SJohn Birrell %type <l_node> translator_member 1516ff6d951SJohn Birrell %type <l_node> provider_definition 1526ff6d951SJohn Birrell %type <l_node> provider_probe_list 1536ff6d951SJohn Birrell %type <l_node> provider_probe 1546ff6d951SJohn Birrell %type <l_node> probe_definition 1556ff6d951SJohn Birrell %type <l_node> probe_specifiers 1566ff6d951SJohn Birrell %type <l_node> probe_specifier_list 1576ff6d951SJohn Birrell %type <l_node> probe_specifier 1586ff6d951SJohn Birrell %type <l_node> statement_list 1596ff6d951SJohn Birrell %type <l_node> statement_list_impl 1606ff6d951SJohn Birrell %type <l_node> statement_or_block 1616ff6d951SJohn Birrell %type <l_node> statement 1626ff6d951SJohn Birrell %type <l_node> declaration 1636ff6d951SJohn Birrell %type <l_node> init_declarator_list 1646ff6d951SJohn Birrell %type <l_node> init_declarator 1656ff6d951SJohn Birrell 1666ff6d951SJohn Birrell %type <l_decl> type_specifier 1676ff6d951SJohn Birrell %type <l_decl> type_qualifier 1686ff6d951SJohn Birrell %type <l_decl> struct_or_union_specifier 1696ff6d951SJohn Birrell %type <l_decl> specifier_qualifier_list 1706ff6d951SJohn Birrell %type <l_decl> enum_specifier 1716ff6d951SJohn Birrell %type <l_decl> declarator 1726ff6d951SJohn Birrell %type <l_decl> direct_declarator 1736ff6d951SJohn Birrell %type <l_decl> pointer 1746ff6d951SJohn Birrell %type <l_decl> type_qualifier_list 1756ff6d951SJohn Birrell %type <l_decl> type_name 1766ff6d951SJohn Birrell %type <l_decl> abstract_declarator 1776ff6d951SJohn Birrell %type <l_decl> direct_abstract_declarator 1786ff6d951SJohn Birrell 1796ff6d951SJohn Birrell %type <l_node> parameter_type_list 1806ff6d951SJohn Birrell %type <l_node> parameter_list 1816ff6d951SJohn Birrell %type <l_node> parameter_declaration 1826ff6d951SJohn Birrell 1836ff6d951SJohn Birrell %type <l_node> array 1846ff6d951SJohn Birrell %type <l_node> array_parameters 1856ff6d951SJohn Birrell %type <l_node> function 1866ff6d951SJohn Birrell %type <l_node> function_parameters 1876ff6d951SJohn Birrell 1886ff6d951SJohn Birrell %type <l_node> expression 1896ff6d951SJohn Birrell %type <l_node> assignment_expression 1906ff6d951SJohn Birrell %type <l_node> conditional_expression 1916ff6d951SJohn Birrell %type <l_node> constant_expression 1926ff6d951SJohn Birrell %type <l_node> logical_or_expression 1936ff6d951SJohn Birrell %type <l_node> logical_xor_expression 1946ff6d951SJohn Birrell %type <l_node> logical_and_expression 1956ff6d951SJohn Birrell %type <l_node> inclusive_or_expression 1966ff6d951SJohn Birrell %type <l_node> exclusive_or_expression 1976ff6d951SJohn Birrell %type <l_node> and_expression 1986ff6d951SJohn Birrell %type <l_node> equality_expression 1996ff6d951SJohn Birrell %type <l_node> relational_expression 2006ff6d951SJohn Birrell %type <l_node> shift_expression 2016ff6d951SJohn Birrell %type <l_node> additive_expression 2026ff6d951SJohn Birrell %type <l_node> multiplicative_expression 2036ff6d951SJohn Birrell %type <l_node> cast_expression 2046ff6d951SJohn Birrell %type <l_node> unary_expression 2056ff6d951SJohn Birrell %type <l_node> postfix_expression 2066ff6d951SJohn Birrell %type <l_node> primary_expression 2076ff6d951SJohn Birrell %type <l_node> argument_expression_list 2086ff6d951SJohn Birrell 2096ff6d951SJohn Birrell %type <l_tok> assignment_operator 21084e874bdSMark Johnston %type <l_tok> unary_operator 21184e874bdSMark Johnston %type <l_tok> struct_or_union 2126ff6d951SJohn Birrell 2136ff6d951SJohn Birrell %type <l_str> dtrace_keyword_ident 2146ff6d951SJohn Birrell 2156ff6d951SJohn Birrell %% 2166ff6d951SJohn Birrell 2176ff6d951SJohn Birrell dtrace_program: d_expression DT_TOK_EOF { return (dt_node_root($1)); } 2186ff6d951SJohn Birrell | d_program DT_TOK_EOF { return (dt_node_root($1)); } 2196ff6d951SJohn Birrell | d_type DT_TOK_EOF { return (dt_node_root($1)); } 2206ff6d951SJohn Birrell ; 2216ff6d951SJohn Birrell 2226ff6d951SJohn Birrell d_expression: DT_CTX_DEXPR { $$ = NULL; } 2236ff6d951SJohn Birrell | DT_CTX_DEXPR expression { $$ = $2; } 2246ff6d951SJohn Birrell ; 2256ff6d951SJohn Birrell 2266ff6d951SJohn Birrell d_program: DT_CTX_DPROG { $$ = dt_node_program(NULL); } 2276ff6d951SJohn Birrell | DT_CTX_DPROG translation_unit { $$ = dt_node_program($2); } 2286ff6d951SJohn Birrell ; 2296ff6d951SJohn Birrell 2306ff6d951SJohn Birrell d_type: DT_CTX_DTYPE { $$ = NULL; } 2316ff6d951SJohn Birrell | DT_CTX_DTYPE type_name { $$ = (dt_node_t *)$2; } 2326ff6d951SJohn Birrell ; 2336ff6d951SJohn Birrell 2346ff6d951SJohn Birrell translation_unit: 2356ff6d951SJohn Birrell external_declaration 2366ff6d951SJohn Birrell | translation_unit external_declaration { $$ = LINK($1, $2); } 2376ff6d951SJohn Birrell ; 2386ff6d951SJohn Birrell 2396ff6d951SJohn Birrell external_declaration: 2406ff6d951SJohn Birrell inline_definition 2416ff6d951SJohn Birrell | translator_definition 2426ff6d951SJohn Birrell | provider_definition 2436ff6d951SJohn Birrell | probe_definition 2446ff6d951SJohn Birrell | declaration 2456ff6d951SJohn Birrell ; 2466ff6d951SJohn Birrell 2476ff6d951SJohn Birrell inline_definition: 2486ff6d951SJohn Birrell DT_KEY_INLINE declaration_specifiers declarator 2496ff6d951SJohn Birrell { dt_scope_push(NULL, CTF_ERR); } DT_TOK_ASGN 2506ff6d951SJohn Birrell assignment_expression ';' { 2516ff6d951SJohn Birrell /* 2526ff6d951SJohn Birrell * We push a new declaration scope before shifting the 2536ff6d951SJohn Birrell * assignment_expression in order to preserve ds_class 2546ff6d951SJohn Birrell * and ds_ident for use in dt_node_inline(). Once the 2556ff6d951SJohn Birrell * entire inline_definition rule is matched, pop the 2566ff6d951SJohn Birrell * scope and construct the inline using the saved decl. 2576ff6d951SJohn Birrell */ 2586ff6d951SJohn Birrell dt_scope_pop(); 2596ff6d951SJohn Birrell $$ = dt_node_inline($6); 2606ff6d951SJohn Birrell } 2616ff6d951SJohn Birrell ; 2626ff6d951SJohn Birrell 2636ff6d951SJohn Birrell translator_definition: 2646ff6d951SJohn Birrell DT_KEY_XLATOR type_name DT_TOK_LT type_name 2656ff6d951SJohn Birrell DT_TOK_IDENT DT_TOK_GT '{' translator_member_list '}' ';' { 2666ff6d951SJohn Birrell $$ = dt_node_xlator($2, $4, $5, $8); 2676ff6d951SJohn Birrell } 2686ff6d951SJohn Birrell | DT_KEY_XLATOR type_name DT_TOK_LT type_name 2696ff6d951SJohn Birrell DT_TOK_IDENT DT_TOK_GT '{' '}' ';' { 2706ff6d951SJohn Birrell $$ = dt_node_xlator($2, $4, $5, NULL); 2716ff6d951SJohn Birrell } 2726ff6d951SJohn Birrell ; 2736ff6d951SJohn Birrell 2746ff6d951SJohn Birrell translator_member_list: 2756ff6d951SJohn Birrell translator_member 2766ff6d951SJohn Birrell | translator_member_list translator_member { $$ = LINK($1,$2); } 2776ff6d951SJohn Birrell ; 2786ff6d951SJohn Birrell 2796ff6d951SJohn Birrell translator_member: 2806ff6d951SJohn Birrell DT_TOK_IDENT DT_TOK_ASGN assignment_expression ';' { 2816ff6d951SJohn Birrell $$ = dt_node_member(NULL, $1, $3); 2826ff6d951SJohn Birrell } 2836ff6d951SJohn Birrell ; 2846ff6d951SJohn Birrell 2856ff6d951SJohn Birrell provider_definition: 2866ff6d951SJohn Birrell DT_KEY_PROVIDER DT_TOK_IDENT '{' provider_probe_list '}' ';' { 2876ff6d951SJohn Birrell $$ = dt_node_provider($2, $4); 2886ff6d951SJohn Birrell } 2896ff6d951SJohn Birrell | DT_KEY_PROVIDER DT_TOK_IDENT '{' '}' ';' { 2906ff6d951SJohn Birrell $$ = dt_node_provider($2, NULL); 2916ff6d951SJohn Birrell } 2926ff6d951SJohn Birrell ; 2936ff6d951SJohn Birrell 2946ff6d951SJohn Birrell provider_probe_list: 2956ff6d951SJohn Birrell provider_probe 2966ff6d951SJohn Birrell | provider_probe_list provider_probe { $$ = LINK($1, $2); } 2976ff6d951SJohn Birrell ; 2986ff6d951SJohn Birrell 2996ff6d951SJohn Birrell provider_probe: 3006ff6d951SJohn Birrell DT_KEY_PROBE DT_TOK_IDENT function DT_TOK_COLON function ';' { 3016ff6d951SJohn Birrell $$ = dt_node_probe($2, 2, $3, $5); 3026ff6d951SJohn Birrell } 3036ff6d951SJohn Birrell | DT_KEY_PROBE DT_TOK_IDENT function ';' { 3046ff6d951SJohn Birrell $$ = dt_node_probe($2, 1, $3, NULL); 3056ff6d951SJohn Birrell } 3066ff6d951SJohn Birrell ; 3076ff6d951SJohn Birrell 3086ff6d951SJohn Birrell 3096ff6d951SJohn Birrell probe_definition: 3106ff6d951SJohn Birrell probe_specifiers { 3116ff6d951SJohn Birrell /* 3126ff6d951SJohn Birrell * If the input stream is a file, do not permit a probe 3136ff6d951SJohn Birrell * specification without / <pred> / or { <act> } after 3146ff6d951SJohn Birrell * it. This can only occur if the next token is EOF or 3156ff6d951SJohn Birrell * an ambiguous predicate was slurped up as a comment. 3166ff6d951SJohn Birrell * We cannot perform this check if input() is a string 3176ff6d951SJohn Birrell * because dtrace(1M) [-fmnP] also use the compiler and 3186ff6d951SJohn Birrell * things like dtrace -n BEGIN have to be accepted. 3196ff6d951SJohn Birrell */ 3206ff6d951SJohn Birrell if (yypcb->pcb_fileptr != NULL) { 3216ff6d951SJohn Birrell dnerror($1, D_SYNTAX, "expected predicate and/" 3226ff6d951SJohn Birrell "or actions following probe description\n"); 3236ff6d951SJohn Birrell } 3246ff6d951SJohn Birrell $$ = dt_node_clause($1, NULL, NULL); 3256ff6d951SJohn Birrell yybegin(YYS_CLAUSE); 3266ff6d951SJohn Birrell } 3276ff6d951SJohn Birrell | probe_specifiers '{' statement_list '}' { 3286ff6d951SJohn Birrell $$ = dt_node_clause($1, NULL, $3); 3296ff6d951SJohn Birrell yybegin(YYS_CLAUSE); 3306ff6d951SJohn Birrell } 3316ff6d951SJohn Birrell | probe_specifiers DT_TOK_DIV expression DT_TOK_EPRED { 3326ff6d951SJohn Birrell dnerror($3, D_SYNTAX, "expected actions { } following " 3336ff6d951SJohn Birrell "probe description and predicate\n"); 3346ff6d951SJohn Birrell } 3356ff6d951SJohn Birrell | probe_specifiers DT_TOK_DIV expression DT_TOK_EPRED 3366ff6d951SJohn Birrell '{' statement_list '}' { 3376ff6d951SJohn Birrell $$ = dt_node_clause($1, $3, $6); 3386ff6d951SJohn Birrell yybegin(YYS_CLAUSE); 3396ff6d951SJohn Birrell } 3406ff6d951SJohn Birrell ; 3416ff6d951SJohn Birrell 3426ff6d951SJohn Birrell probe_specifiers: 3436ff6d951SJohn Birrell probe_specifier_list { yybegin(YYS_EXPR); $$ = $1; } 3446ff6d951SJohn Birrell ; 3456ff6d951SJohn Birrell 3466ff6d951SJohn Birrell probe_specifier_list: 3476ff6d951SJohn Birrell probe_specifier 3486ff6d951SJohn Birrell | probe_specifier_list DT_TOK_COMMA probe_specifier { 3496ff6d951SJohn Birrell $$ = LINK($1, $3); 3506ff6d951SJohn Birrell } 3516ff6d951SJohn Birrell ; 3526ff6d951SJohn Birrell 3536ff6d951SJohn Birrell probe_specifier: 3546ff6d951SJohn Birrell DT_TOK_PSPEC { $$ = dt_node_pdesc_by_name($1); } 3556ff6d951SJohn Birrell | DT_TOK_INT { $$ = dt_node_pdesc_by_id($1); } 3566ff6d951SJohn Birrell ; 3576ff6d951SJohn Birrell 3586ff6d951SJohn Birrell statement_list_impl: /* empty */ { $$ = NULL; } 3596ff6d951SJohn Birrell | statement_list_impl statement { $$ = LINK($1, $2); } 3606ff6d951SJohn Birrell ; 3616ff6d951SJohn Birrell 3626ff6d951SJohn Birrell statement_list: 3636ff6d951SJohn Birrell statement_list_impl { $$ = $1; } 3646ff6d951SJohn Birrell | statement_list_impl expression { 3656ff6d951SJohn Birrell $$ = LINK($1, dt_node_statement($2)); 3666ff6d951SJohn Birrell } 3676ff6d951SJohn Birrell ; 3686ff6d951SJohn Birrell 3696ff6d951SJohn Birrell statement_or_block: 3706ff6d951SJohn Birrell statement 3716ff6d951SJohn Birrell | '{' statement_list '}' { $$ = $2; } 3726ff6d951SJohn Birrell 3736ff6d951SJohn Birrell statement: ';' { $$ = NULL; } 3746ff6d951SJohn Birrell | expression ';' { $$ = dt_node_statement($1); } 3756ff6d951SJohn Birrell | DT_KEY_IF DT_TOK_LPAR expression DT_TOK_RPAR statement_or_block { 3766ff6d951SJohn Birrell $$ = dt_node_if($3, $5, NULL); 3776ff6d951SJohn Birrell } 3786ff6d951SJohn Birrell | DT_KEY_IF DT_TOK_LPAR expression DT_TOK_RPAR 3796ff6d951SJohn Birrell statement_or_block DT_KEY_ELSE statement_or_block { 3806ff6d951SJohn Birrell $$ = dt_node_if($3, $5, $7); 3816ff6d951SJohn Birrell } 3826ff6d951SJohn Birrell ; 3836ff6d951SJohn Birrell 3846ff6d951SJohn Birrell argument_expression_list: 3856ff6d951SJohn Birrell assignment_expression 3866ff6d951SJohn Birrell | argument_expression_list DT_TOK_COMMA assignment_expression { 3876ff6d951SJohn Birrell $$ = LINK($1, $3); 3886ff6d951SJohn Birrell } 3896ff6d951SJohn Birrell ; 3906ff6d951SJohn Birrell 3916ff6d951SJohn Birrell primary_expression: 3926ff6d951SJohn Birrell DT_TOK_IDENT { $$ = dt_node_ident($1); } 3936ff6d951SJohn Birrell | DT_TOK_AGG { $$ = dt_node_ident($1); } 3946ff6d951SJohn Birrell | DT_TOK_INT { $$ = dt_node_int($1); } 3956ff6d951SJohn Birrell | DT_TOK_STRING { $$ = dt_node_string($1); } 39684e874bdSMark Johnston | DT_KEY_SELF { $$ = dt_node_ident(DUP("self")); } 39784e874bdSMark Johnston | DT_KEY_THIS { $$ = dt_node_ident(DUP("this")); } 39884e874bdSMark Johnston | DT_TOK_LPAR expression DT_TOK_RPAR { $$ = $2; } 3996ff6d951SJohn Birrell ; 4006ff6d951SJohn Birrell 4016ff6d951SJohn Birrell postfix_expression: 4026ff6d951SJohn Birrell primary_expression 4036ff6d951SJohn Birrell | postfix_expression 4046ff6d951SJohn Birrell DT_TOK_LBRAC argument_expression_list DT_TOK_RBRAC { 40584e874bdSMark Johnston $$ = OP2(DT_TOK_LBRAC, $1, $3); 40684e874bdSMark Johnston } 40784e874bdSMark Johnston | postfix_expression DT_TOK_LPAR DT_TOK_RPAR { 4086ff6d951SJohn Birrell $$ = dt_node_func($1, NULL); 4096ff6d951SJohn Birrell } 4106ff6d951SJohn Birrell | postfix_expression 4116ff6d951SJohn Birrell DT_TOK_LPAR argument_expression_list DT_TOK_RPAR { 4126ff6d951SJohn Birrell $$ = dt_node_func($1, $3); 4136ff6d951SJohn Birrell } 4146ff6d951SJohn Birrell | postfix_expression DT_TOK_DOT DT_TOK_IDENT { 4156ff6d951SJohn Birrell $$ = OP2(DT_TOK_DOT, $1, dt_node_ident($3)); 4166ff6d951SJohn Birrell } 4176ff6d951SJohn Birrell | postfix_expression DT_TOK_DOT DT_TOK_TNAME { 4186ff6d951SJohn Birrell $$ = OP2(DT_TOK_DOT, $1, dt_node_ident($3)); 4196ff6d951SJohn Birrell } 4206ff6d951SJohn Birrell | postfix_expression DT_TOK_DOT dtrace_keyword_ident { 4216ff6d951SJohn Birrell $$ = OP2(DT_TOK_DOT, $1, dt_node_ident($3)); 42284e874bdSMark Johnston } 42384e874bdSMark Johnston | postfix_expression DT_TOK_PTR DT_TOK_IDENT { 42484e874bdSMark Johnston $$ = OP2(DT_TOK_PTR, $1, dt_node_ident($3)); 42584e874bdSMark Johnston } 4266ff6d951SJohn Birrell | postfix_expression DT_TOK_PTR DT_TOK_TNAME { 4276ff6d951SJohn Birrell $$ = OP2(DT_TOK_PTR, $1, dt_node_ident($3)); 4286ff6d951SJohn Birrell } 4296ff6d951SJohn Birrell | postfix_expression DT_TOK_PTR dtrace_keyword_ident { 4306ff6d951SJohn Birrell $$ = OP2(DT_TOK_PTR, $1, dt_node_ident($3)); 4316ff6d951SJohn Birrell } 4326ff6d951SJohn Birrell | postfix_expression DT_TOK_ADDADD { 4336ff6d951SJohn Birrell $$ = OP1(DT_TOK_POSTINC, $1); 4346ff6d951SJohn Birrell } 4356ff6d951SJohn Birrell | postfix_expression DT_TOK_SUBSUB { 4366ff6d951SJohn Birrell $$ = OP1(DT_TOK_POSTDEC, $1); 4376ff6d951SJohn Birrell } 4386ff6d951SJohn Birrell | DT_TOK_OFFSETOF DT_TOK_LPAR type_name DT_TOK_COMMA 4396ff6d951SJohn Birrell DT_TOK_IDENT DT_TOK_RPAR { 4406ff6d951SJohn Birrell $$ = dt_node_offsetof($3, $5); 4416ff6d951SJohn Birrell } 4426ff6d951SJohn Birrell | DT_TOK_OFFSETOF DT_TOK_LPAR type_name DT_TOK_COMMA 4436ff6d951SJohn Birrell DT_TOK_TNAME DT_TOK_RPAR { 4446ff6d951SJohn Birrell $$ = dt_node_offsetof($3, $5); 4456ff6d951SJohn Birrell } 4466ff6d951SJohn Birrell | DT_TOK_OFFSETOF DT_TOK_LPAR type_name DT_TOK_COMMA 4476ff6d951SJohn Birrell dtrace_keyword_ident DT_TOK_RPAR { 4486ff6d951SJohn Birrell $$ = dt_node_offsetof($3, $5); 4496ff6d951SJohn Birrell } 4506ff6d951SJohn Birrell | DT_TOK_XLATE DT_TOK_LT type_name DT_TOK_GT 4516ff6d951SJohn Birrell DT_TOK_LPAR expression DT_TOK_RPAR { 4526ff6d951SJohn Birrell $$ = OP2(DT_TOK_XLATE, dt_node_type($3), $6); 4536ff6d951SJohn Birrell } 4546ff6d951SJohn Birrell ; 4556ff6d951SJohn Birrell 4566ff6d951SJohn Birrell unary_expression: 4576ff6d951SJohn Birrell postfix_expression 4586ff6d951SJohn Birrell | DT_TOK_ADDADD unary_expression { $$ = OP1(DT_TOK_PREINC, $2); } 4596ff6d951SJohn Birrell | DT_TOK_SUBSUB unary_expression { $$ = OP1(DT_TOK_PREDEC, $2); } 4606ff6d951SJohn Birrell | unary_operator cast_expression { $$ = OP1($1, $2); } 4616ff6d951SJohn Birrell | DT_TOK_SIZEOF unary_expression { $$ = OP1(DT_TOK_SIZEOF, $2); } 4626ff6d951SJohn Birrell | DT_TOK_SIZEOF DT_TOK_LPAR type_name DT_TOK_RPAR { 4636ff6d951SJohn Birrell $$ = OP1(DT_TOK_SIZEOF, dt_node_type($3)); 4646ff6d951SJohn Birrell } 4656ff6d951SJohn Birrell | DT_TOK_STRINGOF unary_expression { 4666ff6d951SJohn Birrell $$ = OP1(DT_TOK_STRINGOF, $2); 4676ff6d951SJohn Birrell } 4686ff6d951SJohn Birrell ; 4696ff6d951SJohn Birrell 4706ff6d951SJohn Birrell unary_operator: DT_TOK_BAND { $$ = DT_TOK_ADDROF; } 4716ff6d951SJohn Birrell | DT_TOK_MUL { $$ = DT_TOK_DEREF; } 4726ff6d951SJohn Birrell | DT_TOK_ADD { $$ = DT_TOK_IPOS; } 4736ff6d951SJohn Birrell | DT_TOK_SUB { $$ = DT_TOK_INEG; } 4746ff6d951SJohn Birrell | DT_TOK_BNEG { $$ = DT_TOK_BNEG; } 4756ff6d951SJohn Birrell | DT_TOK_LNEG { $$ = DT_TOK_LNEG; } 4766ff6d951SJohn Birrell ; 4776ff6d951SJohn Birrell 4786ff6d951SJohn Birrell cast_expression: 4796ff6d951SJohn Birrell unary_expression 4806ff6d951SJohn Birrell | DT_TOK_LPAR type_name DT_TOK_RPAR cast_expression { 4816ff6d951SJohn Birrell $$ = OP2(DT_TOK_LPAR, dt_node_type($2), $4); 4826ff6d951SJohn Birrell } 4836ff6d951SJohn Birrell ; 4846ff6d951SJohn Birrell 4856ff6d951SJohn Birrell multiplicative_expression: 4866ff6d951SJohn Birrell cast_expression 4876ff6d951SJohn Birrell | multiplicative_expression DT_TOK_MUL cast_expression { 4886ff6d951SJohn Birrell $$ = OP2(DT_TOK_MUL, $1, $3); 4896ff6d951SJohn Birrell } 4906ff6d951SJohn Birrell | multiplicative_expression DT_TOK_DIV cast_expression { 4916ff6d951SJohn Birrell $$ = OP2(DT_TOK_DIV, $1, $3); 4926ff6d951SJohn Birrell } 4936ff6d951SJohn Birrell | multiplicative_expression DT_TOK_MOD cast_expression { 4946ff6d951SJohn Birrell $$ = OP2(DT_TOK_MOD, $1, $3); 4956ff6d951SJohn Birrell } 4966ff6d951SJohn Birrell ; 4976ff6d951SJohn Birrell 4986ff6d951SJohn Birrell additive_expression: 4996ff6d951SJohn Birrell multiplicative_expression 5006ff6d951SJohn Birrell | additive_expression DT_TOK_ADD multiplicative_expression { 5016ff6d951SJohn Birrell $$ = OP2(DT_TOK_ADD, $1, $3); 5026ff6d951SJohn Birrell } 5036ff6d951SJohn Birrell | additive_expression DT_TOK_SUB multiplicative_expression { 5046ff6d951SJohn Birrell $$ = OP2(DT_TOK_SUB, $1, $3); 5056ff6d951SJohn Birrell } 5066ff6d951SJohn Birrell ; 5076ff6d951SJohn Birrell 5086ff6d951SJohn Birrell shift_expression: 5096ff6d951SJohn Birrell additive_expression 5106ff6d951SJohn Birrell | shift_expression DT_TOK_LSH additive_expression { 5116ff6d951SJohn Birrell $$ = OP2(DT_TOK_LSH, $1, $3); 5126ff6d951SJohn Birrell } 5136ff6d951SJohn Birrell | shift_expression DT_TOK_RSH additive_expression { 5146ff6d951SJohn Birrell $$ = OP2(DT_TOK_RSH, $1, $3); 5156ff6d951SJohn Birrell } 5166ff6d951SJohn Birrell ; 5176ff6d951SJohn Birrell 5186ff6d951SJohn Birrell relational_expression: 5196ff6d951SJohn Birrell shift_expression 5206ff6d951SJohn Birrell | relational_expression DT_TOK_LT shift_expression { 5216ff6d951SJohn Birrell $$ = OP2(DT_TOK_LT, $1, $3); 5226ff6d951SJohn Birrell } 5236ff6d951SJohn Birrell | relational_expression DT_TOK_GT shift_expression { 5246ff6d951SJohn Birrell $$ = OP2(DT_TOK_GT, $1, $3); 5256ff6d951SJohn Birrell } 5266ff6d951SJohn Birrell | relational_expression DT_TOK_LE shift_expression { 5276ff6d951SJohn Birrell $$ = OP2(DT_TOK_LE, $1, $3); 5286ff6d951SJohn Birrell } 5296ff6d951SJohn Birrell | relational_expression DT_TOK_GE shift_expression { 5306ff6d951SJohn Birrell $$ = OP2(DT_TOK_GE, $1, $3); 5316ff6d951SJohn Birrell } 5326ff6d951SJohn Birrell ; 5336ff6d951SJohn Birrell 5346ff6d951SJohn Birrell equality_expression: 5356ff6d951SJohn Birrell relational_expression 5366ff6d951SJohn Birrell | equality_expression DT_TOK_EQU relational_expression { 5376ff6d951SJohn Birrell $$ = OP2(DT_TOK_EQU, $1, $3); 5386ff6d951SJohn Birrell } 5396ff6d951SJohn Birrell | equality_expression DT_TOK_NEQ relational_expression { 5406ff6d951SJohn Birrell $$ = OP2(DT_TOK_NEQ, $1, $3); 5416ff6d951SJohn Birrell } 5426ff6d951SJohn Birrell ; 5436ff6d951SJohn Birrell 5446ff6d951SJohn Birrell and_expression: 5456ff6d951SJohn Birrell equality_expression 5466ff6d951SJohn Birrell | and_expression DT_TOK_BAND equality_expression { 5476ff6d951SJohn Birrell $$ = OP2(DT_TOK_BAND, $1, $3); 5486ff6d951SJohn Birrell } 5496ff6d951SJohn Birrell ; 5506ff6d951SJohn Birrell 5516ff6d951SJohn Birrell exclusive_or_expression: 5526ff6d951SJohn Birrell and_expression 5536ff6d951SJohn Birrell | exclusive_or_expression DT_TOK_XOR and_expression { 5546ff6d951SJohn Birrell $$ = OP2(DT_TOK_XOR, $1, $3); 5556ff6d951SJohn Birrell } 5566ff6d951SJohn Birrell ; 5576ff6d951SJohn Birrell 5586ff6d951SJohn Birrell inclusive_or_expression: 5596ff6d951SJohn Birrell exclusive_or_expression 5606ff6d951SJohn Birrell | inclusive_or_expression DT_TOK_BOR exclusive_or_expression { 5616ff6d951SJohn Birrell $$ = OP2(DT_TOK_BOR, $1, $3); 5626ff6d951SJohn Birrell } 5636ff6d951SJohn Birrell ; 5646ff6d951SJohn Birrell 5656ff6d951SJohn Birrell logical_and_expression: 5666ff6d951SJohn Birrell inclusive_or_expression 5676ff6d951SJohn Birrell | logical_and_expression DT_TOK_LAND inclusive_or_expression { 5686ff6d951SJohn Birrell $$ = OP2(DT_TOK_LAND, $1, $3); 5696ff6d951SJohn Birrell } 5706ff6d951SJohn Birrell ; 5716ff6d951SJohn Birrell 5726ff6d951SJohn Birrell logical_xor_expression: 5736ff6d951SJohn Birrell logical_and_expression 5746ff6d951SJohn Birrell | logical_xor_expression DT_TOK_LXOR logical_and_expression { 5756ff6d951SJohn Birrell $$ = OP2(DT_TOK_LXOR, $1, $3); 5766ff6d951SJohn Birrell } 5776ff6d951SJohn Birrell ; 5786ff6d951SJohn Birrell 5796ff6d951SJohn Birrell logical_or_expression: 5806ff6d951SJohn Birrell logical_xor_expression 5816ff6d951SJohn Birrell | logical_or_expression DT_TOK_LOR logical_xor_expression { 5826ff6d951SJohn Birrell $$ = OP2(DT_TOK_LOR, $1, $3); 5836ff6d951SJohn Birrell } 5846ff6d951SJohn Birrell ; 5856ff6d951SJohn Birrell 5866ff6d951SJohn Birrell constant_expression: conditional_expression 5876ff6d951SJohn Birrell ; 5886ff6d951SJohn Birrell 5896ff6d951SJohn Birrell conditional_expression: 5906ff6d951SJohn Birrell logical_or_expression 5916ff6d951SJohn Birrell | logical_or_expression DT_TOK_QUESTION expression DT_TOK_COLON 5926ff6d951SJohn Birrell conditional_expression { $$ = OP3($1, $3, $5); } 5936ff6d951SJohn Birrell ; 5946ff6d951SJohn Birrell 5956ff6d951SJohn Birrell assignment_expression: 5966ff6d951SJohn Birrell conditional_expression 5976ff6d951SJohn Birrell | unary_expression assignment_operator assignment_expression { 5986ff6d951SJohn Birrell $$ = OP2($2, $1, $3); 5996ff6d951SJohn Birrell } 6006ff6d951SJohn Birrell ; 6016ff6d951SJohn Birrell 6026ff6d951SJohn Birrell assignment_operator: 6036ff6d951SJohn Birrell DT_TOK_ASGN { $$ = DT_TOK_ASGN; } 6046ff6d951SJohn Birrell | DT_TOK_MUL_EQ { $$ = DT_TOK_MUL_EQ; } 6056ff6d951SJohn Birrell | DT_TOK_DIV_EQ { $$ = DT_TOK_DIV_EQ; } 6066ff6d951SJohn Birrell | DT_TOK_MOD_EQ { $$ = DT_TOK_MOD_EQ; } 6076ff6d951SJohn Birrell | DT_TOK_ADD_EQ { $$ = DT_TOK_ADD_EQ; } 6086ff6d951SJohn Birrell | DT_TOK_SUB_EQ { $$ = DT_TOK_SUB_EQ; } 6096ff6d951SJohn Birrell | DT_TOK_LSH_EQ { $$ = DT_TOK_LSH_EQ; } 6106ff6d951SJohn Birrell | DT_TOK_RSH_EQ { $$ = DT_TOK_RSH_EQ; } 6116ff6d951SJohn Birrell | DT_TOK_AND_EQ { $$ = DT_TOK_AND_EQ; } 6126ff6d951SJohn Birrell | DT_TOK_XOR_EQ { $$ = DT_TOK_XOR_EQ; } 6136ff6d951SJohn Birrell | DT_TOK_OR_EQ { $$ = DT_TOK_OR_EQ; } 6146ff6d951SJohn Birrell ; 6156ff6d951SJohn Birrell 6166ff6d951SJohn Birrell expression: assignment_expression 6176ff6d951SJohn Birrell | expression DT_TOK_COMMA assignment_expression { 6186ff6d951SJohn Birrell $$ = OP2(DT_TOK_COMMA, $1, $3); 6196ff6d951SJohn Birrell } 6206ff6d951SJohn Birrell ; 6216ff6d951SJohn Birrell 6226ff6d951SJohn Birrell declaration: declaration_specifiers ';' { 6236ff6d951SJohn Birrell $$ = dt_node_decl(); 6246ff6d951SJohn Birrell dt_decl_free(dt_decl_pop()); 6256ff6d951SJohn Birrell yybegin(YYS_CLAUSE); 6266ff6d951SJohn Birrell } 6276ff6d951SJohn Birrell | declaration_specifiers init_declarator_list ';' { 6286ff6d951SJohn Birrell $$ = $2; 6296ff6d951SJohn Birrell dt_decl_free(dt_decl_pop()); 6306ff6d951SJohn Birrell yybegin(YYS_CLAUSE); 6316ff6d951SJohn Birrell } 6326ff6d951SJohn Birrell ; 6336ff6d951SJohn Birrell 6346ff6d951SJohn Birrell declaration_specifiers: 6356ff6d951SJohn Birrell d_storage_class_specifier 6366ff6d951SJohn Birrell | d_storage_class_specifier declaration_specifiers 6376ff6d951SJohn Birrell | type_specifier 6386ff6d951SJohn Birrell | type_specifier declaration_specifiers 6396ff6d951SJohn Birrell | type_qualifier 6406ff6d951SJohn Birrell | type_qualifier declaration_specifiers 6416ff6d951SJohn Birrell ; 6426ff6d951SJohn Birrell 6436ff6d951SJohn Birrell parameter_declaration_specifiers: 6446ff6d951SJohn Birrell storage_class_specifier 6456ff6d951SJohn Birrell | storage_class_specifier declaration_specifiers 6466ff6d951SJohn Birrell | type_specifier 6476ff6d951SJohn Birrell | type_specifier declaration_specifiers 6486ff6d951SJohn Birrell | type_qualifier 6496ff6d951SJohn Birrell | type_qualifier declaration_specifiers 6506ff6d951SJohn Birrell ; 6518e648814SRui Paulo 6526ff6d951SJohn Birrell storage_class_specifier: 6536ff6d951SJohn Birrell DT_KEY_AUTO { dt_decl_class(DT_DC_AUTO); } 6546ff6d951SJohn Birrell | DT_KEY_REGISTER { dt_decl_class(DT_DC_REGISTER); } 6556ff6d951SJohn Birrell | DT_KEY_STATIC { dt_decl_class(DT_DC_STATIC); } 6566ff6d951SJohn Birrell | DT_KEY_EXTERN { dt_decl_class(DT_DC_EXTERN); } 6576ff6d951SJohn Birrell | DT_KEY_TYPEDEF { dt_decl_class(DT_DC_TYPEDEF); } 6586ff6d951SJohn Birrell ; 6596ff6d951SJohn Birrell 6606ff6d951SJohn Birrell d_storage_class_specifier: 6616ff6d951SJohn Birrell storage_class_specifier 6626ff6d951SJohn Birrell | DT_KEY_SELF { dt_decl_class(DT_DC_SELF); } 6636ff6d951SJohn Birrell | DT_KEY_THIS { dt_decl_class(DT_DC_THIS); } 6646ff6d951SJohn Birrell ; 6656ff6d951SJohn Birrell 6666ff6d951SJohn Birrell type_specifier: DT_KEY_VOID { $$ = dt_decl_spec(CTF_K_INTEGER, DUP("void")); } 6676ff6d951SJohn Birrell | DT_KEY_CHAR { $$ = dt_decl_spec(CTF_K_INTEGER, DUP("char")); } 6686ff6d951SJohn Birrell | DT_KEY_SHORT { $$ = dt_decl_attr(DT_DA_SHORT); } 6696ff6d951SJohn Birrell | DT_KEY_INT { $$ = dt_decl_spec(CTF_K_INTEGER, DUP("int")); } 6706ff6d951SJohn Birrell | DT_KEY_LONG { $$ = dt_decl_attr(DT_DA_LONG); } 6716ff6d951SJohn Birrell | DT_KEY_FLOAT { $$ = dt_decl_spec(CTF_K_FLOAT, DUP("float")); } 6726ff6d951SJohn Birrell | DT_KEY_DOUBLE { $$ = dt_decl_spec(CTF_K_FLOAT, DUP("double")); } 6736ff6d951SJohn Birrell | DT_KEY_SIGNED { $$ = dt_decl_attr(DT_DA_SIGNED); } 6746ff6d951SJohn Birrell | DT_KEY_UNSIGNED { $$ = dt_decl_attr(DT_DA_UNSIGNED); } 6756ff6d951SJohn Birrell | DT_KEY_USERLAND { $$ = dt_decl_attr(DT_DA_USER); } 6766ff6d951SJohn Birrell | DT_KEY_STRING { 6776ff6d951SJohn Birrell $$ = dt_decl_spec(CTF_K_TYPEDEF, DUP("string")); 6786ff6d951SJohn Birrell } 6796ff6d951SJohn Birrell | DT_TOK_TNAME { $$ = dt_decl_spec(CTF_K_TYPEDEF, $1); } 6806ff6d951SJohn Birrell | struct_or_union_specifier 6816ff6d951SJohn Birrell | enum_specifier 6826ff6d951SJohn Birrell ; 6836ff6d951SJohn Birrell 6846ff6d951SJohn Birrell type_qualifier: DT_KEY_CONST { $$ = dt_decl_attr(DT_DA_CONST); } 6856ff6d951SJohn Birrell | DT_KEY_RESTRICT { $$ = dt_decl_attr(DT_DA_RESTRICT); } 6866ff6d951SJohn Birrell | DT_KEY_VOLATILE { $$ = dt_decl_attr(DT_DA_VOLATILE); } 6876ff6d951SJohn Birrell ; 6886ff6d951SJohn Birrell 6896ff6d951SJohn Birrell struct_or_union_specifier: 6906ff6d951SJohn Birrell struct_or_union_definition struct_declaration_list '}' { 6916ff6d951SJohn Birrell $$ = dt_scope_pop(); 6926ff6d951SJohn Birrell } 6936ff6d951SJohn Birrell | struct_or_union DT_TOK_IDENT { $$ = dt_decl_spec($1, $2); } 6946ff6d951SJohn Birrell | struct_or_union DT_TOK_TNAME { $$ = dt_decl_spec($1, $2); } 6956ff6d951SJohn Birrell ; 6966ff6d951SJohn Birrell 6976ff6d951SJohn Birrell struct_or_union_definition: 6986ff6d951SJohn Birrell struct_or_union '{' { dt_decl_sou($1, NULL); } 6996ff6d951SJohn Birrell | struct_or_union DT_TOK_IDENT '{' { dt_decl_sou($1, $2); } 7006ff6d951SJohn Birrell | struct_or_union DT_TOK_TNAME '{' { dt_decl_sou($1, $2); } 7016ff6d951SJohn Birrell ; 7026ff6d951SJohn Birrell 7036ff6d951SJohn Birrell struct_or_union: 7046ff6d951SJohn Birrell DT_KEY_STRUCT { $$ = CTF_K_STRUCT; } 7056ff6d951SJohn Birrell | DT_KEY_UNION { $$ = CTF_K_UNION; } 7066ff6d951SJohn Birrell ; 7076ff6d951SJohn Birrell 7086ff6d951SJohn Birrell struct_declaration_list: 7096ff6d951SJohn Birrell struct_declaration 7106ff6d951SJohn Birrell | struct_declaration_list struct_declaration 7116ff6d951SJohn Birrell ; 7126ff6d951SJohn Birrell 7136ff6d951SJohn Birrell init_declarator_list: 7146ff6d951SJohn Birrell init_declarator 7156ff6d951SJohn Birrell | init_declarator_list DT_TOK_COMMA init_declarator { 7166ff6d951SJohn Birrell $$ = LINK($1, $3); 7176ff6d951SJohn Birrell } 7186ff6d951SJohn Birrell ; 7196ff6d951SJohn Birrell 7206ff6d951SJohn Birrell init_declarator: 7216ff6d951SJohn Birrell declarator { 7226ff6d951SJohn Birrell $$ = dt_node_decl(); 7236ff6d951SJohn Birrell dt_decl_reset(); 7246ff6d951SJohn Birrell } 7256ff6d951SJohn Birrell ; 7266ff6d951SJohn Birrell 7276ff6d951SJohn Birrell struct_declaration: 7286ff6d951SJohn Birrell specifier_qualifier_list struct_declarator_list ';' { 7296ff6d951SJohn Birrell dt_decl_free(dt_decl_pop()); 7306ff6d951SJohn Birrell } 7316ff6d951SJohn Birrell ; 7326ff6d951SJohn Birrell 7336ff6d951SJohn Birrell specifier_qualifier_list: 7346ff6d951SJohn Birrell type_specifier 7356ff6d951SJohn Birrell | type_specifier specifier_qualifier_list { $$ = $2; } 7366ff6d951SJohn Birrell | type_qualifier 7376ff6d951SJohn Birrell | type_qualifier specifier_qualifier_list { $$ = $2; } 7386ff6d951SJohn Birrell ; 7396ff6d951SJohn Birrell 7406ff6d951SJohn Birrell struct_declarator_list: 7416ff6d951SJohn Birrell struct_declarator 7426ff6d951SJohn Birrell | struct_declarator_list DT_TOK_COMMA struct_declarator 7436ff6d951SJohn Birrell ; 7446ff6d951SJohn Birrell 7456ff6d951SJohn Birrell struct_declarator: 7466ff6d951SJohn Birrell declarator { dt_decl_member(NULL); } 7476ff6d951SJohn Birrell | DT_TOK_COLON constant_expression { dt_decl_member($2); } 7486ff6d951SJohn Birrell | declarator DT_TOK_COLON constant_expression { 7496ff6d951SJohn Birrell dt_decl_member($3); 7506ff6d951SJohn Birrell } 7516ff6d951SJohn Birrell ; 7526ff6d951SJohn Birrell 7536ff6d951SJohn Birrell enum_specifier: 7546ff6d951SJohn Birrell enum_definition enumerator_list '}' { $$ = dt_scope_pop(); } 7556ff6d951SJohn Birrell | DT_KEY_ENUM DT_TOK_IDENT { $$ = dt_decl_spec(CTF_K_ENUM, $2); } 7566ff6d951SJohn Birrell | DT_KEY_ENUM DT_TOK_TNAME { $$ = dt_decl_spec(CTF_K_ENUM, $2); } 7576ff6d951SJohn Birrell ; 7586ff6d951SJohn Birrell 7596ff6d951SJohn Birrell enum_definition: 7606ff6d951SJohn Birrell DT_KEY_ENUM '{' { dt_decl_enum(NULL); } 7616ff6d951SJohn Birrell | DT_KEY_ENUM DT_TOK_IDENT '{' { dt_decl_enum($2); } 7626ff6d951SJohn Birrell | DT_KEY_ENUM DT_TOK_TNAME '{' { dt_decl_enum($2); } 7636ff6d951SJohn Birrell ; 7646ff6d951SJohn Birrell 7656ff6d951SJohn Birrell enumerator_list: 7666ff6d951SJohn Birrell enumerator 7676ff6d951SJohn Birrell | enumerator_list DT_TOK_COMMA enumerator 7686ff6d951SJohn Birrell ; 7696ff6d951SJohn Birrell 7706ff6d951SJohn Birrell enumerator: DT_TOK_IDENT { dt_decl_enumerator($1, NULL); } 7716ff6d951SJohn Birrell | DT_TOK_IDENT DT_TOK_ASGN expression { 7726ff6d951SJohn Birrell dt_decl_enumerator($1, $3); 7736ff6d951SJohn Birrell } 7746ff6d951SJohn Birrell ; 7756ff6d951SJohn Birrell 7766ff6d951SJohn Birrell declarator: direct_declarator 7776ff6d951SJohn Birrell | pointer direct_declarator 7786ff6d951SJohn Birrell ; 7796ff6d951SJohn Birrell 7806ff6d951SJohn Birrell direct_declarator: 7816ff6d951SJohn Birrell DT_TOK_IDENT { $$ = dt_decl_ident($1); } 7826ff6d951SJohn Birrell | lparen declarator DT_TOK_RPAR { $$ = $2; } 7836ff6d951SJohn Birrell | direct_declarator array { dt_decl_array($2); } 7846ff6d951SJohn Birrell | direct_declarator function { dt_decl_func($1, $2); } 7856ff6d951SJohn Birrell ; 7866ff6d951SJohn Birrell 7876ff6d951SJohn Birrell lparen: DT_TOK_LPAR { dt_decl_top()->dd_attr |= DT_DA_PAREN; } 7886ff6d951SJohn Birrell ; 7896ff6d951SJohn Birrell 7906ff6d951SJohn Birrell pointer: DT_TOK_MUL { $$ = dt_decl_ptr(); } 7916ff6d951SJohn Birrell | DT_TOK_MUL type_qualifier_list { $$ = dt_decl_ptr(); } 7926ff6d951SJohn Birrell | DT_TOK_MUL pointer { $$ = dt_decl_ptr(); } 7936ff6d951SJohn Birrell | DT_TOK_MUL type_qualifier_list pointer { $$ = dt_decl_ptr(); } 7946ff6d951SJohn Birrell ; 7956ff6d951SJohn Birrell 7966ff6d951SJohn Birrell type_qualifier_list: 7976ff6d951SJohn Birrell type_qualifier 7986ff6d951SJohn Birrell | type_qualifier_list type_qualifier { $$ = $2; } 7996ff6d951SJohn Birrell ; 8006ff6d951SJohn Birrell 8016ff6d951SJohn Birrell parameter_type_list: 8026ff6d951SJohn Birrell parameter_list 8036ff6d951SJohn Birrell | DT_TOK_ELLIPSIS { $$ = dt_node_vatype(); } 8046ff6d951SJohn Birrell | parameter_list DT_TOK_COMMA DT_TOK_ELLIPSIS { 8056ff6d951SJohn Birrell $$ = LINK($1, dt_node_vatype()); 8066ff6d951SJohn Birrell } 8076ff6d951SJohn Birrell ; 8086ff6d951SJohn Birrell 8096ff6d951SJohn Birrell parameter_list: parameter_declaration 8106ff6d951SJohn Birrell | parameter_list DT_TOK_COMMA parameter_declaration { 8116ff6d951SJohn Birrell $$ = LINK($1, $3); 8126ff6d951SJohn Birrell } 8136ff6d951SJohn Birrell ; 8146ff6d951SJohn Birrell 8156ff6d951SJohn Birrell parameter_declaration: 8166ff6d951SJohn Birrell parameter_declaration_specifiers { 8176ff6d951SJohn Birrell $$ = dt_node_type(NULL); 8186ff6d951SJohn Birrell } 8196ff6d951SJohn Birrell | parameter_declaration_specifiers declarator { 8206ff6d951SJohn Birrell $$ = dt_node_type(NULL); 8216ff6d951SJohn Birrell } 8226ff6d951SJohn Birrell | parameter_declaration_specifiers abstract_declarator { 8236ff6d951SJohn Birrell $$ = dt_node_type(NULL); 8246ff6d951SJohn Birrell } 8256ff6d951SJohn Birrell ; 8266ff6d951SJohn Birrell 8276ff6d951SJohn Birrell type_name: specifier_qualifier_list { 8286ff6d951SJohn Birrell $$ = dt_decl_pop(); 8296ff6d951SJohn Birrell } 8306ff6d951SJohn Birrell | specifier_qualifier_list abstract_declarator { 8316ff6d951SJohn Birrell $$ = dt_decl_pop(); 8326ff6d951SJohn Birrell } 8336ff6d951SJohn Birrell ; 8346ff6d951SJohn Birrell 8356ff6d951SJohn Birrell abstract_declarator: 8366ff6d951SJohn Birrell pointer 8376ff6d951SJohn Birrell | direct_abstract_declarator 8386ff6d951SJohn Birrell | pointer direct_abstract_declarator 8396ff6d951SJohn Birrell ; 8406ff6d951SJohn Birrell 8416ff6d951SJohn Birrell direct_abstract_declarator: 8426ff6d951SJohn Birrell lparen abstract_declarator DT_TOK_RPAR { $$ = $2; } 8436ff6d951SJohn Birrell | direct_abstract_declarator array { dt_decl_array($2); } 8446ff6d951SJohn Birrell | array { dt_decl_array($1); $$ = NULL; } 8456ff6d951SJohn Birrell | direct_abstract_declarator function { dt_decl_func($1, $2); } 8466ff6d951SJohn Birrell | function { dt_decl_func(NULL, $1); } 8476ff6d951SJohn Birrell ; 8486ff6d951SJohn Birrell 8496ff6d951SJohn Birrell array: DT_TOK_LBRAC { dt_scope_push(NULL, CTF_ERR); } 85084e874bdSMark Johnston array_parameters DT_TOK_RBRAC { 85184e874bdSMark Johnston dt_scope_pop(); 85284e874bdSMark Johnston $$ = $3; 85384e874bdSMark Johnston } 85484e874bdSMark Johnston ; 85584e874bdSMark Johnston 85684e874bdSMark Johnston array_parameters: 85784e874bdSMark Johnston /* empty */ { $$ = NULL; } 85884e874bdSMark Johnston | constant_expression { $$ = $1; } 85984e874bdSMark Johnston | parameter_type_list { $$ = $1; } 86084e874bdSMark Johnston ; 8616ff6d951SJohn Birrell 862 function: DT_TOK_LPAR { dt_scope_push(NULL, CTF_ERR); } 863 function_parameters DT_TOK_RPAR { 864 dt_scope_pop(); 865 $$ = $3; 866 } 867 ; 868 869 function_parameters: 870 /* empty */ { $$ = NULL; } 871 | parameter_type_list { $$ = $1; } 872 ; 873 874 dtrace_keyword_ident: 875 DT_KEY_PROBE { $$ = DUP("probe"); } 876 | DT_KEY_PROVIDER { $$ = DUP("provider"); } 877 | DT_KEY_SELF { $$ = DUP("self"); } 878 | DT_KEY_STRING { $$ = DUP("string"); } 879 | DT_TOK_STRINGOF { $$ = DUP("stringof"); } 880 | DT_KEY_USERLAND { $$ = DUP("userland"); } 881 | DT_TOK_XLATE { $$ = DUP("xlate"); } 882 | DT_KEY_XLATOR { $$ = DUP("translator"); } 883 ; 884 885 %% 886