3
polygen grammar for LLVM assembly language.
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
11
TODO: Metadata, in all its forms
15
I ::= "title: LLVM assembly language\n"
16
^ "status: experimental\n"
17
^ "audience: LLVM developers\n"
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.
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 ;
55
The rest of this file is derived directly from llvmAsmParser.y.
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 ;
64
IPredicates ::= eq | ne | slt | sgt | sle | sge | ult | ugt | ule | uge ;
66
FPredicates ::= oeq | one | olt | ogt | ole | oge | ord | uno | ueq | une
67
| ult | ugt | ule | uge | true | false ;
70
FPType ::= float | double | "ppc_fp128" | fp128 | "x86_fp80";
72
LocalName ::= LOCALVAR | STRINGCONSTANT | PCTSTRINGCONSTANT ;
73
OptLocalName ::= LocalName | _ ;
75
OptAddrSpace ::= - addrspace ^ "(" ^ EUINT64VAL ^ ")" | _ ;
77
OptLocalAssign ::= LocalName "=" | _ ;
79
GlobalName ::= GLOBALVAR | ATSTRINGCONSTANT ;
81
OptGlobalAssign ::= GlobalAssign | _ ;
83
GlobalAssign ::= GlobalName "=" ;
96
| "linker_private_weak"
112
FunctionDeclareLinkage
118
FunctionDefineLinkage
128
AliasLinkage ::= + _ | weak | "weak_odr" | internal ;
130
OptCallingConv ::= + _ |
138
ParamAttr ::= zeroext
149
OptParamAttrs ::= + _ | OptParamAttrs ParamAttr ;
158
| OptRetAttrs RetAttr
161
FuncAttr ::= noreturn
177
OptFuncAttrs ::= + _ | OptFuncAttrs FuncAttr ;
179
OptGC ::= + _ | gc STRINGCONSTANT ;
181
OptAlign ::= + _ | align EUINT64VAL ;
182
OptCAlign ::= + _ | ^ "," align EUINT64VAL ;
184
SectionString ::= section STRINGCONSTANT ;
186
OptSection ::= + _ | SectionString ;
188
GlobalVarAttributes ::= + _ | ^ "," GlobalVarAttribute GlobalVarAttributes ;
189
GlobalVarAttribute ::= SectionString | align EUINT64VAL ;
191
PrimType ::= INTTYPE | float | double | "ppc_fp128" | fp128 | "x86_fp80"
197
| Types OptAddrSpace ^ "*"
200
| Types "(" ^ ArgTypeListI ^ ")" OptFuncAttrs
201
| void "(" ^ ArgTypeListI ^ ")" OptFuncAttrs
202
| "[" ^ EUINT64VAL "x" Types ^ "]"
203
| "<" ^ EUINT64VAL "x" Types ^ ">"
206
| "<" ^ "{" TypeListI "}" ^ ">"
207
| "<" ^ "{" ^ "}" ^ ">"
210
ArgType ::= Types OptParamAttrs ;
212
ResultTypes ::= Types | void ;
214
ArgTypeList ::= ArgType | ArgTypeList ^ "," ArgType ;
216
ArgTypeListI ::= ArgTypeList | ArgTypeList ^ "," "..." | "..." | _ ;
218
TypeListI ::= Types | TypeListI ^ "," Types ;
220
ConstVal::= Types "[" ^ ConstVector ^ "]"
222
| Types "c" ^ STRINGCONSTANT
223
| Types "<" ^ ConstVector ^ ">"
224
| Types "{" ConstVector "}"
226
| Types "<" ^ "{" ConstVector "}" ^ ">"
227
| Types "<" ^ "{" ^ "}" ^ ">"
230
| Types SymbolicValueRef
232
| Types zeroinitializer
241
ConstExpr::= CastOps "(" ^ ConstVal to Types ^ ")"
242
| getelementptr OptInBounds "(" ^ ConstVal IndexList ^ ")"
243
| select "(" ^ ConstVal ^ "," ConstVal ^ "," ConstVal ^ ")"
244
| ArithmeticOps "(" ^ ConstVal ^ "," ConstVal ^ ")"
245
| LogicalOps "(" ^ ConstVal ^ "," ConstVal ^ ")"
246
| icmp IPredicates "(" ^ ConstVal ^ "," ConstVal ^ ")"
247
| fcmp FPredicates "(" ^ ConstVal ^ "," ConstVal ^ ")"
248
| extractelement "(" ^ ConstVal ^ "," ConstVal ^ ")"
249
| insertelement "(" ^ ConstVal ^ "," ConstVal ^ "," ConstVal ^ ")"
250
| shufflevector "(" ^ ConstVal ^ "," ConstVal ^ "," ConstVal ^ ")"
251
| extractvalue "(" ^ ConstVal ^ ConstantIndexList ^ ")"
252
| insertvalue "(" ^ ConstVal ^ "," ConstVal ^ ConstantIndexList ^ ")" ;
254
ConstVector ::= ConstVector ^ "," ConstVal | ConstVal ;
256
GlobalType ::= global | constant ;
258
ThreadLocal ::= - "thread_local" | _ ;
260
AliaseeRef ::= ResultTypes SymbolicValueRef
261
| bitcast "(" ^ AliaseeRef to Types ^ ")" ;
263
Module ::= +++ DefinitionList | --- _ ;
265
DefinitionList ::= - Definition | + DefinitionList Definition ;
268
::= ^ ( +++++ define Function
269
| declare FunctionProto
270
| - module asm AsmBlock
271
| OptLocalAssign type Types
272
| OptGlobalAssign GVVisibilityStyle ThreadLocal OptAddrSpace GlobalType
273
ConstVal GlobalVarAttributes
274
| OptGlobalAssign GVInternalLinkage GVVisibilityStyle ThreadLocal OptAddrSpace
275
GlobalType ConstVal GlobalVarAttributes
276
| OptGlobalAssign GVExternalLinkage GVVisibilityStyle ThreadLocal OptAddrSpace
277
GlobalType Types GlobalVarAttributes
278
| OptGlobalAssign GVVisibilityStyle alias AliasLinkage AliaseeRef
279
| target TargetDefinition
280
| deplibs "=" LibrariesDefinition
283
AsmBlock ::= STRINGCONSTANT ;
285
TargetDefinition ::= triple "=" STRINGCONSTANT
286
| datalayout "=" STRINGCONSTANT ;
288
LibrariesDefinition ::= "[" ( LibList | _ ) "]";
290
LibList ::= LibList ^ "," STRINGCONSTANT | STRINGCONSTANT ;
292
ArgListH ::= ArgListH ^ "," Types OptParamAttrs OptLocalName
293
| Types OptParamAttrs OptLocalName ;
295
ArgList ::= ArgListH | ArgListH ^ "," "..." | "..." | _ ;
297
FunctionHeaderH ::= OptCallingConv OptRetAttrs ResultTypes
298
GlobalName ^ "(" ^ ArgList ^ ")"
299
OptFuncAttrs OptSection OptAlign OptGC ;
301
BEGIN ::= ( begin | "{" ) ^ "\n";
304
FunctionDefineLinkage GVVisibilityStyle FunctionHeaderH BEGIN ;
306
END ::= ^ ( end | "}" ) ^ "\n";
308
Function ::= BasicBlockList END ;
310
FunctionProto ::= FunctionDeclareLinkage GVVisibilityStyle FunctionHeaderH ;
312
OptSideEffect ::= _ | sideeffect ;
314
ConstValueRef ::= ESINT64VAL
322
| "<" ConstVector ">"
323
| "[" ConstVector "]"
325
| "c" ^ STRINGCONSTANT
326
| "{" ConstVector "}"
328
| "<" ^ "{" ConstVector "}" ^ ">"
329
| "<" ^ "{" ^ "}" ^ ">"
331
| asm OptSideEffect STRINGCONSTANT ^ "," STRINGCONSTANT ;
333
SymbolicValueRef ::= LOCALVALID
338
ValueRef ::= SymbolicValueRef | ConstValueRef;
340
ResolvedVal ::= Types ValueRef ;
342
ReturnedVal ::= ResolvedVal | ReturnedVal ^ "," ResolvedVal ;
344
BasicBlockList ::= BasicBlockList BasicBlock | FunctionHeader BasicBlock ;
346
BasicBlock ::= InstructionList OptLocalAssign BBTerminatorInst ;
348
InstructionList ::= +++ InstructionList Inst
350
| ^ LABELSTR ^ ":\n" ;
352
BBTerminatorInst ::= ^ " " ^
356
| br INTTYPE ValueRef ^ "," label ValueRef ^ "," label ValueRef
357
| switch IntType ValueRef ^ "," label ValueRef "[" JumpTable "]"
358
| switch IntType ValueRef ^ "," label ValueRef "[" ^ "]"
359
| invoke OptCallingConv ResultTypes ValueRef ^ "(" ^ ParamList ^ ")"
361
to label ValueRef unwind label ValueRef
363
| unreachable ) ^ "\n";
365
JumpTable ::= JumpTable IntType ConstValueRef ^ "," label ValueRef
366
| IntType ConstValueRef ^ "," label ValueRef ;
368
Inst ::= ^ " " ^ OptLocalAssign InstVal ^ "\n";
370
PHIList ::= Types "[" ValueRef ^ "," ValueRef "]"
371
| PHIList ^ "," "[" ValueRef ^ "," ValueRef "]" ;
373
ParamList ::= Types OptParamAttrs ValueRef OptParamAttrs
374
| label OptParamAttrs ValueRef OptParamAttrs
375
| ParamList ^ "," Types OptParamAttrs ValueRef OptParamAttrs
376
| ParamList ^ "," label OptParamAttrs ValueRef OptParamAttrs
379
IndexList ::= _ | IndexList ^ "," ResolvedVal ;
381
ConstantIndexList ::= "," EUINT64VAL | ConstantIndexList ^ "," EUINT64VAL ;
383
OptTailCall ::= tail call | call ;
386
ArithmeticOps Types ValueRef ^ "," ValueRef
387
| LogicalOps Types ValueRef ^ "," ValueRef
388
| icmp IPredicates Types ValueRef ^ "," ValueRef
389
| fcmp FPredicates Types ValueRef ^ "," ValueRef
390
| CastOps ResolvedVal to Types
391
| select ResolvedVal ^ "," ResolvedVal ^ "," ResolvedVal
392
| "va_arg" ResolvedVal ^ "," Types
393
| extractelement ResolvedVal ^ "," ResolvedVal
394
| insertelement ResolvedVal ^ "," ResolvedVal ^ "," ResolvedVal
395
| shufflevector ResolvedVal ^ "," ResolvedVal ^ "," ResolvedVal
397
| OptTailCall OptCallingConv ResultTypes ValueRef ^ "(" ^ ParamList ^ ")"
401
OptVolatile ::= - volatile | _ ;
402
OptExact ::= - exact | _ ;
403
OptNSW ::= - nsw | _ ;
404
OptNUW ::= - nuw | _ ;
405
OptNW ::= OptNUW OptNSW | OptNSW OptNUW ;
406
OptInBounds ::= - inbounds | _ ;
408
MemoryInst ::= malloc Types OptCAlign
409
| malloc Types ^ "," INTTYPE ValueRef OptCAlign
410
| alloca Types OptCAlign
411
| alloca Types ^ "," INTTYPE ValueRef OptCAlign
413
| OptVolatile load Types ValueRef OptCAlign
414
| OptVolatile store ResolvedVal ^ "," Types ValueRef OptCAlign
415
| getresult Types ValueRef ^ "," EUINT64VAL
416
| getelementptr OptInBounds Types ValueRef IndexList
417
| extractvalue Types ValueRef ^ ConstantIndexList
418
| insertvalue Types ValueRef ^ "," Types ValueRef ^ ConstantIndexList ;