| (* | |
| 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 | |
| | "linker_private" | |
| | "linker_private_weak" | |
| ; | |
| 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 | |
| ; | |
| 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 ; |