llvm.grm 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421
  1. (*
  2. polygen grammar for LLVM assembly language.
  3. This file defines an LLVM assembly language grammar for polygen,
  4. which is a tool for generating random text based on a grammar.
  5. It is strictly syntax-based, and makes no attempt to generate
  6. IR that is semantically valid. Most of the IR produced doesn't
  7. pass the Verifier.
  8. TODO: Metadata, in all its forms
  9. *)
  10. I ::= "title: LLVM assembly language\n"
  11. ^ "status: experimental\n"
  12. ^ "audience: LLVM developers\n"
  13. ;
  14. S ::= Module ;
  15. (*
  16. Define rules for non-keyword tokens. This is currently just a bunch
  17. of hacks. They don't cover many valid forms of tokens, and they also
  18. generate some invalid forms of tokens. The LLVM parser has custom
  19. C++ code to lex these; custom C++ code for emitting them would be
  20. convenient, but polygen doesn't support that.
  21. *)
  22. NonZeroDecimalDigit ::= 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 ;
  23. DecimalDigit ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 ;
  24. DecimalDigitSeq ::= DecimalDigit [^ DecimalDigitSeq ];
  25. HexDigit ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
  26. | a | b | c | d | e | f ;
  27. HexDigitSeq ::= HexDigit [^ HexDigitSeq ];
  28. StringChar ::= a | b | c | d | e | f | g | h | i | j | k | l | m
  29. | n | o | p | q | r | s | t | u | v | w | x | y | z ;
  30. StringConstantSeq ::= StringChar [^ StringConstantSeq ];
  31. StringConstant ::= StringChar [^ StringConstantSeq ];
  32. EUINT64VAL ::= NonZeroDecimalDigit [^ DecimalDigitSeq ];
  33. ESINT64VAL ::= [ "-" ] ^ EUINT64VAL ;
  34. EUAPINTVAL ::= EUINT64VAL ;
  35. ESAPINTVAL ::= ESINT64VAL ;
  36. LOCALVALID ::= "%" ^ DecimalDigitSeq ;
  37. GLOBALVALID ::= "@" ^ DecimalDigitSeq ;
  38. INTTYPE ::= "i" ^ EUINT64VAL ;
  39. GLOBALVAR ::= "@" ^ StringConstant ;
  40. LOCALVAR ::= "%" ^ StringConstant ;
  41. STRINGCONSTANT ::= "\"" ^ StringConstant ^ "\"" ;
  42. ATSTRINGCONSTANT ::= "@" ^ STRINGCONSTANT ;
  43. PCTSTRINGCONSTANT ::= "%" ^ STRINGCONSTANT ;
  44. LABELSTR ::= StringConstant ;
  45. FPVAL ::= ESAPINTVAL ^ "." ^ EUAPINTVAL | "0x" ^ HexDigitSeq ;
  46. (*
  47. The rest of this file is derived directly from llvmAsmParser.y.
  48. *)
  49. ArithmeticOps ::= + OptNW add | fadd | OptNW sub | fsub | OptNW mul | fmul |
  50. udiv | OptExact sdiv | fdiv | urem | srem | frem ;
  51. LogicalOps ::= shl | lshr | ashr | and | or | xor;
  52. CastOps ::= trunc | zext | sext | fptrunc | fpext | bitcast |
  53. uitofp | sitofp | fptoui | fptosi | inttoptr | ptrtoint ;
  54. IPredicates ::= eq | ne | slt | sgt | sle | sge | ult | ugt | ule | uge ;
  55. FPredicates ::= oeq | one | olt | ogt | ole | oge | ord | uno | ueq | une
  56. | ult | ugt | ule | uge | true | false ;
  57. IntType ::= INTTYPE;
  58. FPType ::= float | double | "ppc_fp128" | fp128 | "x86_fp80";
  59. LocalName ::= LOCALVAR | STRINGCONSTANT | PCTSTRINGCONSTANT ;
  60. OptLocalName ::= LocalName | _ ;
  61. OptAddrSpace ::= - addrspace ^ "(" ^ EUINT64VAL ^ ")" | _ ;
  62. OptLocalAssign ::= LocalName "=" | _ ;
  63. GlobalName ::= GLOBALVAR | ATSTRINGCONSTANT ;
  64. OptGlobalAssign ::= GlobalAssign | _ ;
  65. GlobalAssign ::= GlobalName "=" ;
  66. GVInternalLinkage
  67. ::= + internal
  68. | weak
  69. | "weak_odr"
  70. | linkonce
  71. | "linkonce_odr"
  72. | appending
  73. | dllexport
  74. | common
  75. | private
  76. ;
  77. GVExternalLinkage
  78. ::= dllimport
  79. | "extern_weak"
  80. | + external
  81. ;
  82. GVVisibilityStyle
  83. ::= + _
  84. | default
  85. | hidden
  86. | protected
  87. ;
  88. FunctionDeclareLinkage
  89. ::= + _
  90. | dllimport
  91. | "extern_weak"
  92. ;
  93. FunctionDefineLinkage
  94. ::= + _
  95. | internal
  96. | linkonce
  97. | "linkonce_odr"
  98. | weak
  99. | "weak_odr"
  100. | dllexport
  101. ;
  102. AliasLinkage ::= + _ | weak | "weak_odr" | internal ;
  103. OptCallingConv ::= + _ |
  104. ccc |
  105. fastcc |
  106. coldcc |
  107. "x86_stdcallcc" |
  108. "x86_fastcallcc" |
  109. cc EUINT64VAL ;
  110. ParamAttr ::= zeroext
  111. | signext
  112. | inreg
  113. | sret
  114. | noalias
  115. | nocapture
  116. | byval
  117. | nest
  118. | align EUINT64VAL
  119. ;
  120. OptParamAttrs ::= + _ | OptParamAttrs ParamAttr ;
  121. RetAttr ::= inreg
  122. | zeroext
  123. | signext
  124. | noalias
  125. ;
  126. OptRetAttrs ::= _
  127. | OptRetAttrs RetAttr
  128. ;
  129. FuncAttr ::= noreturn
  130. | nounwind
  131. | inreg
  132. | zeroext
  133. | signext
  134. | readnone
  135. | readonly
  136. | inlinehint
  137. | alignstack
  138. | noinline
  139. | alwaysinline
  140. | optsize
  141. | ssp
  142. | sspreq
  143. | returns_twice
  144. | nonlazybind
  145. | sanitize_address
  146. | sanitize_thread
  147. | sanitize_memory
  148. ;
  149. OptFuncAttrs ::= + _ | OptFuncAttrs FuncAttr ;
  150. OptGC ::= + _ | gc STRINGCONSTANT ;
  151. OptAlign ::= + _ | align EUINT64VAL ;
  152. OptCAlign ::= + _ | ^ "," align EUINT64VAL ;
  153. SectionString ::= section STRINGCONSTANT ;
  154. OptSection ::= + _ | SectionString ;
  155. GlobalVarAttributes ::= + _ | ^ "," GlobalVarAttribute GlobalVarAttributes ;
  156. GlobalVarAttribute ::= SectionString | align EUINT64VAL ;
  157. PrimType ::= INTTYPE | float | double | "ppc_fp128" | fp128 | "x86_fp80"
  158. | - label ;
  159. Types
  160. ::= opaque
  161. | PrimType
  162. | Types OptAddrSpace ^ "*"
  163. | SymbolicValueRef
  164. | "\\" ^ EUINT64VAL
  165. | Types "(" ^ ArgTypeListI ^ ")" OptFuncAttrs
  166. | void "(" ^ ArgTypeListI ^ ")" OptFuncAttrs
  167. | "[" ^ EUINT64VAL "x" Types ^ "]"
  168. | "<" ^ EUINT64VAL "x" Types ^ ">"
  169. | "{" TypeListI "}"
  170. | "{" ^ "}"
  171. | "<" ^ "{" TypeListI "}" ^ ">"
  172. | "<" ^ "{" ^ "}" ^ ">"
  173. ;
  174. ArgType ::= Types OptParamAttrs ;
  175. ResultTypes ::= Types | void ;
  176. ArgTypeList ::= ArgType | ArgTypeList ^ "," ArgType ;
  177. ArgTypeListI ::= ArgTypeList | ArgTypeList ^ "," "..." | "..." | _ ;
  178. TypeListI ::= Types | TypeListI ^ "," Types ;
  179. ConstVal::= Types "[" ^ ConstVector ^ "]"
  180. | Types "[" ^ "]"
  181. | Types "c" ^ STRINGCONSTANT
  182. | Types "<" ^ ConstVector ^ ">"
  183. | Types "{" ConstVector "}"
  184. | Types "{" ^ "}"
  185. | Types "<" ^ "{" ConstVector "}" ^ ">"
  186. | Types "<" ^ "{" ^ "}" ^ ">"
  187. | Types null
  188. | Types undef
  189. | Types SymbolicValueRef
  190. | Types ConstExpr
  191. | Types zeroinitializer
  192. | Types ESINT64VAL
  193. | Types ESAPINTVAL
  194. | Types EUINT64VAL
  195. | Types EUAPINTVAL
  196. | Types true
  197. | Types false
  198. | Types FPVAL ;
  199. ConstExpr::= CastOps "(" ^ ConstVal to Types ^ ")"
  200. | getelementptr OptInBounds "(" ^ ConstVal IndexList ^ ")"
  201. | select "(" ^ ConstVal ^ "," ConstVal ^ "," ConstVal ^ ")"
  202. | ArithmeticOps "(" ^ ConstVal ^ "," ConstVal ^ ")"
  203. | LogicalOps "(" ^ ConstVal ^ "," ConstVal ^ ")"
  204. | icmp IPredicates "(" ^ ConstVal ^ "," ConstVal ^ ")"
  205. | fcmp FPredicates "(" ^ ConstVal ^ "," ConstVal ^ ")"
  206. | extractelement "(" ^ ConstVal ^ "," ConstVal ^ ")"
  207. | insertelement "(" ^ ConstVal ^ "," ConstVal ^ "," ConstVal ^ ")"
  208. | shufflevector "(" ^ ConstVal ^ "," ConstVal ^ "," ConstVal ^ ")"
  209. | extractvalue "(" ^ ConstVal ^ ConstantIndexList ^ ")"
  210. | insertvalue "(" ^ ConstVal ^ "," ConstVal ^ ConstantIndexList ^ ")" ;
  211. ConstVector ::= ConstVector ^ "," ConstVal | ConstVal ;
  212. GlobalType ::= global | constant ;
  213. ThreadLocal ::= - "thread_local" | _ ;
  214. AliaseeRef ::= ResultTypes SymbolicValueRef
  215. | bitcast "(" ^ AliaseeRef to Types ^ ")" ;
  216. Module ::= +++ DefinitionList | --- _ ;
  217. DefinitionList ::= - Definition | + DefinitionList Definition ;
  218. Definition
  219. ::= ^ ( +++++ define Function
  220. | declare FunctionProto
  221. | - module asm AsmBlock
  222. | OptLocalAssign type Types
  223. | OptGlobalAssign GVVisibilityStyle ThreadLocal OptAddrSpace GlobalType
  224. ConstVal GlobalVarAttributes
  225. | OptGlobalAssign GVInternalLinkage GVVisibilityStyle ThreadLocal OptAddrSpace
  226. GlobalType ConstVal GlobalVarAttributes
  227. | OptGlobalAssign GVExternalLinkage GVVisibilityStyle ThreadLocal OptAddrSpace
  228. GlobalType Types GlobalVarAttributes
  229. | OptGlobalAssign GVVisibilityStyle alias AliasLinkage AliaseeRef
  230. | target TargetDefinition
  231. | deplibs "=" LibrariesDefinition
  232. ) ^ "\n";
  233. AsmBlock ::= STRINGCONSTANT ;
  234. TargetDefinition ::= triple "=" STRINGCONSTANT
  235. | datalayout "=" STRINGCONSTANT ;
  236. LibrariesDefinition ::= "[" ( LibList | _ ) "]";
  237. LibList ::= LibList ^ "," STRINGCONSTANT | STRINGCONSTANT ;
  238. ArgListH ::= ArgListH ^ "," Types OptParamAttrs OptLocalName
  239. | Types OptParamAttrs OptLocalName ;
  240. ArgList ::= ArgListH | ArgListH ^ "," "..." | "..." | _ ;
  241. FunctionHeaderH ::= OptCallingConv OptRetAttrs ResultTypes
  242. GlobalName ^ "(" ^ ArgList ^ ")"
  243. OptFuncAttrs OptSection OptAlign OptGC ;
  244. BEGIN ::= ( begin | "{" ) ^ "\n";
  245. FunctionHeader ::=
  246. FunctionDefineLinkage GVVisibilityStyle FunctionHeaderH BEGIN ;
  247. END ::= ^ ( end | "}" ) ^ "\n";
  248. Function ::= BasicBlockList END ;
  249. FunctionProto ::= FunctionDeclareLinkage GVVisibilityStyle FunctionHeaderH ;
  250. OptSideEffect ::= _ | sideeffect ;
  251. ConstValueRef ::= ESINT64VAL
  252. | EUINT64VAL
  253. | FPVAL
  254. | true
  255. | false
  256. | null
  257. | undef
  258. | zeroinitializer
  259. | "<" ConstVector ">"
  260. | "[" ConstVector "]"
  261. | "[" ^ "]"
  262. | "c" ^ STRINGCONSTANT
  263. | "{" ConstVector "}"
  264. | "{" ^ "}"
  265. | "<" ^ "{" ConstVector "}" ^ ">"
  266. | "<" ^ "{" ^ "}" ^ ">"
  267. | ConstExpr
  268. | asm OptSideEffect STRINGCONSTANT ^ "," STRINGCONSTANT ;
  269. SymbolicValueRef ::= LOCALVALID
  270. | GLOBALVALID
  271. | LocalName
  272. | GlobalName ;
  273. ValueRef ::= SymbolicValueRef | ConstValueRef;
  274. ResolvedVal ::= Types ValueRef ;
  275. ReturnedVal ::= ResolvedVal | ReturnedVal ^ "," ResolvedVal ;
  276. BasicBlockList ::= BasicBlockList BasicBlock | FunctionHeader BasicBlock ;
  277. BasicBlock ::= InstructionList OptLocalAssign BBTerminatorInst ;
  278. InstructionList ::= +++ InstructionList Inst
  279. | - _
  280. | ^ LABELSTR ^ ":\n" ;
  281. BBTerminatorInst ::= ^ " " ^
  282. ( ret ReturnedVal
  283. | ret void
  284. | br label ValueRef
  285. | br INTTYPE ValueRef ^ "," label ValueRef ^ "," label ValueRef
  286. | switch IntType ValueRef ^ "," label ValueRef "[" JumpTable "]"
  287. | switch IntType ValueRef ^ "," label ValueRef "[" ^ "]"
  288. | invoke OptCallingConv ResultTypes ValueRef ^ "(" ^ ParamList ^ ")"
  289. OptFuncAttrs
  290. to label ValueRef unwind label ValueRef
  291. | unwind
  292. | unreachable ) ^ "\n";
  293. JumpTable ::= JumpTable IntType ConstValueRef ^ "," label ValueRef
  294. | IntType ConstValueRef ^ "," label ValueRef ;
  295. Inst ::= ^ " " ^ OptLocalAssign InstVal ^ "\n";
  296. PHIList ::= Types "[" ValueRef ^ "," ValueRef "]"
  297. | PHIList ^ "," "[" ValueRef ^ "," ValueRef "]" ;
  298. ParamList ::= Types OptParamAttrs ValueRef OptParamAttrs
  299. | label OptParamAttrs ValueRef OptParamAttrs
  300. | ParamList ^ "," Types OptParamAttrs ValueRef OptParamAttrs
  301. | ParamList ^ "," label OptParamAttrs ValueRef OptParamAttrs
  302. | - _ ;
  303. IndexList ::= _ | IndexList ^ "," ResolvedVal ;
  304. ConstantIndexList ::= "," EUINT64VAL | ConstantIndexList ^ "," EUINT64VAL ;
  305. OptTailCall ::= tail call | call ;
  306. InstVal ::=
  307. ArithmeticOps Types ValueRef ^ "," ValueRef
  308. | LogicalOps Types ValueRef ^ "," ValueRef
  309. | icmp IPredicates Types ValueRef ^ "," ValueRef
  310. | fcmp FPredicates Types ValueRef ^ "," ValueRef
  311. | CastOps ResolvedVal to Types
  312. | select ResolvedVal ^ "," ResolvedVal ^ "," ResolvedVal
  313. | "va_arg" ResolvedVal ^ "," Types
  314. | extractelement ResolvedVal ^ "," ResolvedVal
  315. | insertelement ResolvedVal ^ "," ResolvedVal ^ "," ResolvedVal
  316. | shufflevector ResolvedVal ^ "," ResolvedVal ^ "," ResolvedVal
  317. | phi PHIList
  318. | OptTailCall OptCallingConv ResultTypes ValueRef ^ "(" ^ ParamList ^ ")"
  319. OptFuncAttrs
  320. | MemoryInst ;
  321. OptVolatile ::= - volatile | _ ;
  322. OptExact ::= - exact | _ ;
  323. OptNSW ::= - nsw | _ ;
  324. OptNUW ::= - nuw | _ ;
  325. OptNW ::= OptNUW OptNSW | OptNSW OptNUW ;
  326. OptInBounds ::= - inbounds | _ ;
  327. MemoryInst ::= malloc Types OptCAlign
  328. | malloc Types ^ "," INTTYPE ValueRef OptCAlign
  329. | alloca Types OptCAlign
  330. | alloca Types ^ "," INTTYPE ValueRef OptCAlign
  331. | free ResolvedVal
  332. | OptVolatile load Types ValueRef OptCAlign
  333. | OptVolatile store ResolvedVal ^ "," Types ValueRef OptCAlign
  334. | getresult Types ValueRef ^ "," EUINT64VAL
  335. | getelementptr OptInBounds Types ValueRef IndexList
  336. | extractvalue Types ValueRef ^ ConstantIndexList
  337. | insertvalue Types ValueRef ^ "," Types ValueRef ^ ConstantIndexList ;