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