(* 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 ;