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 | "linker_private" 96 | "linker_private_weak" 97 ; 98 99 GVExternalLinkage 100 ::= dllimport 101 | "extern_weak" 102 | + external 103 ; 104 105 GVVisibilityStyle 106 ::= + _ 107 | default 108 | hidden 109 | protected 110 ; 111 112 FunctionDeclareLinkage 113 ::= + _ 114 | dllimport 115 | "extern_weak" 116 ; 117 118 FunctionDefineLinkage 119 ::= + _ 120 | internal 121 | linkonce 122 | "linkonce_odr" 123 | weak 124 | "weak_odr" 125 | dllexport 126 ; 127 128 AliasLinkage ::= + _ | weak | "weak_odr" | internal ; 129 130 OptCallingConv ::= + _ | 131 ccc | 132 fastcc | 133 coldcc | 134 "x86_stdcallcc" | 135 "x86_fastcallcc" | 136 cc EUINT64VAL ; 137 138 ParamAttr ::= zeroext 139 | signext 140 | inreg 141 | sret 142 | noalias 143 | nocapture 144 | byval 145 | nest 146 | align EUINT64VAL 147 ; 148 149 OptParamAttrs ::= + _ | OptParamAttrs ParamAttr ; 150 151 RetAttr ::= inreg 152 | zeroext 153 | signext 154 | noalias 155 ; 156 157 OptRetAttrs ::= _ 158 | OptRetAttrs RetAttr 159 ; 160 161 FuncAttr ::= noreturn 162 | nounwind 163 | inreg 164 | zeroext 165 | signext 166 | readnone 167 | readonly 168 | inlinehint 169 | alignstack 170 | noinline 171 | alwaysinline 172 | optsize 173 | ssp 174 | sspreq 175 | returns_twice 176 | nonlazybind 177 | sanitize_address 178 | sanitize_thread 179 | sanitize_memory 180 ; 181 182 OptFuncAttrs ::= + _ | OptFuncAttrs FuncAttr ; 183 184 OptGC ::= + _ | gc STRINGCONSTANT ; 185 186 OptAlign ::= + _ | align EUINT64VAL ; 187 OptCAlign ::= + _ | ^ "," align EUINT64VAL ; 188 189 SectionString ::= section STRINGCONSTANT ; 190 191 OptSection ::= + _ | SectionString ; 192 193 GlobalVarAttributes ::= + _ | ^ "," GlobalVarAttribute GlobalVarAttributes ; 194 GlobalVarAttribute ::= SectionString | align EUINT64VAL ; 195 196 PrimType ::= INTTYPE | float | double | "ppc_fp128" | fp128 | "x86_fp80" 197 | - label ; 198 199 Types 200 ::= opaque 201 | PrimType 202 | Types OptAddrSpace ^ "*" 203 | SymbolicValueRef 204 | "\\" ^ EUINT64VAL 205 | Types "(" ^ ArgTypeListI ^ ")" OptFuncAttrs 206 | void "(" ^ ArgTypeListI ^ ")" OptFuncAttrs 207 | "[" ^ EUINT64VAL "x" Types ^ "]" 208 | "<" ^ EUINT64VAL "x" Types ^ ">" 209 | "{" TypeListI "}" 210 | "{" ^ "}" 211 | "<" ^ "{" TypeListI "}" ^ ">" 212 | "<" ^ "{" ^ "}" ^ ">" 213 ; 214 215 ArgType ::= Types OptParamAttrs ; 216 217 ResultTypes ::= Types | void ; 218 219 ArgTypeList ::= ArgType | ArgTypeList ^ "," ArgType ; 220 221 ArgTypeListI ::= ArgTypeList | ArgTypeList ^ "," "..." | "..." | _ ; 222 223 TypeListI ::= Types | TypeListI ^ "," Types ; 224 225 ConstVal::= Types "[" ^ ConstVector ^ "]" 226 | Types "[" ^ "]" 227 | Types "c" ^ STRINGCONSTANT 228 | Types "<" ^ ConstVector ^ ">" 229 | Types "{" ConstVector "}" 230 | Types "{" ^ "}" 231 | Types "<" ^ "{" ConstVector "}" ^ ">" 232 | Types "<" ^ "{" ^ "}" ^ ">" 233 | Types null 234 | Types undef 235 | Types SymbolicValueRef 236 | Types ConstExpr 237 | Types zeroinitializer 238 | Types ESINT64VAL 239 | Types ESAPINTVAL 240 | Types EUINT64VAL 241 | Types EUAPINTVAL 242 | Types true 243 | Types false 244 | Types FPVAL ; 245 246 ConstExpr::= CastOps "(" ^ ConstVal to Types ^ ")" 247 | getelementptr OptInBounds "(" ^ ConstVal IndexList ^ ")" 248 | select "(" ^ ConstVal ^ "," ConstVal ^ "," ConstVal ^ ")" 249 | ArithmeticOps "(" ^ ConstVal ^ "," ConstVal ^ ")" 250 | LogicalOps "(" ^ ConstVal ^ "," ConstVal ^ ")" 251 | icmp IPredicates "(" ^ ConstVal ^ "," ConstVal ^ ")" 252 | fcmp FPredicates "(" ^ ConstVal ^ "," ConstVal ^ ")" 253 | extractelement "(" ^ ConstVal ^ "," ConstVal ^ ")" 254 | insertelement "(" ^ ConstVal ^ "," ConstVal ^ "," ConstVal ^ ")" 255 | shufflevector "(" ^ ConstVal ^ "," ConstVal ^ "," ConstVal ^ ")" 256 | extractvalue "(" ^ ConstVal ^ ConstantIndexList ^ ")" 257 | insertvalue "(" ^ ConstVal ^ "," ConstVal ^ ConstantIndexList ^ ")" ; 258 259 ConstVector ::= ConstVector ^ "," ConstVal | ConstVal ; 260 261 GlobalType ::= global | constant ; 262 263 ThreadLocal ::= - "thread_local" | _ ; 264 265 AliaseeRef ::= ResultTypes SymbolicValueRef 266 | bitcast "(" ^ AliaseeRef to Types ^ ")" ; 267 268 Module ::= +++ DefinitionList | --- _ ; 269 270 DefinitionList ::= - Definition | + DefinitionList Definition ; 271 272 Definition 273 ::= ^ ( +++++ define Function 274 | declare FunctionProto 275 | - module asm AsmBlock 276 | OptLocalAssign type Types 277 | OptGlobalAssign GVVisibilityStyle ThreadLocal OptAddrSpace GlobalType 278 ConstVal GlobalVarAttributes 279 | OptGlobalAssign GVInternalLinkage GVVisibilityStyle ThreadLocal OptAddrSpace 280 GlobalType ConstVal GlobalVarAttributes 281 | OptGlobalAssign GVExternalLinkage GVVisibilityStyle ThreadLocal OptAddrSpace 282 GlobalType Types GlobalVarAttributes 283 | OptGlobalAssign GVVisibilityStyle alias AliasLinkage AliaseeRef 284 | target TargetDefinition 285 | deplibs "=" LibrariesDefinition 286 ) ^ "\n"; 287 288 AsmBlock ::= STRINGCONSTANT ; 289 290 TargetDefinition ::= triple "=" STRINGCONSTANT 291 | datalayout "=" STRINGCONSTANT ; 292 293 LibrariesDefinition ::= "[" ( LibList | _ ) "]"; 294 295 LibList ::= LibList ^ "," STRINGCONSTANT | STRINGCONSTANT ; 296 297 ArgListH ::= ArgListH ^ "," Types OptParamAttrs OptLocalName 298 | Types OptParamAttrs OptLocalName ; 299 300 ArgList ::= ArgListH | ArgListH ^ "," "..." | "..." | _ ; 301 302 FunctionHeaderH ::= OptCallingConv OptRetAttrs ResultTypes 303 GlobalName ^ "(" ^ ArgList ^ ")" 304 OptFuncAttrs OptSection OptAlign OptGC ; 305 306 BEGIN ::= ( begin | "{" ) ^ "\n"; 307 308 FunctionHeader ::= 309 FunctionDefineLinkage GVVisibilityStyle FunctionHeaderH BEGIN ; 310 311 END ::= ^ ( end | "}" ) ^ "\n"; 312 313 Function ::= BasicBlockList END ; 314 315 FunctionProto ::= FunctionDeclareLinkage GVVisibilityStyle FunctionHeaderH ; 316 317 OptSideEffect ::= _ | sideeffect ; 318 319 ConstValueRef ::= ESINT64VAL 320 | EUINT64VAL 321 | FPVAL 322 | true 323 | false 324 | null 325 | undef 326 | zeroinitializer 327 | "<" ConstVector ">" 328 | "[" ConstVector "]" 329 | "[" ^ "]" 330 | "c" ^ STRINGCONSTANT 331 | "{" ConstVector "}" 332 | "{" ^ "}" 333 | "<" ^ "{" ConstVector "}" ^ ">" 334 | "<" ^ "{" ^ "}" ^ ">" 335 | ConstExpr 336 | asm OptSideEffect STRINGCONSTANT ^ "," STRINGCONSTANT ; 337 338 SymbolicValueRef ::= LOCALVALID 339 | GLOBALVALID 340 | LocalName 341 | GlobalName ; 342 343 ValueRef ::= SymbolicValueRef | ConstValueRef; 344 345 ResolvedVal ::= Types ValueRef ; 346 347 ReturnedVal ::= ResolvedVal | ReturnedVal ^ "," ResolvedVal ; 348 349 BasicBlockList ::= BasicBlockList BasicBlock | FunctionHeader BasicBlock ; 350 351 BasicBlock ::= InstructionList OptLocalAssign BBTerminatorInst ; 352 353 InstructionList ::= +++ InstructionList Inst 354 | - _ 355 | ^ LABELSTR ^ ":\n" ; 356 357 BBTerminatorInst ::= ^ " " ^ 358 ( ret ReturnedVal 359 | ret void 360 | br label ValueRef 361 | br INTTYPE ValueRef ^ "," label ValueRef ^ "," label ValueRef 362 | switch IntType ValueRef ^ "," label ValueRef "[" JumpTable "]" 363 | switch IntType ValueRef ^ "," label ValueRef "[" ^ "]" 364 | invoke OptCallingConv ResultTypes ValueRef ^ "(" ^ ParamList ^ ")" 365 OptFuncAttrs 366 to label ValueRef unwind label ValueRef 367 | unwind 368 | unreachable ) ^ "\n"; 369 370 JumpTable ::= JumpTable IntType ConstValueRef ^ "," label ValueRef 371 | IntType ConstValueRef ^ "," label ValueRef ; 372 373 Inst ::= ^ " " ^ OptLocalAssign InstVal ^ "\n"; 374 375 PHIList ::= Types "[" ValueRef ^ "," ValueRef "]" 376 | PHIList ^ "," "[" ValueRef ^ "," ValueRef "]" ; 377 378 ParamList ::= Types OptParamAttrs ValueRef OptParamAttrs 379 | label OptParamAttrs ValueRef OptParamAttrs 380 | ParamList ^ "," Types OptParamAttrs ValueRef OptParamAttrs 381 | ParamList ^ "," label OptParamAttrs ValueRef OptParamAttrs 382 | - _ ; 383 384 IndexList ::= _ | IndexList ^ "," ResolvedVal ; 385 386 ConstantIndexList ::= "," EUINT64VAL | ConstantIndexList ^ "," EUINT64VAL ; 387 388 OptTailCall ::= tail call | call ; 389 390 InstVal ::= 391 ArithmeticOps Types ValueRef ^ "," ValueRef 392 | LogicalOps Types ValueRef ^ "," ValueRef 393 | icmp IPredicates Types ValueRef ^ "," ValueRef 394 | fcmp FPredicates Types ValueRef ^ "," ValueRef 395 | CastOps ResolvedVal to Types 396 | select ResolvedVal ^ "," ResolvedVal ^ "," ResolvedVal 397 | "va_arg" ResolvedVal ^ "," Types 398 | extractelement ResolvedVal ^ "," ResolvedVal 399 | insertelement ResolvedVal ^ "," ResolvedVal ^ "," ResolvedVal 400 | shufflevector ResolvedVal ^ "," ResolvedVal ^ "," ResolvedVal 401 | phi PHIList 402 | OptTailCall OptCallingConv ResultTypes ValueRef ^ "(" ^ ParamList ^ ")" 403 OptFuncAttrs 404 | MemoryInst ; 405 406 OptVolatile ::= - volatile | _ ; 407 OptExact ::= - exact | _ ; 408 OptNSW ::= - nsw | _ ; 409 OptNUW ::= - nuw | _ ; 410 OptNW ::= OptNUW OptNSW | OptNSW OptNUW ; 411 OptInBounds ::= - inbounds | _ ; 412 413 MemoryInst ::= malloc Types OptCAlign 414 | malloc Types ^ "," INTTYPE ValueRef OptCAlign 415 | alloca Types OptCAlign 416 | alloca Types ^ "," INTTYPE ValueRef OptCAlign 417 | free ResolvedVal 418 | OptVolatile load Types ValueRef OptCAlign 419 | OptVolatile store ResolvedVal ^ "," Types ValueRef OptCAlign 420 | getresult Types ValueRef ^ "," EUINT64VAL 421 | getelementptr OptInBounds Types ValueRef IndexList 422 | extractvalue Types ValueRef ^ ConstantIndexList 423 | insertvalue Types ValueRef ^ "," Types ValueRef ^ ConstantIndexList ; 424