| (* | 
 |  | 
 | polygen grammar for LLVM assembly language. | 
 |  | 
 | This file defines an LLVM assembly language grammar for polygen, | 
 | which is a tool for generating random text based on a grammar. | 
 | It is strictly syntax-based, and makes no attempt to generate | 
 | IR that is semantically valid. Most of the IR produced doesn't | 
 | pass the Verifier. | 
 |  | 
 | TODO: Metadata, in all its forms | 
 |  | 
 | *) | 
 |  | 
 | I ::=   "title:    LLVM assembly language\n" | 
 |       ^ "status:   experimental\n" | 
 |       ^ "audience: LLVM developers\n" | 
 | ; | 
 |  | 
 | S ::= Module ; | 
 |  | 
 | (* | 
 | Define rules for non-keyword tokens. This is currently just a bunch | 
 | of hacks. They don't cover many valid forms of tokens, and they also | 
 | generate some invalid forms of tokens. The LLVM parser has custom | 
 | C++ code to lex these; custom C++ code for emitting them would be | 
 | convenient, but polygen doesn't support that. | 
 | *) | 
 | NonZeroDecimalDigit ::=     1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 ; | 
 | DecimalDigit        ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 ; | 
 | DecimalDigitSeq     ::= DecimalDigit [^ DecimalDigitSeq ]; | 
 | HexDigit            ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 
 |                       | a | b | c | d | e | f ; | 
 | HexDigitSeq         ::= HexDigit [^ HexDigitSeq ]; | 
 | StringChar          ::= a | b | c | d | e | f | g | h | i | j | k | l | m | 
 |                       | n | o | p | q | r | s | t | u | v | w | x | y | z ; | 
 | StringConstantSeq   ::= StringChar [^ StringConstantSeq ]; | 
 | StringConstant      ::= StringChar [^ StringConstantSeq ]; | 
 | EUINT64VAL          ::= NonZeroDecimalDigit [^ DecimalDigitSeq ]; | 
 | ESINT64VAL          ::= [ "-" ] ^ EUINT64VAL ; | 
 | EUAPINTVAL          ::= EUINT64VAL ; | 
 | ESAPINTVAL          ::= ESINT64VAL ; | 
 | LOCALVALID          ::= "%" ^ DecimalDigitSeq ; | 
 | GLOBALVALID         ::= "@" ^ DecimalDigitSeq ; | 
 | INTTYPE             ::= "i" ^ EUINT64VAL ; | 
 | GLOBALVAR           ::= "@" ^ StringConstant ; | 
 | LOCALVAR            ::= "%" ^ StringConstant ; | 
 | STRINGCONSTANT      ::= "\"" ^ StringConstant ^ "\"" ; | 
 | ATSTRINGCONSTANT    ::= "@" ^ STRINGCONSTANT ; | 
 | PCTSTRINGCONSTANT   ::= "%" ^ STRINGCONSTANT ; | 
 | LABELSTR            ::= StringConstant ; | 
 | FPVAL               ::= ESAPINTVAL ^ "." ^ EUAPINTVAL | "0x" ^ HexDigitSeq ; | 
 |  | 
 | (* | 
 | The rest of this file is derived directly from llvmAsmParser.y. | 
 | *) | 
 |  | 
 | ArithmeticOps ::= + OptNW add | fadd | OptNW sub | fsub | OptNW mul | fmul | | 
 |                   udiv | OptExact sdiv | fdiv | urem | srem | frem ; | 
 | LogicalOps    ::= shl | lshr | ashr | and | or | xor; | 
 | CastOps       ::= trunc | zext | sext | fptrunc | fpext | bitcast | | 
 |                   uitofp | sitofp | fptoui | fptosi | inttoptr | ptrtoint ; | 
 |  | 
 | IPredicates ::= eq | ne | slt | sgt | sle | sge | ult | ugt | ule | uge ; | 
 |  | 
 | FPredicates ::= oeq | one | olt | ogt | ole | oge | ord | uno | ueq | une | 
 |               | ult | ugt | ule | uge | true | false ; | 
 |  | 
 | IntType ::= INTTYPE; | 
 | FPType  ::= float | double | "ppc_fp128" | fp128 | "x86_fp80"; | 
 |  | 
 | LocalName ::= LOCALVAR | STRINGCONSTANT | PCTSTRINGCONSTANT ; | 
 | OptLocalName ::= LocalName | _ ; | 
 |  | 
 | OptAddrSpace ::= - addrspace ^ "(" ^ EUINT64VAL ^ ")" | _ ; | 
 |  | 
 | OptLocalAssign ::= LocalName "=" | _ ; | 
 |  | 
 | GlobalName ::= GLOBALVAR | ATSTRINGCONSTANT ; | 
 |  | 
 | OptGlobalAssign ::= GlobalAssign | _ ; | 
 |  | 
 | GlobalAssign ::= GlobalName "=" ; | 
 |  | 
 | GVInternalLinkage | 
 |   ::= + internal | 
 |  | weak | 
 |  | "weak_odr" | 
 |  | linkonce | 
 |  | "linkonce_odr" | 
 |  | appending | 
 |  | dllexport | 
 |  | common | 
 |  | private | 
 |  ; | 
 |  | 
 | GVExternalLinkage | 
 |   ::= dllimport | 
 |  | "extern_weak" | 
 |  | + external | 
 |  ; | 
 |  | 
 | GVVisibilityStyle | 
 |   ::= + _ | 
 |  | default | 
 |  | hidden | 
 |  | protected | 
 |  ; | 
 |  | 
 | FunctionDeclareLinkage | 
 |   ::= + _ | 
 |  | dllimport | 
 |  | "extern_weak" | 
 |  ; | 
 |  | 
 | FunctionDefineLinkage | 
 |   ::= + _ | 
 |  | internal | 
 |  | linkonce | 
 |  | "linkonce_odr" | 
 |  | weak | 
 |  | "weak_odr" | 
 |  | dllexport | 
 |  ; | 
 |  | 
 | AliasLinkage ::= + _ | weak | "weak_odr" | internal ; | 
 |  | 
 | OptCallingConv ::= + _ | | 
 |                  ccc | | 
 |                  fastcc | | 
 |                  coldcc | | 
 |                  "x86_stdcallcc" | | 
 |                  "x86_fastcallcc" | | 
 |                  cc EUINT64VAL ; | 
 |  | 
 | ParamAttr ::= zeroext | 
 |  | signext | 
 |  | inreg | 
 |  | sret | 
 |  | noalias | 
 |  | nocapture | 
 |  | byval | 
 |  | nest | 
 |  | align EUINT64VAL | 
 |  ; | 
 |  | 
 | OptParamAttrs ::= + _ | OptParamAttrs ParamAttr ; | 
 |  | 
 | RetAttr       ::= inreg | 
 |               | zeroext | 
 |               | signext | 
 |               | noalias | 
 |               ; | 
 |  | 
 | OptRetAttrs  ::= _ | 
 |              | OptRetAttrs RetAttr | 
 |              ; | 
 |  | 
 | FuncAttr      ::= noreturn | 
 |  | nounwind | 
 |  | inreg | 
 |  | zeroext | 
 |  | signext | 
 |  | readnone | 
 |  | readonly | 
 |  | inlinehint | 
 |  | alignstack | 
 |  | noinline | 
 |  | alwaysinline | 
 |  | optsize | 
 |  | ssp | 
 |  | sspreq | 
 |  | returns_twice | 
 |  | nonlazybind | 
 |  | sanitize_address | 
 |  | sanitize_thread | 
 |  | sanitize_memory | 
 |  ; | 
 |  | 
 | OptFuncAttrs  ::= + _ | OptFuncAttrs FuncAttr ; | 
 |  | 
 | OptGC         ::= + _ | gc STRINGCONSTANT ; | 
 |  | 
 | OptAlign      ::= + _ | align EUINT64VAL ; | 
 | OptCAlign     ::= + _ | ^ "," align EUINT64VAL ; | 
 |  | 
 | SectionString ::= section STRINGCONSTANT ; | 
 |  | 
 | OptSection    ::= + _ | SectionString ; | 
 |  | 
 | GlobalVarAttributes ::= + _ | ^ "," GlobalVarAttribute GlobalVarAttributes ; | 
 | GlobalVarAttribute  ::= SectionString | align EUINT64VAL ; | 
 |  | 
 | PrimType ::= INTTYPE | float | double | "ppc_fp128" | fp128 | "x86_fp80" | 
 |           | - label ; | 
 |  | 
 | Types | 
 |   ::= opaque | 
 |  | PrimType | 
 |  | Types OptAddrSpace ^ "*" | 
 |  | SymbolicValueRef | 
 |  | "\\" ^ EUINT64VAL | 
 |  | Types "(" ^ ArgTypeListI ^ ")" OptFuncAttrs | 
 |  | void "(" ^ ArgTypeListI ^ ")" OptFuncAttrs | 
 |  | "[" ^ EUINT64VAL "x" Types ^ "]" | 
 |  | "<" ^ EUINT64VAL "x" Types ^ ">" | 
 |  | "{" TypeListI "}" | 
 |  | "{" ^ "}" | 
 |  | "<" ^ "{" TypeListI "}" ^ ">" | 
 |  | "<" ^ "{" ^ "}" ^ ">" | 
 |  ; | 
 |  | 
 | ArgType ::= Types OptParamAttrs ; | 
 |  | 
 | ResultTypes ::= Types | void ; | 
 |  | 
 | ArgTypeList ::= ArgType | ArgTypeList ^ "," ArgType ; | 
 |  | 
 | ArgTypeListI ::= ArgTypeList | ArgTypeList ^ "," "..." | "..." | _ ; | 
 |  | 
 | TypeListI ::= Types | TypeListI ^ "," Types ; | 
 |  | 
 | ConstVal::= Types "[" ^ ConstVector ^ "]" | 
 |  | Types "[" ^ "]" | 
 |  | Types "c" ^ STRINGCONSTANT | 
 |  | Types "<" ^ ConstVector ^ ">" | 
 |  | Types "{" ConstVector "}" | 
 |  | Types "{" ^ "}" | 
 |  | Types "<" ^ "{" ConstVector "}" ^ ">" | 
 |  | Types "<" ^ "{" ^ "}" ^ ">" | 
 |  | Types null | 
 |  | Types undef | 
 |  | Types SymbolicValueRef | 
 |  | Types ConstExpr | 
 |  | Types zeroinitializer | 
 |  | Types ESINT64VAL | 
 |  | Types ESAPINTVAL | 
 |  | Types EUINT64VAL | 
 |  | Types EUAPINTVAL | 
 |  | Types true | 
 |  | Types false | 
 |  | Types FPVAL ; | 
 |  | 
 | ConstExpr::= CastOps "(" ^ ConstVal to Types ^ ")" | 
 |  | getelementptr OptInBounds "(" ^ ConstVal IndexList ^ ")" | 
 |  | select "(" ^ ConstVal ^ "," ConstVal ^ "," ConstVal ^ ")" | 
 |  | ArithmeticOps "(" ^ ConstVal ^ "," ConstVal ^ ")" | 
 |  | LogicalOps "(" ^ ConstVal ^ "," ConstVal ^ ")" | 
 |  | icmp IPredicates "(" ^ ConstVal ^ "," ConstVal ^ ")" | 
 |  | fcmp FPredicates "(" ^ ConstVal ^ "," ConstVal ^ ")" | 
 |  | extractelement "(" ^ ConstVal ^ "," ConstVal ^ ")" | 
 |  | insertelement "(" ^ ConstVal ^ "," ConstVal ^ "," ConstVal ^ ")" | 
 |  | shufflevector "(" ^ ConstVal ^ "," ConstVal ^ "," ConstVal ^ ")" | 
 |  | extractvalue "(" ^ ConstVal ^ ConstantIndexList ^ ")" | 
 |  | insertvalue "(" ^ ConstVal ^ "," ConstVal ^ ConstantIndexList ^ ")" ; | 
 |  | 
 | ConstVector ::= ConstVector ^ "," ConstVal | ConstVal ; | 
 |  | 
 | GlobalType ::= global | constant ; | 
 |  | 
 | ThreadLocal ::= - "thread_local" | _ ; | 
 |  | 
 | AliaseeRef ::= ResultTypes SymbolicValueRef | 
 |  | bitcast "(" ^ AliaseeRef to Types ^ ")" ; | 
 |  | 
 | Module ::= +++ DefinitionList | --- _ ; | 
 |  | 
 | DefinitionList ::= - Definition | + DefinitionList Definition ; | 
 |  | 
 | Definition | 
 |   ::= ^ ( +++++ define Function | 
 |  | declare FunctionProto | 
 |  | - module asm AsmBlock | 
 |  | OptLocalAssign type Types | 
 |  | OptGlobalAssign GVVisibilityStyle ThreadLocal OptAddrSpace GlobalType | 
 |    ConstVal GlobalVarAttributes | 
 |  | OptGlobalAssign GVInternalLinkage GVVisibilityStyle ThreadLocal OptAddrSpace | 
 |    GlobalType ConstVal GlobalVarAttributes | 
 |  | OptGlobalAssign GVExternalLinkage GVVisibilityStyle ThreadLocal OptAddrSpace | 
 |    GlobalType Types GlobalVarAttributes | 
 |  | OptGlobalAssign GVVisibilityStyle alias AliasLinkage AliaseeRef | 
 |  | target TargetDefinition | 
 |  | deplibs "=" LibrariesDefinition | 
 |  ) ^ "\n"; | 
 |  | 
 | AsmBlock ::= STRINGCONSTANT ; | 
 |  | 
 | TargetDefinition ::= triple "=" STRINGCONSTANT | 
 |  | datalayout "=" STRINGCONSTANT ; | 
 |  | 
 | LibrariesDefinition ::= "[" ( LibList | _ ) "]"; | 
 |  | 
 | LibList ::= LibList ^ "," STRINGCONSTANT | STRINGCONSTANT ; | 
 |  | 
 | ArgListH ::= ArgListH ^ "," Types OptParamAttrs OptLocalName | 
 |  | Types OptParamAttrs OptLocalName ; | 
 |  | 
 | ArgList ::= ArgListH | ArgListH ^ "," "..." | "..." | _ ; | 
 |  | 
 | FunctionHeaderH ::= OptCallingConv OptRetAttrs ResultTypes | 
 |                   GlobalName ^ "(" ^ ArgList ^ ")" | 
 |                   OptFuncAttrs OptSection OptAlign OptGC ; | 
 |  | 
 | BEGIN ::= ( begin | "{" ) ^ "\n"; | 
 |  | 
 | FunctionHeader ::= | 
 |   FunctionDefineLinkage GVVisibilityStyle FunctionHeaderH BEGIN ; | 
 |  | 
 | END ::= ^ ( end | "}" ) ^ "\n"; | 
 |  | 
 | Function ::= BasicBlockList END ; | 
 |  | 
 | FunctionProto ::= FunctionDeclareLinkage GVVisibilityStyle FunctionHeaderH ; | 
 |  | 
 | OptSideEffect ::= _ | sideeffect ; | 
 |  | 
 | ConstValueRef ::= ESINT64VAL | 
 |  | EUINT64VAL | 
 |  | FPVAL | 
 |  | true | 
 |  | false | 
 |  | null | 
 |  | undef | 
 |  | zeroinitializer | 
 |  | "<" ConstVector ">" | 
 |  | "[" ConstVector "]" | 
 |  | "[" ^ "]" | 
 |  | "c" ^ STRINGCONSTANT | 
 |  | "{" ConstVector "}" | 
 |  | "{" ^ "}" | 
 |  | "<" ^ "{" ConstVector "}" ^ ">" | 
 |  | "<" ^ "{" ^ "}" ^ ">" | 
 |  | ConstExpr | 
 |  | asm OptSideEffect STRINGCONSTANT ^ "," STRINGCONSTANT ; | 
 |  | 
 | SymbolicValueRef ::= LOCALVALID | 
 |  | GLOBALVALID | 
 |  | LocalName | 
 |  | GlobalName ; | 
 |  | 
 | ValueRef ::= SymbolicValueRef | ConstValueRef; | 
 |  | 
 | ResolvedVal ::= Types ValueRef ; | 
 |  | 
 | ReturnedVal ::= ResolvedVal | ReturnedVal ^ "," ResolvedVal ; | 
 |  | 
 | BasicBlockList ::= BasicBlockList BasicBlock | FunctionHeader BasicBlock ; | 
 |  | 
 | BasicBlock ::= InstructionList OptLocalAssign BBTerminatorInst ; | 
 |  | 
 | InstructionList ::= +++ InstructionList Inst | 
 |  | - _ | 
 |  | ^ LABELSTR ^ ":\n" ; | 
 |  | 
 | BBTerminatorInst ::= ^ "  " ^ | 
 |  ( ret ReturnedVal | 
 |  | ret void | 
 |  | br label ValueRef | 
 |  | br INTTYPE ValueRef ^ "," label ValueRef ^ "," label ValueRef | 
 |  | switch IntType ValueRef ^ "," label ValueRef "[" JumpTable "]" | 
 |  | switch IntType ValueRef ^ "," label ValueRef "[" ^ "]" | 
 |  | invoke OptCallingConv ResultTypes ValueRef ^ "(" ^ ParamList ^ ")" | 
 |    OptFuncAttrs | 
 |    to label ValueRef unwind label ValueRef | 
 |  | unwind | 
 |  | unreachable ) ^ "\n"; | 
 |  | 
 | JumpTable ::= JumpTable IntType ConstValueRef ^ "," label ValueRef | 
 |  | IntType ConstValueRef ^ "," label ValueRef ; | 
 |  | 
 | Inst ::= ^ "  " ^ OptLocalAssign InstVal ^ "\n"; | 
 |  | 
 | PHIList ::= Types "[" ValueRef ^ "," ValueRef "]" | 
 |  | PHIList ^ "," "[" ValueRef ^ "," ValueRef "]" ; | 
 |  | 
 | ParamList ::= Types OptParamAttrs ValueRef OptParamAttrs | 
 |  | label OptParamAttrs ValueRef OptParamAttrs | 
 |  | ParamList ^ "," Types OptParamAttrs ValueRef OptParamAttrs | 
 |  | ParamList ^ "," label OptParamAttrs ValueRef OptParamAttrs | 
 |  | - _ ; | 
 |  | 
 | IndexList ::= _ | IndexList ^ "," ResolvedVal ; | 
 |  | 
 | ConstantIndexList ::= "," EUINT64VAL | ConstantIndexList ^ "," EUINT64VAL ; | 
 |  | 
 | OptTailCall ::= tail call | call ; | 
 |  | 
 | InstVal ::= | 
 |    ArithmeticOps Types ValueRef ^ "," ValueRef | 
 |  | LogicalOps Types ValueRef ^ "," ValueRef | 
 |  | icmp IPredicates Types ValueRef ^ "," ValueRef | 
 |  | fcmp FPredicates Types ValueRef ^ "," ValueRef | 
 |  | CastOps ResolvedVal to Types | 
 |  | select ResolvedVal ^ "," ResolvedVal ^ "," ResolvedVal | 
 |  | "va_arg" ResolvedVal ^ "," Types | 
 |  | extractelement ResolvedVal ^ "," ResolvedVal | 
 |  | insertelement ResolvedVal ^ "," ResolvedVal ^ "," ResolvedVal | 
 |  | shufflevector ResolvedVal ^ "," ResolvedVal ^ "," ResolvedVal | 
 |  | phi PHIList | 
 |  | OptTailCall OptCallingConv ResultTypes ValueRef ^ "(" ^ ParamList ^ ")" | 
 |    OptFuncAttrs | 
 |  | MemoryInst ; | 
 |  | 
 | OptVolatile ::= - volatile | _ ; | 
 | OptExact ::= - exact | _ ; | 
 | OptNSW ::= - nsw | _ ; | 
 | OptNUW ::= - nuw | _ ; | 
 | OptNW  ::= OptNUW OptNSW | OptNSW OptNUW ; | 
 | OptInBounds  ::= - inbounds | _ ; | 
 |  | 
 | MemoryInst ::= malloc Types OptCAlign | 
 |  | malloc Types ^ "," INTTYPE ValueRef OptCAlign | 
 |  | alloca Types OptCAlign | 
 |  | alloca Types ^ "," INTTYPE ValueRef OptCAlign | 
 |  | free ResolvedVal | 
 |  | OptVolatile load Types ValueRef OptCAlign | 
 |  | OptVolatile store ResolvedVal ^ "," Types ValueRef OptCAlign | 
 |  | getresult Types ValueRef ^ "," EUINT64VAL | 
 |  | getelementptr OptInBounds Types ValueRef IndexList | 
 |  | extractvalue Types ValueRef ^ ConstantIndexList  | 
 |  | insertvalue Types ValueRef ^ "," Types ValueRef ^ ConstantIndexList ; |