| (* |
| |
| 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 ::= half | bfloat | 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 |
| | mustprogress |
| | nosanitize_bounds |
| | nosanitize_coverage |
| ; |
| |
| 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 | half | bfloat | float | double | "ppc_fp128" | fp128 |
| | "x86_fp80" | "x86_mmx" | "x86_amx" | - 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 ; |