Mercurial > hg > CbC > CbC_llvm
comparison utils/llvm.grm @ 171:66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 25 May 2020 11:07:02 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
150:1d019706d866 | 171:66f3bfe93da9 |
---|---|
1 (* | |
2 | |
3 polygen grammar for LLVM assembly language. | |
4 | |
5 This file defines an LLVM assembly language grammar for polygen, | |
6 which is a tool for generating random text based on a grammar. | |
7 It is strictly syntax-based, and makes no attempt to generate | |
8 IR that is semantically valid. Most of the IR produced doesn't | |
9 pass the Verifier. | |
10 | |
11 TODO: Metadata, in all its forms | |
12 | |
13 *) | |
14 | |
15 I ::= "title: LLVM assembly language\n" | |
16 ^ "status: experimental\n" | |
17 ^ "audience: LLVM developers\n" | |
18 ; | |
19 | |
20 S ::= Module ; | |
21 | |
22 (* | |
23 Define rules for non-keyword tokens. This is currently just a bunch | |
24 of hacks. They don't cover many valid forms of tokens, and they also | |
25 generate some invalid forms of tokens. The LLVM parser has custom | |
26 C++ code to lex these; custom C++ code for emitting them would be | |
27 convenient, but polygen doesn't support that. | |
28 *) | |
29 NonZeroDecimalDigit ::= 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 ; | |
30 DecimalDigit ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 ; | |
31 DecimalDigitSeq ::= DecimalDigit [^ DecimalDigitSeq ]; | |
32 HexDigit ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
33 | a | b | c | d | e | f ; | |
34 HexDigitSeq ::= HexDigit [^ HexDigitSeq ]; | |
35 StringChar ::= a | b | c | d | e | f | g | h | i | j | k | l | m | |
36 | n | o | p | q | r | s | t | u | v | w | x | y | z ; | |
37 StringConstantSeq ::= StringChar [^ StringConstantSeq ]; | |
38 StringConstant ::= StringChar [^ StringConstantSeq ]; | |
39 EUINT64VAL ::= NonZeroDecimalDigit [^ DecimalDigitSeq ]; | |
40 ESINT64VAL ::= [ "-" ] ^ EUINT64VAL ; | |
41 EUAPINTVAL ::= EUINT64VAL ; | |
42 ESAPINTVAL ::= ESINT64VAL ; | |
43 LOCALVALID ::= "%" ^ DecimalDigitSeq ; | |
44 GLOBALVALID ::= "@" ^ DecimalDigitSeq ; | |
45 INTTYPE ::= "i" ^ EUINT64VAL ; | |
46 GLOBALVAR ::= "@" ^ StringConstant ; | |
47 LOCALVAR ::= "%" ^ StringConstant ; | |
48 STRINGCONSTANT ::= "\"" ^ StringConstant ^ "\"" ; | |
49 ATSTRINGCONSTANT ::= "@" ^ STRINGCONSTANT ; | |
50 PCTSTRINGCONSTANT ::= "%" ^ STRINGCONSTANT ; | |
51 LABELSTR ::= StringConstant ; | |
52 FPVAL ::= ESAPINTVAL ^ "." ^ EUAPINTVAL | "0x" ^ HexDigitSeq ; | |
53 | |
54 (* | |
55 The rest of this file is derived directly from llvmAsmParser.y. | |
56 *) | |
57 | |
58 ArithmeticOps ::= + OptNW add | fadd | OptNW sub | fsub | OptNW mul | fmul | | |
59 udiv | OptExact sdiv | fdiv | urem | srem | frem ; | |
60 LogicalOps ::= shl | lshr | ashr | and | or | xor; | |
61 CastOps ::= trunc | zext | sext | fptrunc | fpext | bitcast | | |
62 uitofp | sitofp | fptoui | fptosi | inttoptr | ptrtoint ; | |
63 | |
64 IPredicates ::= eq | ne | slt | sgt | sle | sge | ult | ugt | ule | uge ; | |
65 | |
66 FPredicates ::= oeq | one | olt | ogt | ole | oge | ord | uno | ueq | une | |
67 | ult | ugt | ule | uge | true | false ; | |
68 | |
69 IntType ::= INTTYPE; | |
70 FPType ::= float | double | "ppc_fp128" | fp128 | "x86_fp80"; | |
71 | |
72 LocalName ::= LOCALVAR | STRINGCONSTANT | PCTSTRINGCONSTANT ; | |
73 OptLocalName ::= LocalName | _ ; | |
74 | |
75 OptAddrSpace ::= - addrspace ^ "(" ^ EUINT64VAL ^ ")" | _ ; | |
76 | |
77 OptLocalAssign ::= LocalName "=" | _ ; | |
78 | |
79 GlobalName ::= GLOBALVAR | ATSTRINGCONSTANT ; | |
80 | |
81 OptGlobalAssign ::= GlobalAssign | _ ; | |
82 | |
83 GlobalAssign ::= GlobalName "=" ; | |
84 | |
85 GVInternalLinkage | |
86 ::= + internal | |
87 | weak | |
88 | "weak_odr" | |
89 | linkonce | |
90 | "linkonce_odr" | |
91 | appending | |
92 | dllexport | |
93 | common | |
94 | private | |
95 ; | |
96 | |
97 GVExternalLinkage | |
98 ::= dllimport | |
99 | "extern_weak" | |
100 | + external | |
101 ; | |
102 | |
103 GVVisibilityStyle | |
104 ::= + _ | |
105 | default | |
106 | hidden | |
107 | protected | |
108 ; | |
109 | |
110 FunctionDeclareLinkage | |
111 ::= + _ | |
112 | dllimport | |
113 | "extern_weak" | |
114 ; | |
115 | |
116 FunctionDefineLinkage | |
117 ::= + _ | |
118 | internal | |
119 | linkonce | |
120 | "linkonce_odr" | |
121 | weak | |
122 | "weak_odr" | |
123 | dllexport | |
124 ; | |
125 | |
126 AliasLinkage ::= + _ | weak | "weak_odr" | internal ; | |
127 | |
128 OptCallingConv ::= + _ | | |
129 ccc | | |
130 fastcc | | |
131 coldcc | | |
132 "x86_stdcallcc" | | |
133 "x86_fastcallcc" | | |
134 cc EUINT64VAL ; | |
135 | |
136 ParamAttr ::= zeroext | |
137 | signext | |
138 | inreg | |
139 | sret | |
140 | noalias | |
141 | nocapture | |
142 | byval | |
143 | nest | |
144 | align EUINT64VAL | |
145 ; | |
146 | |
147 OptParamAttrs ::= + _ | OptParamAttrs ParamAttr ; | |
148 | |
149 RetAttr ::= inreg | |
150 | zeroext | |
151 | signext | |
152 | noalias | |
153 ; | |
154 | |
155 OptRetAttrs ::= _ | |
156 | OptRetAttrs RetAttr | |
157 ; | |
158 | |
159 FuncAttr ::= noreturn | |
160 | nounwind | |
161 | inreg | |
162 | zeroext | |
163 | signext | |
164 | readnone | |
165 | readonly | |
166 | inlinehint | |
167 | alignstack | |
168 | noinline | |
169 | alwaysinline | |
170 | optsize | |
171 | ssp | |
172 | sspreq | |
173 | returns_twice | |
174 | nonlazybind | |
175 | sanitize_address | |
176 | sanitize_thread | |
177 | sanitize_memory | |
178 ; | |
179 | |
180 OptFuncAttrs ::= + _ | OptFuncAttrs FuncAttr ; | |
181 | |
182 OptGC ::= + _ | gc STRINGCONSTANT ; | |
183 | |
184 OptAlign ::= + _ | align EUINT64VAL ; | |
185 OptCAlign ::= + _ | ^ "," align EUINT64VAL ; | |
186 | |
187 SectionString ::= section STRINGCONSTANT ; | |
188 | |
189 OptSection ::= + _ | SectionString ; | |
190 | |
191 GlobalVarAttributes ::= + _ | ^ "," GlobalVarAttribute GlobalVarAttributes ; | |
192 GlobalVarAttribute ::= SectionString | align EUINT64VAL ; | |
193 | |
194 PrimType ::= INTTYPE | float | double | "ppc_fp128" | fp128 | "x86_fp80" | |
195 | - label ; | |
196 | |
197 Types | |
198 ::= opaque | |
199 | PrimType | |
200 | Types OptAddrSpace ^ "*" | |
201 | SymbolicValueRef | |
202 | "\\" ^ EUINT64VAL | |
203 | Types "(" ^ ArgTypeListI ^ ")" OptFuncAttrs | |
204 | void "(" ^ ArgTypeListI ^ ")" OptFuncAttrs | |
205 | "[" ^ EUINT64VAL "x" Types ^ "]" | |
206 | "<" ^ EUINT64VAL "x" Types ^ ">" | |
207 | "{" TypeListI "}" | |
208 | "{" ^ "}" | |
209 | "<" ^ "{" TypeListI "}" ^ ">" | |
210 | "<" ^ "{" ^ "}" ^ ">" | |
211 ; | |
212 | |
213 ArgType ::= Types OptParamAttrs ; | |
214 | |
215 ResultTypes ::= Types | void ; | |
216 | |
217 ArgTypeList ::= ArgType | ArgTypeList ^ "," ArgType ; | |
218 | |
219 ArgTypeListI ::= ArgTypeList | ArgTypeList ^ "," "..." | "..." | _ ; | |
220 | |
221 TypeListI ::= Types | TypeListI ^ "," Types ; | |
222 | |
223 ConstVal::= Types "[" ^ ConstVector ^ "]" | |
224 | Types "[" ^ "]" | |
225 | Types "c" ^ STRINGCONSTANT | |
226 | Types "<" ^ ConstVector ^ ">" | |
227 | Types "{" ConstVector "}" | |
228 | Types "{" ^ "}" | |
229 | Types "<" ^ "{" ConstVector "}" ^ ">" | |
230 | Types "<" ^ "{" ^ "}" ^ ">" | |
231 | Types null | |
232 | Types undef | |
233 | Types SymbolicValueRef | |
234 | Types ConstExpr | |
235 | Types zeroinitializer | |
236 | Types ESINT64VAL | |
237 | Types ESAPINTVAL | |
238 | Types EUINT64VAL | |
239 | Types EUAPINTVAL | |
240 | Types true | |
241 | Types false | |
242 | Types FPVAL ; | |
243 | |
244 ConstExpr::= CastOps "(" ^ ConstVal to Types ^ ")" | |
245 | getelementptr OptInBounds "(" ^ ConstVal IndexList ^ ")" | |
246 | select "(" ^ ConstVal ^ "," ConstVal ^ "," ConstVal ^ ")" | |
247 | ArithmeticOps "(" ^ ConstVal ^ "," ConstVal ^ ")" | |
248 | LogicalOps "(" ^ ConstVal ^ "," ConstVal ^ ")" | |
249 | icmp IPredicates "(" ^ ConstVal ^ "," ConstVal ^ ")" | |
250 | fcmp FPredicates "(" ^ ConstVal ^ "," ConstVal ^ ")" | |
251 | extractelement "(" ^ ConstVal ^ "," ConstVal ^ ")" | |
252 | insertelement "(" ^ ConstVal ^ "," ConstVal ^ "," ConstVal ^ ")" | |
253 | shufflevector "(" ^ ConstVal ^ "," ConstVal ^ "," ConstVal ^ ")" | |
254 | extractvalue "(" ^ ConstVal ^ ConstantIndexList ^ ")" | |
255 | insertvalue "(" ^ ConstVal ^ "," ConstVal ^ ConstantIndexList ^ ")" ; | |
256 | |
257 ConstVector ::= ConstVector ^ "," ConstVal | ConstVal ; | |
258 | |
259 GlobalType ::= global | constant ; | |
260 | |
261 ThreadLocal ::= - "thread_local" | _ ; | |
262 | |
263 AliaseeRef ::= ResultTypes SymbolicValueRef | |
264 | bitcast "(" ^ AliaseeRef to Types ^ ")" ; | |
265 | |
266 Module ::= +++ DefinitionList | --- _ ; | |
267 | |
268 DefinitionList ::= - Definition | + DefinitionList Definition ; | |
269 | |
270 Definition | |
271 ::= ^ ( +++++ define Function | |
272 | declare FunctionProto | |
273 | - module asm AsmBlock | |
274 | OptLocalAssign type Types | |
275 | OptGlobalAssign GVVisibilityStyle ThreadLocal OptAddrSpace GlobalType | |
276 ConstVal GlobalVarAttributes | |
277 | OptGlobalAssign GVInternalLinkage GVVisibilityStyle ThreadLocal OptAddrSpace | |
278 GlobalType ConstVal GlobalVarAttributes | |
279 | OptGlobalAssign GVExternalLinkage GVVisibilityStyle ThreadLocal OptAddrSpace | |
280 GlobalType Types GlobalVarAttributes | |
281 | OptGlobalAssign GVVisibilityStyle alias AliasLinkage AliaseeRef | |
282 | target TargetDefinition | |
283 | deplibs "=" LibrariesDefinition | |
284 ) ^ "\n"; | |
285 | |
286 AsmBlock ::= STRINGCONSTANT ; | |
287 | |
288 TargetDefinition ::= triple "=" STRINGCONSTANT | |
289 | datalayout "=" STRINGCONSTANT ; | |
290 | |
291 LibrariesDefinition ::= "[" ( LibList | _ ) "]"; | |
292 | |
293 LibList ::= LibList ^ "," STRINGCONSTANT | STRINGCONSTANT ; | |
294 | |
295 ArgListH ::= ArgListH ^ "," Types OptParamAttrs OptLocalName | |
296 | Types OptParamAttrs OptLocalName ; | |
297 | |
298 ArgList ::= ArgListH | ArgListH ^ "," "..." | "..." | _ ; | |
299 | |
300 FunctionHeaderH ::= OptCallingConv OptRetAttrs ResultTypes | |
301 GlobalName ^ "(" ^ ArgList ^ ")" | |
302 OptFuncAttrs OptSection OptAlign OptGC ; | |
303 | |
304 BEGIN ::= ( begin | "{" ) ^ "\n"; | |
305 | |
306 FunctionHeader ::= | |
307 FunctionDefineLinkage GVVisibilityStyle FunctionHeaderH BEGIN ; | |
308 | |
309 END ::= ^ ( end | "}" ) ^ "\n"; | |
310 | |
311 Function ::= BasicBlockList END ; | |
312 | |
313 FunctionProto ::= FunctionDeclareLinkage GVVisibilityStyle FunctionHeaderH ; | |
314 | |
315 OptSideEffect ::= _ | sideeffect ; | |
316 | |
317 ConstValueRef ::= ESINT64VAL | |
318 | EUINT64VAL | |
319 | FPVAL | |
320 | true | |
321 | false | |
322 | null | |
323 | undef | |
324 | zeroinitializer | |
325 | "<" ConstVector ">" | |
326 | "[" ConstVector "]" | |
327 | "[" ^ "]" | |
328 | "c" ^ STRINGCONSTANT | |
329 | "{" ConstVector "}" | |
330 | "{" ^ "}" | |
331 | "<" ^ "{" ConstVector "}" ^ ">" | |
332 | "<" ^ "{" ^ "}" ^ ">" | |
333 | ConstExpr | |
334 | asm OptSideEffect STRINGCONSTANT ^ "," STRINGCONSTANT ; | |
335 | |
336 SymbolicValueRef ::= LOCALVALID | |
337 | GLOBALVALID | |
338 | LocalName | |
339 | GlobalName ; | |
340 | |
341 ValueRef ::= SymbolicValueRef | ConstValueRef; | |
342 | |
343 ResolvedVal ::= Types ValueRef ; | |
344 | |
345 ReturnedVal ::= ResolvedVal | ReturnedVal ^ "," ResolvedVal ; | |
346 | |
347 BasicBlockList ::= BasicBlockList BasicBlock | FunctionHeader BasicBlock ; | |
348 | |
349 BasicBlock ::= InstructionList OptLocalAssign BBTerminatorInst ; | |
350 | |
351 InstructionList ::= +++ InstructionList Inst | |
352 | - _ | |
353 | ^ LABELSTR ^ ":\n" ; | |
354 | |
355 BBTerminatorInst ::= ^ " " ^ | |
356 ( ret ReturnedVal | |
357 | ret void | |
358 | br label ValueRef | |
359 | br INTTYPE ValueRef ^ "," label ValueRef ^ "," label ValueRef | |
360 | switch IntType ValueRef ^ "," label ValueRef "[" JumpTable "]" | |
361 | switch IntType ValueRef ^ "," label ValueRef "[" ^ "]" | |
362 | invoke OptCallingConv ResultTypes ValueRef ^ "(" ^ ParamList ^ ")" | |
363 OptFuncAttrs | |
364 to label ValueRef unwind label ValueRef | |
365 | unwind | |
366 | unreachable ) ^ "\n"; | |
367 | |
368 JumpTable ::= JumpTable IntType ConstValueRef ^ "," label ValueRef | |
369 | IntType ConstValueRef ^ "," label ValueRef ; | |
370 | |
371 Inst ::= ^ " " ^ OptLocalAssign InstVal ^ "\n"; | |
372 | |
373 PHIList ::= Types "[" ValueRef ^ "," ValueRef "]" | |
374 | PHIList ^ "," "[" ValueRef ^ "," ValueRef "]" ; | |
375 | |
376 ParamList ::= Types OptParamAttrs ValueRef OptParamAttrs | |
377 | label OptParamAttrs ValueRef OptParamAttrs | |
378 | ParamList ^ "," Types OptParamAttrs ValueRef OptParamAttrs | |
379 | ParamList ^ "," label OptParamAttrs ValueRef OptParamAttrs | |
380 | - _ ; | |
381 | |
382 IndexList ::= _ | IndexList ^ "," ResolvedVal ; | |
383 | |
384 ConstantIndexList ::= "," EUINT64VAL | ConstantIndexList ^ "," EUINT64VAL ; | |
385 | |
386 OptTailCall ::= tail call | call ; | |
387 | |
388 InstVal ::= | |
389 ArithmeticOps Types ValueRef ^ "," ValueRef | |
390 | LogicalOps Types ValueRef ^ "," ValueRef | |
391 | icmp IPredicates Types ValueRef ^ "," ValueRef | |
392 | fcmp FPredicates Types ValueRef ^ "," ValueRef | |
393 | CastOps ResolvedVal to Types | |
394 | select ResolvedVal ^ "," ResolvedVal ^ "," ResolvedVal | |
395 | "va_arg" ResolvedVal ^ "," Types | |
396 | extractelement ResolvedVal ^ "," ResolvedVal | |
397 | insertelement ResolvedVal ^ "," ResolvedVal ^ "," ResolvedVal | |
398 | shufflevector ResolvedVal ^ "," ResolvedVal ^ "," ResolvedVal | |
399 | phi PHIList | |
400 | OptTailCall OptCallingConv ResultTypes ValueRef ^ "(" ^ ParamList ^ ")" | |
401 OptFuncAttrs | |
402 | MemoryInst ; | |
403 | |
404 OptVolatile ::= - volatile | _ ; | |
405 OptExact ::= - exact | _ ; | |
406 OptNSW ::= - nsw | _ ; | |
407 OptNUW ::= - nuw | _ ; | |
408 OptNW ::= OptNUW OptNSW | OptNSW OptNUW ; | |
409 OptInBounds ::= - inbounds | _ ; | |
410 | |
411 MemoryInst ::= malloc Types OptCAlign | |
412 | malloc Types ^ "," INTTYPE ValueRef OptCAlign | |
413 | alloca Types OptCAlign | |
414 | alloca Types ^ "," INTTYPE ValueRef OptCAlign | |
415 | free ResolvedVal | |
416 | OptVolatile load Types ValueRef OptCAlign | |
417 | OptVolatile store ResolvedVal ^ "," Types ValueRef OptCAlign | |
418 | getresult Types ValueRef ^ "," EUINT64VAL | |
419 | getelementptr OptInBounds Types ValueRef IndexList | |
420 | extractvalue Types ValueRef ^ ConstantIndexList | |
421 | insertvalue Types ValueRef ^ "," Types ValueRef ^ ConstantIndexList ; |