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