Robin Eklind via llvm-dev
2018-Jun-02 10:59 UTC
[llvm-dev] A BNF grammar for LLVM IR assembly
Hi, My friends and I have written a BNF grammar for LLVM IR assembly by cross-referencing the LLVM Language Reference Manual [1], LLVM blog posts [2], and the source code and associated comments of the LLVM IR assembly parser [3]. We did this as we wanted to be able to write tools for both generating arbitrary syntactically correct LLVM IR (e.g. csmith [4]) to validate the tool chain, to generate LLVM IR parsers based on the BNF, and to create a source of truth for the grammar of the LLVM IR assembly language. The current version of the BNF covers the entire LLVM IR assembly language as of 2018-02-19, and is based on the source code of lib/AsmParser/LLParser.cpp at revision rL324928 [5]. Without further ado, find the BNF grammar attached to this message. It is also made available through Gist at [6] and a BNF grammar with annotated production actions for an LLVM IR parser in Go is at [7]. Cheers, /u & i [1]: https://llvm.org/docs/LangRef.html [2]: http://blog.llvm.org/ [3]: https://reviews.llvm.org/diffusion/L/browse/llvm/trunk/lib/AsmParser/ [4]: https://embed.cs.utah.edu/csmith/ [5]: https://reviews.llvm.org/diffusion/L/browse/llvm/trunk/lib/AsmParser/LLParser.cpp;324928 [6]: Plain BNF: https://gist.github.com/mewmew/a2487392d5519ef49658fd8f84d9eed5#file-ll-bnf [7]: BNF annotated with production actions for Go: https://raw.githubusercontent.com/llir/grammar/master/ll.bnf -------------- next part -------------- // ### [ Lexical part ] ######################################################## _ascii_letter_upper : 'A' - 'Z' ; _ascii_letter_lower : 'a' - 'z' ; _ascii_letter : _ascii_letter_upper | _ascii_letter_lower ; _letter : _ascii_letter | '$' | '-' | '.' | '_' ; _escape_letter : _letter | '\\' ; _decimal_digit : '0' - '9' ; _hex_digit : _decimal_digit | 'A' - 'F' | 'a' - 'f' ; !comment : ';' { . } '\n' ; !whitespace : '\x00' | ' ' | '\t' | '\r' | '\n' ; // === [ Identifiers ] ======================================================== _name : _letter { _letter | _decimal_digit } ; _escape_name : _escape_letter { _escape_letter | _decimal_digit } ; _quoted_name : _quoted_string ; _id : _decimals ; // --- [ Global identifiers ] -------------------------------------------------- global_ident : _global_name | _global_id ; _global_name : '@' ( _name | _quoted_name ) ; _global_id : '@' _id ; // --- [ Local identifiers ] --------------------------------------------------- local_ident : _local_name | _local_id ; _local_name : '%' ( _name | _quoted_name ) ; _local_id : '%' _id ; // --- [ Labels ] -------------------------------------------------------------- // Label [-a-zA-Z$._0-9]+: label_ident : ( _letter | _decimal_digit ) { _letter | _decimal_digit } ':' | _quoted_string ':' ; // --- [ Attribute group identifiers ] ----------------------------------------- attr_group_id : '#' _id ; // --- [ Comdat identifiers ] -------------------------------------------------- comdat_name : '$' ( _name | _quoted_name ) ; // --- [ Metadata identifiers ] ------------------------------------------------ metadata_name : '!' _escape_name ; metadata_id : '!' _id ; // DW_TAG_foo dwarf_tag : 'D' 'W' '_' 'T' 'A' 'G' '_' { _ascii_letter | _decimal_digit | '_' } ; // DW_ATE_foo dwarf_att_encoding : 'D' 'W' '_' 'A' 'T' 'E' '_' { _ascii_letter | _decimal_digit | '_' } ; // DIFlagFoo di_flag : 'D' 'I' 'F' 'l' 'a' 'g' { _ascii_letter | _decimal_digit | '_' } ; // DW_LANG_foo dwarf_lang : 'D' 'W' '_' 'L' 'A' 'N' 'G' '_' { _ascii_letter | _decimal_digit | '_' } ; // DW_CC_foo dwarf_cc : 'D' 'W' '_' 'C' 'C' '_' { _ascii_letter | _decimal_digit | '_' } ; // CSK_foo checksum_kind : 'C' 'S' 'K' '_' { _ascii_letter | _decimal_digit | '_' } ; // DW_VIRTUALITY_foo dwarf_virtuality : 'D' 'W' '_' 'V' 'I' 'R' 'T' 'U' 'A' 'L' 'I' 'T' 'Y' '_' { _ascii_letter | _decimal_digit | '_' } ; // DW_MACINFO_foo dwarf_macinfo : 'D' 'W' '_' 'M' 'A' 'C' 'I' 'N' 'F' 'O' '_' { _ascii_letter | _decimal_digit | '_' } ; // DW_OP_foo dwarf_op : 'D' 'W' '_' 'O' 'P' '_' { _ascii_letter | _decimal_digit | '_' } ; // === [ Integer literals ] =================================================== // Integer [-]?[0-9]+ int_lit : _decimal_lit ; _decimal_lit : [ '-' ] _decimals ; _decimals : _decimal_digit { _decimal_digit } ; // === [ Floating-point literals ] ============================================ // FPConstant [-+]?[0-9]+[.][0-9]*([eE][-+]?[0-9]+)? float_lit : _frac_lit | _sci_lit | _float_hex_lit ; _frac_lit : [ _sign ] _decimals '.' { _decimal_digit } ; _sign : '+' | '-' ; _sci_lit : _frac_lit ( 'e' | 'E' ) [ _sign ] _decimals ; // HexFPConstant 0x[0-9A-Fa-f]+ // 16 hex digits // HexFP80Constant 0xK[0-9A-Fa-f]+ // 20 hex digits // HexFP128Constant 0xL[0-9A-Fa-f]+ // 32 hex digits // HexPPC128Constant 0xM[0-9A-Fa-f]+ // 32 hex digits // HexHalfConstant 0xH[0-9A-Fa-f]+ // 4 hex digits _float_hex_lit : '0' 'x' _hex_digit { _hex_digit } | '0' 'x' 'K' _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit | '0' 'x' 'L' _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit | '0' 'x' 'M' _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit _hex_digit | '0' 'x' 'H' _hex_digit _hex_digit _hex_digit _hex_digit ; // === [ String literals ] ==================================================== string_lit : _quoted_string ; _quoted_string : '"' { . } '"' ; // === [ Types ] ============================================================== int_type : 'i' _decimals ; // ### [ Syntax part ] ######################################################### // The LLVM IR grammar has been based on the source code of the official LLVM // project, as of 2018-02-19 (rev db070bbdacd303ae7da129f59beaf35024d94c53). // // * lib/AsmParser/LLParser.cpp // === [ Module ] ============================================================= // https://llvm.org/docs/LangRef.html#module-structure // ref: Run // // module ::= toplevelentity* Module : TopLevelEntities ; TopLevelEntities : empty | TopLevelEntityList ; TopLevelEntityList : TopLevelEntity | TopLevelEntityList TopLevelEntity ; // --- [ Top-level Entities ] -------------------------------------------------- // ref: ParseTopLevelEntities TopLevelEntity : SourceFilename | TargetDefinition | ModuleAsm | TypeDef | ComdatDef | GlobalDecl | GlobalDef | IndirectSymbolDef | FunctionDecl | FunctionDef | AttrGroupDef | NamedMetadataDef | MetadataDef | UseListOrder | UseListOrderBB ; // ~~~ [ Source Filename ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#source-filename // ref: ParseSourceFileName // // ::= 'source_filename' '=' STRINGCONSTANT SourceFilename : "source_filename" "=" StringLit ; // ~~~ [ Target Definition ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#target-triple // https://llvm.org/docs/LangRef.html#data-layout // ref: ParseTargetDefinition // // ::= 'target' 'triple' '=' STRINGCONSTANT // ::= 'target' 'datalayout' '=' STRINGCONSTANT TargetDefinition : "target" "datalayout" "=" StringLit | "target" "triple" "=" StringLit ; // ~~~ [ Module-level Inline Assembly ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#module-level-inline-assembly // ref: ParseModuleAsm // // ::= 'module' 'asm' STRINGCONSTANT ModuleAsm : "module" "asm" StringLit ; // ~~~ [ Type Defintion ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#structure-type // ref: ParseUnnamedType // // ::= LocalVarID '=' 'type' type // ref: ParseNamedType // // ::= LocalVar '=' 'type' type TypeDef : LocalIdent "=" "type" OpaqueType | LocalIdent "=" "type" Type ; // ~~~ [ Comdat Definition ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#langref-comdats // ref: parseComdat ComdatDef : ComdatName "=" "comdat" SelectionKind ; SelectionKind : "any" | "exactmatch" | "largest" | "noduplicates" | "samesize" ; // ~~~ [ Global Variable Declaration ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#global-variables // ref: ParseUnnamedGlobal // // OptionalVisibility (ALIAS | IFUNC) ... // OptionalLinkage OptionalPreemptionSpecifier OptionalVisibility // OptionalDLLStorageClass // ... -> global variable // GlobalID '=' OptionalVisibility (ALIAS | IFUNC) ... // GlobalID '=' OptionalLinkage OptionalPreemptionSpecifier OptionalVisibility // OptionalDLLStorageClass // ... -> global variable // ref: ParseNamedGlobal // // GlobalVar '=' OptionalVisibility (ALIAS | IFUNC) ... // GlobalVar '=' OptionalLinkage OptionalPreemptionSpecifier // OptionalVisibility OptionalDLLStorageClass // ... -> global variable // ref: ParseGlobal // // ::= GlobalVar '=' OptionalLinkage OptionalPreemptionSpecifier // OptionalVisibility OptionalDLLStorageClass // OptionalThreadLocal OptionalUnnamedAddr OptionalAddrSpace // OptionalExternallyInitialized GlobalType Type Const OptionalAttrs // ::= OptionalLinkage OptionalPreemptionSpecifier OptionalVisibility // OptionalDLLStorageClass OptionalThreadLocal OptionalUnnamedAddr // OptionalAddrSpace OptionalExternallyInitialized GlobalType Type // Const OptionalAttrs GlobalDecl : GlobalIdent "=" ExternLinkage OptPreemptionSpecifier OptVisibility OptDLLStorageClass OptThreadLocal OptUnnamedAddr OptAddrSpace OptExternallyInitialized Immutable Type GlobalAttrs FuncAttrs ; // ~~~ [ Global Variable Definition ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GlobalDef : GlobalIdent "=" OptLinkage OptPreemptionSpecifier OptVisibility OptDLLStorageClass OptThreadLocal OptUnnamedAddr OptAddrSpace OptExternallyInitialized Immutable Type Constant GlobalAttrs FuncAttrs ; OptExternallyInitialized : empty | "externally_initialized" ; // ref: ParseGlobalType // // ::= 'constant' // ::= 'global' Immutable : "constant" | "global" ; GlobalAttrs : empty | "," GlobalAttrList ; GlobalAttrList : GlobalAttr | GlobalAttrList "," GlobalAttr ; GlobalAttr : Section | Comdat | Alignment // ::= !dbg !57 | MetadataAttachment ; // ~~~ [ Indirect Symbol Definition ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#aliases // https://llvm.org/docs/LangRef.html#ifuncs // ref: parseIndirectSymbol // // ::= GlobalVar '=' OptionalLinkage OptionalPreemptionSpecifier // OptionalVisibility OptionalDLLStorageClass // OptionalThreadLocal OptionalUnnamedAddr // 'alias|ifunc' IndirectSymbol // // IndirectSymbol // ::= TypeAndValue IndirectSymbolDef : GlobalIdent "=" ExternLinkage OptPreemptionSpecifier OptVisibility OptDLLStorageClass OptThreadLocal OptUnnamedAddr Alias Type "," Type Constant | GlobalIdent "=" OptLinkage OptPreemptionSpecifier OptVisibility OptDLLStorageClass OptThreadLocal OptUnnamedAddr Alias Type "," Type Constant ; Alias : "alias" | "ifunc" ; // ~~~ [ Function Declaration ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#functions // ref: ParseDeclare // // ::= 'declare' FunctionHeader FunctionDecl : "declare" MetadataAttachments OptExternLinkage FunctionHeader ; // ~~~ [ Function Definition ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#functions // ref: ParseDefine // // ::= 'define' FunctionHeader (!dbg !56)* '{' ... FunctionDef : "define" OptLinkage FunctionHeader MetadataAttachments FunctionBody ; // ref: ParseFunctionHeader // // ::= OptionalLinkage OptionalPreemptionSpecifier OptionalVisibility // OptionalCallingConv OptRetAttrs OptUnnamedAddr Type GlobalName // '(' ArgList ')' OptFuncAttrs OptSection OptionalAlign OptGC // OptionalPrefix OptionalPrologue OptPersonalityFn // TODO: Add OptAlignment before OptGC once the LR-1 conflict has been resolved, // as FuncAttrs also contains "align". FunctionHeader : OptPreemptionSpecifier OptVisibility OptDLLStorageClass OptCallingConv ReturnAttrs Type GlobalIdent "(" Params ")" OptUnnamedAddr FuncAttrs OptSection OptComdat OptGC OptPrefix OptPrologue OptPersonality ; OptGC : empty | "gc" StringLit ; OptPrefix : empty | "prefix" Type Constant ; OptPrologue : empty | "prologue" Type Constant ; OptPersonality : empty | "personality" Type Constant ; // ref: ParseFunctionBody // // ::= '{' BasicBlock+ UseListOrderDirective* '}' FunctionBody : "{" BasicBlockList UseListOrders "}" ; // ~~~ [ Attribute Group Definition ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#attribute-groups // ref: ParseUnnamedAttrGrp // // ::= 'attributes' AttrGrpID '=' '{' AttrValPair+ '}' AttrGroupDef : "attributes" AttrGroupID "=" "{" FuncAttrs "}" ; // ~~~ [ Named Metadata Definition ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#named-metadata // ref: ParseNamedMetadata // // !foo = !{ !1, !2 } NamedMetadataDef : MetadataName "=" "!" "{" MetadataNodes "}" ; MetadataNodes : empty | MetadataNodeList ; MetadataNodeList : MetadataNode | MetadataNodeList "," MetadataNode ; MetadataNode : MetadataID // Parse DIExpressions inline as a special case. They are still MDNodes, so // they can still appear in named metadata. Remove this logic if they become // plain Metadata. | DIExpression ; // ~~~ [ Metadata Definition ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#metadata-nodes-and-metadata-strings // ref: ParseStandaloneMetadata // // !42 = !{...} MetadataDef : MetadataID "=" OptDistinct MDTuple | MetadataID "=" OptDistinct SpecializedMDNode ; OptDistinct : empty | "distinct" ; // ~~~ [ Use-list Order Directives ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#use-list-order-directives // ref: ParseUseListOrder // // ::= 'uselistorder' Type Value ',' UseListOrderIndexes // UseListOrderIndexes // ::= '{' uint32 (',' uint32)+ '}' UseListOrders : empty | UseListOrderList ; UseListOrderList : UseListOrder | UseListOrderList UseListOrder ; UseListOrder : "uselistorder" Type Value "," "{" IndexList "}" ; // ref: ParseUseListOrderBB // // ::= 'uselistorder_bb' @foo ',' %bar ',' UseListOrderIndexes UseListOrderBB : "uselistorder_bb" GlobalIdent "," LocalIdent "," "{" IndexList "}" ; // === [ Identifiers ] ======================================================== // --- [ Global Identifiers ] -------------------------------------------------- GlobalIdent : global_ident ; // --- [ Local Identifiers ] --------------------------------------------------- LocalIdent : local_ident ; // --- [ Label Identifiers ] --------------------------------------------------- LabelIdent : label_ident ; // --- [ Attribute Group Identifiers ] ----------------------------------------- AttrGroupID : attr_group_id ; // --- [ Comdat Identifiers ] -------------------------------------------------- ComdatName : comdat_name ; // --- [ Metadata Identifiers ] ------------------------------------------------ MetadataName : metadata_name ; MetadataID : metadata_id ; // === [ Types ] ============================================================== // ref: ParseType // // TYPEKEYWORD("void", Type::getVoidTy(Context)); // TYPEKEYWORD("half", Type::getHalfTy(Context)); // TYPEKEYWORD("float", Type::getFloatTy(Context)); // TYPEKEYWORD("double", Type::getDoubleTy(Context)); // TYPEKEYWORD("x86_fp80", Type::getX86_FP80Ty(Context)); // TYPEKEYWORD("fp128", Type::getFP128Ty(Context)); // TYPEKEYWORD("ppc_fp128", Type::getPPC_FP128Ty(Context)); // TYPEKEYWORD("label", Type::getLabelTy(Context)); // TYPEKEYWORD("metadata", Type::getMetadataTy(Context)); // TYPEKEYWORD("x86_mmx", Type::getX86_MMXTy(Context)); // TYPEKEYWORD("token", Type::getTokenTy(Context)); Type : VoidType // Types '(' ArgTypeListI ')' OptFuncAttrs | FuncType | FirstClassType ; FirstClassType : ConcreteType | MetadataType ; ConcreteType : IntType // Type ::= 'float' | 'void' (etc) | FloatType // Type ::= Type '*' // Type ::= Type 'addrspace' '(' uint32 ')' '*' | PointerType // Type ::= '<' ... '>' | VectorType | LabelType // Type ::= '[' ... ']' | ArrayType // Type ::= StructType | StructType // Type ::= %foo // Type ::= %4 | NamedType | MMXType | TokenType ; // --- [ Void Types ] ---------------------------------------------------------- VoidType : "void" ; // --- [ Function Types ] ------------------------------------------------------ // ref: ParseFunctionType // // ::= Type ArgumentList OptionalAttrs FuncType : Type "(" Params ")" ; // --- [ Integer Types ] ------------------------------------------------------- IntType : int_type ; // --- [ Floating-point Types ] ------------------------------------------------ FloatType : FloatKind ; FloatKind : "half" | "float" | "double" | "x86_fp80" | "fp128" | "ppc_fp128" ; // --- [ MMX Types ] ----------------------------------------------------------- MMXType : "x86_mmx" ; // --- [ Pointer Types ] ------------------------------------------------------- PointerType : Type OptAddrSpace "*" ; // ref: ParseOptionalAddrSpace // // := empty // := 'addrspace' '(' uint32 ')' OptAddrSpace : empty | AddrSpace ; AddrSpace : "addrspace" "(" int_lit ")" ; // --- [ Vector Types ] -------------------------------------------------------- // ref: ParseArrayVectorType // // ::= '<' APSINTVAL 'x' Types '>' VectorType : "<" int_lit "x" Type ">" ; // --- [ Label Types ] --------------------------------------------------------- LabelType : "label" ; // --- [ Token Types ] --------------------------------------------------------- TokenType : "token" ; // --- [ Metadata Types ] ------------------------------------------------------ MetadataType : "metadata" ; // --- [ Array Types ] --------------------------------------------------------- // ref: ParseArrayVectorType // // ::= '[' APSINTVAL 'x' Types ']' ArrayType : "[" int_lit "x" Type "]" ; // --- [ Structure Types ] ----------------------------------------------------- // ref: ParseStructBody // // StructType // ::= '{' '}' // ::= '{' Type (',' Type)* '}' // ::= '<' '{' '}' '>' // ::= '<' '{' Type (',' Type)* '}' '>' // TODO: Simplify when parser generator is not limited by 1 token lookahead. // // StructType // : "{" Types "}" // | "<" "{" Types "}" ">" // ; StructType : "{" "}" | "{" TypeList "}" | "<" "{" "}" ">" | "<" "{" TypeList "}" ">" ; TypeList : Type | TypeList "," Type ; OpaqueType : "opaque" ; // --- [ Named Types ] --------------------------------------------------------- NamedType : LocalIdent ; // === [ Values ] ============================================================= // ref: ParseValue Value : Constant // %42 // %foo | LocalIdent | InlineAsm ; // --- [ Inline Assembler Expressions ] ---------------------------------------- // https://llvm.org/docs/LangRef.html#inline-assembler-expressions // ref: ParseValID // // ::= 'asm' SideEffect? AlignStack? IntelDialect? STRINGCONSTANT ',' // STRINGCONSTANT InlineAsm : "asm" OptSideEffect OptAlignStack OptIntelDialect StringLit "," StringLit ; OptSideEffect : empty | "sideeffect" ; OptAlignStack : empty | "alignstack" ; OptIntelDialect : empty | "inteldialect" ; // === [ Constants ] ========================================================== // https://llvm.org/docs/LangRef.html#constants // ref: ParseValID Constant : BoolConst | IntConst | FloatConst | NullConst | NoneConst | StructConst | ArrayConst | CharArrayConst | VectorConst | ZeroInitializerConst // @42 // @foo | GlobalIdent | UndefConst | BlockAddressConst | ConstantExpr ; // --- [ Boolean Constants ] --------------------------------------------------- // https://llvm.org/docs/LangRef.html#simple-constants // ref: ParseValID BoolConst : BoolLit ; BoolLit : "true" | "false" ; // --- [ Integer Constants ] --------------------------------------------------- // https://llvm.org/docs/LangRef.html#simple-constants // ref: ParseValID IntConst : int_lit ; IntLit : int_lit ; // --- [ Floating-point Constants ] -------------------------------------------- // https://llvm.org/docs/LangRef.html#simple-constants // ref: ParseValID FloatConst : float_lit ; // --- [ Null Pointer Constants ] ---------------------------------------------- // https://llvm.org/docs/LangRef.html#simple-constants // ref: ParseValID NullConst : "null" ; // --- [ Token Constants ] ----------------------------------------------------- // https://llvm.org/docs/LangRef.html#simple-constants // ref: ParseValID NoneConst : "none" ; // --- [ Structure Constants ] ------------------------------------------------- // https://llvm.org/docs/LangRef.html#complex-constants // ref: ParseValID // // ::= '{' ConstVector '}' // ::= '<' '{' ConstVector '}' '>' --> Packed Struct. // TODO: Simplify when parser generator is not limited by 1 token lookahead. // // StructConst // : "{" Elems "}" // | "<" "{" Elems "}" ">" // ; StructConst : "{" "}" | "{" TypeConstList "}" | "<" "{" "}" ">" | "<" "{" TypeConstList "}" ">" ; // --- [ Array Constants ] ----------------------------------------------------- // https://llvm.org/docs/LangRef.html#complex-constants // ref: ParseValID // // c "foo" ArrayConst : "[" TypeConsts "]" ; CharArrayConst : "c" StringLit ; StringLit : string_lit ; // --- [ Vector Constants ] ---------------------------------------------------- // https://llvm.org/docs/LangRef.html#complex-constants // ref: ParseValID // // ::= '<' ConstVector '>' --> Vector. VectorConst : "<" TypeConsts ">" ; // --- [ Zero Initialization Constants ] --------------------------------------- // https://llvm.org/docs/LangRef.html#complex-constants // ref: ParseValID ZeroInitializerConst : "zeroinitializer" ; // --- [ Undefined Values ] ---------------------------------------------------- // https://llvm.org/docs/LangRef.html#undefined-values // ref: ParseValID UndefConst : "undef" ; // --- [ Addresses of Basic Blocks ] ------------------------------------------- // https://llvm.org/docs/LangRef.html#addresses-of-basic-blocks // ref: ParseValID // // ::= 'blockaddress' '(' @foo ',' %bar ')' BlockAddressConst : "blockaddress" "(" GlobalIdent "," LocalIdent ")" ; // === [ Constant expressions ] =============================================== // https://llvm.org/docs/LangRef.html#constant-expressions // ref: ParseValID ConstantExpr // Binary expressions : AddExpr | FAddExpr | SubExpr | FSubExpr | MulExpr | FMulExpr | UDivExpr | SDivExpr | FDivExpr | URemExpr | SRemExpr | FRemExpr // Bitwise expressions | ShlExpr | LShrExpr | AShrExpr | AndExpr | OrExpr | XorExpr // Vector expressions | ExtractElementExpr | InsertElementExpr | ShuffleVectorExpr // Aggregate expressions | ExtractValueExpr | InsertValueExpr // Memory expressions | GetElementPtrExpr // Conversion expressions | TruncExpr | ZExtExpr | SExtExpr | FPTruncExpr | FPExtExpr | FPToUIExpr | FPToSIExpr | UIToFPExpr | SIToFPExpr | PtrToIntExpr | IntToPtrExpr | BitCastExpr | AddrSpaceCastExpr // Other expressions | ICmpExpr | FCmpExpr | SelectExpr ; // --- [ Binary expressions ] -------------------------------------------------- // https://llvm.org/docs/LangRef.html#constant-expressions // ~~~ [ add ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID AddExpr : "add" OverflowFlags "(" Type Constant "," Type Constant ")" ; // ~~~ [ fadd ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID FAddExpr : "fadd" "(" Type Constant "," Type Constant ")" ; // ~~~ [ sub ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID SubExpr : "sub" OverflowFlags "(" Type Constant "," Type Constant ")" ; // ~~~ [ fsub ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID FSubExpr : "fsub" "(" Type Constant "," Type Constant ")" ; // ~~~ [ mul ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID MulExpr : "mul" OverflowFlags "(" Type Constant "," Type Constant ")" ; // ~~~ [ fmul ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID FMulExpr : "fmul" "(" Type Constant "," Type Constant ")" ; // ~~~ [ udiv ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID UDivExpr : "udiv" OptExact "(" Type Constant "," Type Constant ")" ; // ~~~ [ sdiv ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID SDivExpr : "sdiv" OptExact "(" Type Constant "," Type Constant ")" ; // ~~~ [ fdiv ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID FDivExpr : "fdiv" "(" Type Constant "," Type Constant ")" ; // ~~~ [ urem ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID URemExpr : "urem" "(" Type Constant "," Type Constant ")" ; // ~~~ [ srem ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID SRemExpr : "srem" "(" Type Constant "," Type Constant ")" ; // ~~~ [ frem ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID FRemExpr : "frem" "(" Type Constant "," Type Constant ")" ; // --- [ Bitwise expressions ] ------------------------------------------------- // https://llvm.org/docs/LangRef.html#constant-expressions // ~~~ [ shl ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID ShlExpr : "shl" OverflowFlags "(" Type Constant "," Type Constant ")" ; // ~~~ [ lshr ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID LShrExpr : "lshr" OptExact "(" Type Constant "," Type Constant ")" ; // ~~~ [ ashr ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID AShrExpr : "ashr" OptExact "(" Type Constant "," Type Constant ")" ; // ~~~ [ and ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID AndExpr : "and" "(" Type Constant "," Type Constant ")" ; // ~~~ [ or ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID OrExpr : "or" "(" Type Constant "," Type Constant ")" ; // ~~~ [ xor ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID XorExpr : "xor" "(" Type Constant "," Type Constant ")" ; // --- [ Vector expressions ] -------------------------------------------------- // https://llvm.org/docs/LangRef.html#constant-expressions // ~~~ [ extractelement ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID ExtractElementExpr : "extractelement" "(" Type Constant "," Type Constant ")" ; // ~~~ [ insertelement ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID InsertElementExpr : "insertelement" "(" Type Constant "," Type Constant "," Type Constant ")" ; // ~~~ [ shufflevector ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID ShuffleVectorExpr : "shufflevector" "(" Type Constant "," Type Constant "," Type Constant ")" ; // --- [ Aggregate expressions ] ----------------------------------------------- // https://llvm.org/docs/LangRef.html#constant-expressions // ~~~ [ extractvalue ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID ExtractValueExpr : "extractvalue" "(" Type Constant Indices ")" ; // ~~~ [ insertvalue ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID InsertValueExpr : "insertvalue" "(" Type Constant "," Type Constant Indices ")" ; // --- [ Memory expressions ] -------------------------------------------------- // https://llvm.org/docs/LangRef.html#constant-expressions // ~~~ [ getelementptr ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID GetElementPtrExpr : "getelementptr" OptInBounds "(" Type "," Type Constant "," GEPConstIndices ")" ; // ref: ParseGlobalValueVector // // ::= empty // ::= [inrange] TypeAndValue (',' [inrange] TypeAndValue)* GEPConstIndices : empty | GEPConstIndexList ; GEPConstIndexList : GEPConstIndex | GEPConstIndexList "," GEPConstIndex ; GEPConstIndex : OptInrange Type Constant ; OptInrange : empty | "inrange" ; // --- [ Conversion expressions ] ---------------------------------------------- // https://llvm.org/docs/LangRef.html#constant-expressions // ~~~ [ trunc ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID TruncExpr : "trunc" "(" Type Constant "to" Type ")" ; // ~~~ [ zext ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID ZExtExpr : "zext" "(" Type Constant "to" Type ")" ; // ~~~ [ sext ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID SExtExpr : "sext" "(" Type Constant "to" Type ")" ; // ~~~ [ fptrunc ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID FPTruncExpr : "fptrunc" "(" Type Constant "to" Type ")" ; // ~~~ [ fpext ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID FPExtExpr : "fpext" "(" Type Constant "to" Type ")" ; // ~~~ [ fptoui ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID FPToUIExpr : "fptoui" "(" Type Constant "to" Type ")" ; // ~~~ [ fptosi ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID FPToSIExpr : "fptosi" "(" Type Constant "to" Type ")" ; // ~~~ [ uitofp ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID UIToFPExpr : "uitofp" "(" Type Constant "to" Type ")" ; // ~~~ [ sitofp ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID SIToFPExpr : "sitofp" "(" Type Constant "to" Type ")" ; // ~~~ [ ptrtoint ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID PtrToIntExpr : "ptrtoint" "(" Type Constant "to" Type ")" ; // ~~~ [ inttoptr ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID IntToPtrExpr : "inttoptr" "(" Type Constant "to" Type ")" ; // ~~~ [ bitcast ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID BitCastExpr : "bitcast" "(" Type Constant "to" Type ")" ; // ~~~ [ addrspacecast ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID AddrSpaceCastExpr : "addrspacecast" "(" Type Constant "to" Type ")" ; // --- [ Other expressions ] --------------------------------------------------- // https://llvm.org/docs/LangRef.html#constant-expressions // ~~~ [ icmp ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID ICmpExpr : "icmp" IPred "(" Type Constant "," Type Constant ")" ; // ~~~ [ fcmp ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID FCmpExpr : "fcmp" FPred "(" Type Constant "," Type Constant ")" ; // ~~~ [ select ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseValID SelectExpr : "select" "(" Type Constant "," Type Constant "," Type Constant ")" ; // === [ Basic Blocks ] ======================================================= // ref: ParseBasicBlock // // ::= LabelStr? Instruction* BasicBlockList : BasicBlock | BasicBlockList BasicBlock ; BasicBlock : OptLabelIdent Instructions Terminator ; OptLabelIdent : empty | LabelIdent ; // === [ Instructions ] ======================================================= // https://llvm.org/docs/LangRef.html#instruction-reference // ref: ParseInstruction Instructions : empty | InstructionList ; InstructionList : Instruction | InstructionList Instruction ; Instruction // Instructions not producing values. : StoreInst | FenceInst | CmpXchgInst | AtomicRMWInst // Instructions producing values. | LocalIdent "=" ValueInstruction | ValueInstruction ; ValueInstruction // Binary instructions : AddInst | FAddInst | SubInst | FSubInst | MulInst | FMulInst | UDivInst | SDivInst | FDivInst | URemInst | SRemInst | FRemInst // Bitwise instructions | ShlInst | LShrInst | AShrInst | AndInst | OrInst | XorInst // Vector instructions | ExtractElementInst | InsertElementInst | ShuffleVectorInst // Aggregate instructions | ExtractValueInst | InsertValueInst // Memory instructions | AllocaInst | LoadInst | GetElementPtrInst // Conversion instructions | TruncInst | ZExtInst | SExtInst | FPTruncInst | FPExtInst | FPToUIInst | FPToSIInst | UIToFPInst | SIToFPInst | PtrToIntInst | IntToPtrInst | BitCastInst | AddrSpaceCastInst // Other instructions | ICmpInst | FCmpInst | PhiInst | SelectInst | CallInst | VAArgInst | LandingPadInst | CatchPadInst | CleanupPadInst ; // --- [ Binary instructions ] ------------------------------------------------- // ~~~ [ add ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#add-instruction // ref: ParseArithmetic // // ::= ArithmeticOps TypeAndValue ',' Value AddInst : "add" OverflowFlags Type Value "," Value OptCommaSepMetadataAttachmentList ; // ~~~ [ fadd ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#fadd-instruction // ref: ParseArithmetic // // ::= ArithmeticOps TypeAndValue ',' Value FAddInst : "fadd" FastMathFlags Type Value "," Value OptCommaSepMetadataAttachmentList ; // ~~~ [ sub ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#sub-instruction // ref: ParseArithmetic // // ::= ArithmeticOps TypeAndValue ',' Value SubInst : "sub" OverflowFlags Type Value "," Value OptCommaSepMetadataAttachmentList ; // ~~~ [ fsub ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#fsub-instruction // ref: ParseArithmetic // // ::= ArithmeticOps TypeAndValue ',' Value FSubInst : "fsub" FastMathFlags Type Value "," Value OptCommaSepMetadataAttachmentList ; // ~~~ [ mul ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#mul-instruction // ref: ParseArithmetic // // ::= ArithmeticOps TypeAndValue ',' Value MulInst : "mul" OverflowFlags Type Value "," Value OptCommaSepMetadataAttachmentList ; // ~~~ [ fmul ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#fmul-instruction // ref: ParseArithmetic // // ::= ArithmeticOps TypeAndValue ',' Value FMulInst : "fmul" FastMathFlags Type Value "," Value OptCommaSepMetadataAttachmentList ; // ~~~ [ udiv ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#udiv-instruction // ref: ParseArithmetic // // ::= ArithmeticOps TypeAndValue ',' Value UDivInst : "udiv" OptExact Type Value "," Value OptCommaSepMetadataAttachmentList ; // ~~~ [ sdiv ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#sdiv-instruction // ref: ParseArithmetic // // ::= ArithmeticOps TypeAndValue ',' Value SDivInst : "sdiv" OptExact Type Value "," Value OptCommaSepMetadataAttachmentList ; // ~~~ [ fdiv ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#fdiv-instruction // ref: ParseArithmetic // // ::= ArithmeticOps TypeAndValue ',' Value FDivInst : "fdiv" FastMathFlags Type Value "," Value OptCommaSepMetadataAttachmentList ; // ~~~ [ urem ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#urem-instruction // ref: ParseArithmetic // // ::= ArithmeticOps TypeAndValue ',' Value URemInst : "urem" Type Value "," Value OptCommaSepMetadataAttachmentList ; // ~~~ [ srem ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#srem-instruction // ref: ParseArithmetic // // ::= ArithmeticOps TypeAndValue ',' Value SRemInst : "srem" Type Value "," Value OptCommaSepMetadataAttachmentList ; // ~~~ [ frem ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#frem-instruction // ref: ParseArithmetic // // ::= ArithmeticOps TypeAndValue ',' Value FRemInst : "frem" FastMathFlags Type Value "," Value OptCommaSepMetadataAttachmentList ; // --- [ Bitwise instructions ] ------------------------------------------------ // ~~~ [ shl ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#shl-instruction // ref: ParseArithmetic // // ::= ArithmeticOps TypeAndValue ',' Value ShlInst : "shl" OverflowFlags Type Value "," Value OptCommaSepMetadataAttachmentList ; // ~~~ [ lshr ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#lshr-instruction // ref: ParseArithmetic // // ::= ArithmeticOps TypeAndValue ',' Value LShrInst : "lshr" OptExact Type Value "," Value OptCommaSepMetadataAttachmentList ; // ~~~ [ ashr ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#ashr-instruction // ref: ParseArithmetic // // ::= ArithmeticOps TypeAndValue ',' Value AShrInst : "ashr" OptExact Type Value "," Value OptCommaSepMetadataAttachmentList ; // ~~~ [ and ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#and-instruction // ref: ParseLogical // // ::= ArithmeticOps TypeAndValue ',' Value { AndInst : "and" Type Value "," Value OptCommaSepMetadataAttachmentList ; // ~~~ [ or ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#or-instruction // ref: ParseLogical // // ::= ArithmeticOps TypeAndValue ',' Value { OrInst : "or" Type Value "," Value OptCommaSepMetadataAttachmentList ; // ~~~ [ xor ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#xor-instruction // ref: ParseLogical // // ::= ArithmeticOps TypeAndValue ',' Value { XorInst : "xor" Type Value "," Value OptCommaSepMetadataAttachmentList ; // --- [ Vector instructions ] ------------------------------------------------- // ~~~ [ extractelement ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#extractelement-instruction // ref: ParseExtractElement // // ::= 'extractelement' TypeAndValue ',' TypeAndValue ExtractElementInst : "extractelement" Type Value "," Type Value OptCommaSepMetadataAttachmentList ; // ~~~ [ insertelement ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#insertelement-instruction // ref: ParseInsertElement // // ::= 'insertelement' TypeAndValue ',' TypeAndValue ',' TypeAndValue InsertElementInst : "insertelement" Type Value "," Type Value "," Type Value OptCommaSepMetadataAttachmentList ; // ~~~ [ shufflevector ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#shufflevector-instruction // ref: ParseShuffleVector // // ::= 'shufflevector' TypeAndValue ',' TypeAndValue ',' TypeAndValue ShuffleVectorInst : "shufflevector" Type Value "," Type Value "," Type Value OptCommaSepMetadataAttachmentList ; // --- [ Aggregate instructions ] ---------------------------------------------- // ~~~ [ extractvalue ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#extractvalue-instruction // ref: ParseExtractValue // // ::= 'extractvalue' TypeAndValue (',' uint32)+ ExtractValueInst : "extractvalue" Type Value "," IndexList OptCommaSepMetadataAttachmentList ; // ~~~ [ insertvalue ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#insertvalue-instruction // ref: ParseInsertValue // // ::= 'insertvalue' TypeAndValue ',' TypeAndValue (',' uint32)+ InsertValueInst : "insertvalue" Type Value "," Type Value "," IndexList OptCommaSepMetadataAttachmentList ; // --- [ Memory instructions ] ------------------------------------------------- // ~~~ [ alloca ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#alloca-instruction // ref: ParseAlloc // // ::= 'alloca' 'inalloca'? 'swifterror'? Type (',' TypeAndValue)? // (',' 'align' i32)? (',', 'addrspace(n))? // TODO: Simplify when parser generator is not limited by 1 token lookahead. // // AllocaInst // : "alloca" OptInAlloca OptSwiftError Type OptCommaTypeValue OptCommaAlignment OptCommaAddrSpace OptCommaSepMetadataAttachmentList // ; AllocaInst : "alloca" OptInAlloca OptSwiftError Type OptCommaSepMetadataAttachmentList | "alloca" OptInAlloca OptSwiftError Type "," Alignment OptCommaSepMetadataAttachmentList | "alloca" OptInAlloca OptSwiftError Type "," Type Value OptCommaSepMetadataAttachmentList | "alloca" OptInAlloca OptSwiftError Type "," Type Value "," Alignment OptCommaSepMetadataAttachmentList | "alloca" OptInAlloca OptSwiftError Type "," AddrSpace OptCommaSepMetadataAttachmentList | "alloca" OptInAlloca OptSwiftError Type "," Alignment "," AddrSpace OptCommaSepMetadataAttachmentList | "alloca" OptInAlloca OptSwiftError Type "," Type Value "," AddrSpace OptCommaSepMetadataAttachmentList | "alloca" OptInAlloca OptSwiftError Type "," Type Value "," Alignment "," AddrSpace OptCommaSepMetadataAttachmentList ; OptInAlloca : empty | "inalloca" ; OptSwiftError : empty | "swifterror" ; // ~~~ [ load ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#load-instruction // ref: ParseLoad // // ::= 'load' 'volatile'? TypeAndValue (',' 'align' i32)? // ::= 'load' 'atomic' 'volatile'? TypeAndValue // 'singlethread'? AtomicOrdering (',' 'align' i32)? // TODO: Simplify when parser generator is not limited by 1 token lookahead. // // LoadInst // : "load" OptVolatile Type "," Type Value OptCommaAlignment OptCommaSepMetadataAttachmentList // | "load" "atomic" OptVolatile Type "," Type Value OptSyncScope AtomicOrdering OptCommaAlignment OptCommaSepMetadataAttachmentList // ; LoadInst // Load. : "load" OptVolatile Type "," Type Value OptCommaSepMetadataAttachmentList | "load" OptVolatile Type "," Type Value "," Alignment OptCommaSepMetadataAttachmentList // Atomic load. | "load" "atomic" OptVolatile Type "," Type Value OptSyncScope AtomicOrdering OptCommaSepMetadataAttachmentList | "load" "atomic" OptVolatile Type "," Type Value OptSyncScope AtomicOrdering "," Alignment OptCommaSepMetadataAttachmentList ; // ~~~ [ store ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#store-instruction // ref: ParseStore // // ::= 'store' 'volatile'? TypeAndValue ',' TypeAndValue (',' 'align' i32)? // ::= 'store' 'atomic' 'volatile'? TypeAndValue ',' TypeAndValue // 'singlethread'? AtomicOrdering (',' 'align' i32)? // TODO: Simplify when parser generator is not limited by 1 token lookahead. // // StoreInst // : "store" OptVolatile Type Value "," Type Value OptCommaAlignment OptCommaSepMetadataAttachmentList // | "store" "atomic" OptVolatile Type Value "," Type Value OptSyncScope AtomicOrdering OptCommaAlignment OptCommaSepMetadataAttachmentList // ; StoreInst : "store" OptVolatile Type Value "," Type Value OptCommaSepMetadataAttachmentList | "store" OptVolatile Type Value "," Type Value "," Alignment OptCommaSepMetadataAttachmentList | "store" "atomic" OptVolatile Type Value "," Type Value OptSyncScope AtomicOrdering OptCommaSepMetadataAttachmentList | "store" "atomic" OptVolatile Type Value "," Type Value OptSyncScope AtomicOrdering "," Alignment OptCommaSepMetadataAttachmentList ; // ~~~ [ fence ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#fence-instruction // ref: ParseFence // // ::= 'fence' 'singlethread'? AtomicOrdering FenceInst : "fence" OptSyncScope AtomicOrdering OptCommaSepMetadataAttachmentList ; // ~~~ [ cmpxchg ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#cmpxchg-instruction // ref: ParseCmpXchg // // ::= 'cmpxchg' 'weak'? 'volatile'? TypeAndValue ',' TypeAndValue ',' // TypeAndValue 'singlethread'? AtomicOrdering AtomicOrdering CmpXchgInst : "cmpxchg" OptWeak OptVolatile Type Value "," Type Value "," Type Value OptSyncScope AtomicOrdering AtomicOrdering OptCommaSepMetadataAttachmentList ; OptWeak : empty | "weak" ; // ~~~ [ atomicrmw ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#atomicrmw-instruction // ref: ParseAtomicRMW // // ::= 'atomicrmw' 'volatile'? BinOp TypeAndValue ',' TypeAndValue // 'singlethread'? AtomicOrdering AtomicRMWInst : "atomicrmw" OptVolatile BinOp Type Value "," Type Value OptSyncScope AtomicOrdering OptCommaSepMetadataAttachmentList ; BinOp : "add" | "and" | "max" | "min" | "nand" | "or" | "sub" | "umax" | "umin" | "xchg" | "xor" ; // ~~~ [ getelementptr ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#getelementptr-instruction // ref: ParseGetElementPtr // // ::= 'getelementptr' 'inbounds'? TypeAndValue (',' TypeAndValue)* // TODO: Simplify when parser generator is not limited by 1 token lookahead. // // GetElementPtrInst // : "getelementptr" OptInBounds Type "," Type Value GEPIndices OptCommaSepMetadataAttachmentList // ; GetElementPtrInst : "getelementptr" OptInBounds Type "," Type Value OptCommaSepMetadataAttachmentList | "getelementptr" OptInBounds Type "," Type Value "," CommaSepTypeValueList OptCommaSepMetadataAttachmentList ; // --- [ Conversion instructions ] --------------------------------------------- // ~~~ [ trunc ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#trunc-instruction // ref: ParseCast // // ::= CastOpc TypeAndValue 'to' Type TruncInst : "trunc" Type Value "to" Type OptCommaSepMetadataAttachmentList ; // ~~~ [ zext ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#zext-instruction // ref: ParseCast // // ::= CastOpc TypeAndValue 'to' Type ZExtInst : "zext" Type Value "to" Type OptCommaSepMetadataAttachmentList ; // ~~~ [ sext ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#sext-instruction // ref: ParseCast // // ::= CastOpc TypeAndValue 'to' Type SExtInst : "sext" Type Value "to" Type OptCommaSepMetadataAttachmentList ; // ~~~ [ fptrunc ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#fptrunc-instruction // ref: ParseCast // // ::= CastOpc TypeAndValue 'to' Type FPTruncInst : "fptrunc" Type Value "to" Type OptCommaSepMetadataAttachmentList ; // ~~~ [ fpext ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#fpext-instruction // ref: ParseCast // // ::= CastOpc TypeAndValue 'to' Type FPExtInst : "fpext" Type Value "to" Type OptCommaSepMetadataAttachmentList ; // ~~~ [ fptoui ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#fptoui-instruction // ref: ParseCast // // ::= CastOpc TypeAndValue 'to' Type FPToUIInst : "fptoui" Type Value "to" Type OptCommaSepMetadataAttachmentList ; // ~~~ [ fptosi ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#fptosi-instruction // ref: ParseCast // // ::= CastOpc TypeAndValue 'to' Type FPToSIInst : "fptosi" Type Value "to" Type OptCommaSepMetadataAttachmentList ; // ~~~ [ uitofp ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#uitofp-instruction // ref: ParseCast // // ::= CastOpc TypeAndValue 'to' Type UIToFPInst : "uitofp" Type Value "to" Type OptCommaSepMetadataAttachmentList ; // ~~~ [ sitofp ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#sitofp-instruction // ref: ParseCast // // ::= CastOpc TypeAndValue 'to' Type SIToFPInst : "sitofp" Type Value "to" Type OptCommaSepMetadataAttachmentList ; // ~~~ [ ptrtoint ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#ptrtoint-instruction // ref: ParseCast // // ::= CastOpc TypeAndValue 'to' Type PtrToIntInst : "ptrtoint" Type Value "to" Type OptCommaSepMetadataAttachmentList ; // ~~~ [ inttoptr ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#inttoptr-instruction // ref: ParseCast // // ::= CastOpc TypeAndValue 'to' Type IntToPtrInst : "inttoptr" Type Value "to" Type OptCommaSepMetadataAttachmentList ; // ~~~ [ bitcast ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#bitcast-instruction // ref: ParseCast // // ::= CastOpc TypeAndValue 'to' Type BitCastInst : "bitcast" Type Value "to" Type OptCommaSepMetadataAttachmentList ; // ~~~ [ addrspacecast ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#addrspacecast-instruction // ref: ParseCast // // ::= CastOpc TypeAndValue 'to' Type AddrSpaceCastInst : "addrspacecast" Type Value "to" Type OptCommaSepMetadataAttachmentList ; // --- [ Other instructions ] -------------------------------------------------- // ~~~ [ icmp ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#icmp-instruction // ref: ParseCompare // // ::= 'icmp' IPredicates TypeAndValue ',' Value ICmpInst : "icmp" IPred Type Value "," Value OptCommaSepMetadataAttachmentList ; // ~~~ [ fcmp ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#fcmp-instruction // ref: ParseCompare // // ::= 'fcmp' FPredicates TypeAndValue ',' Value FCmpInst : "fcmp" FastMathFlags FPred Type Value "," Value OptCommaSepMetadataAttachmentList ; // ~~~ [ phi ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#phi-instruction // ref: ParsePHI // // ::= 'phi' Type '[' Value ',' Value ']' (',' '[' Value ',' Value ']')* PhiInst : "phi" Type IncList OptCommaSepMetadataAttachmentList ; IncList : Inc | IncList "," Inc ; Inc : "[" Value "," LocalIdent "]" ; // ~~~ [ select ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#select-instruction // ref: ParseSelect // // ::= 'select' TypeAndValue ',' TypeAndValue ',' TypeAndValue SelectInst : "select" Type Value "," Type Value "," Type Value OptCommaSepMetadataAttachmentList ; // ~~~ [ call ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#call-instruction // ref: ParseCall // // ::= 'call' OptionalFastMathFlags OptionalCallingConv // OptionalAttrs Type Value ParameterList OptionalAttrs // ::= 'tail' 'call' OptionalFastMathFlags OptionalCallingConv // OptionalAttrs Type Value ParameterList OptionalAttrs // ::= 'musttail' 'call' OptionalFastMathFlags OptionalCallingConv // OptionalAttrs Type Value ParameterList OptionalAttrs // ::= 'notail' 'call' OptionalFastMathFlags OptionalCallingConv // OptionalAttrs Type Value ParameterList OptionalAttrs CallInst : OptTail "call" FastMathFlags OptCallingConv ReturnAttrs Type Value "(" Args ")" FuncAttrs OperandBundles OptCommaSepMetadataAttachmentList ; OptTail : empty | "musttail" | "notail" | "tail" ; // ~~~ [ va_arg ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#va_arg-instruction // ref: ParseVA_Arg // // ::= 'va_arg' TypeAndValue ',' Type VAArgInst : "va_arg" Type Value "," Type OptCommaSepMetadataAttachmentList ; // ~~~ [ landingpad ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#landingpad-instruction // ref: ParseLandingPad // // ::= 'landingpad' Type 'personality' TypeAndValue 'cleanup'? Clause+ // Clause // ::= 'catch' TypeAndValue // ::= 'filter' // ::= 'filter' TypeAndValue ( ',' TypeAndValue )* LandingPadInst : "landingpad" Type OptCleanup Clauses OptCommaSepMetadataAttachmentList ; OptCleanup : empty | "cleanup" ; Clauses : empty | ClauseList ; ClauseList : Clause | ClauseList Clause ; Clause : "catch" Type Value | "filter" Type ArrayConst ; // --- [ catchpad ] ------------------------------------------------------------ // ref: ParseCatchPad // // ::= 'catchpad' ParamList 'to' TypeAndValue 'unwind' TypeAndValue CatchPadInst : "catchpad" "within" LocalIdent "[" ExceptionArgs "]" OptCommaSepMetadataAttachmentList ; // --- [ cleanuppad ] ---------------------------------------------------------- // ref: ParseCleanupPad // // ::= 'cleanuppad' within Parent ParamList CleanupPadInst : "cleanuppad" "within" ExceptionScope "[" ExceptionArgs "]" OptCommaSepMetadataAttachmentList ; // === [ Terminators ] ======================================================== // https://llvm.org/docs/LangRef.html#terminator-instructions // ref: ParseInstruction Terminator : RetTerm | BrTerm | CondBrTerm | SwitchTerm | IndirectBrTerm | InvokeTerm | ResumeTerm | CatchSwitchTerm | CatchRetTerm | CleanupRetTerm | UnreachableTerm ; // --- [ ret ] ----------------------------------------------------------------- // https://llvm.org/docs/LangRef.html#ret-instruction // ref: ParseRet // // ::= 'ret' void (',' !dbg, !1)* // ::= 'ret' TypeAndValue (',' !dbg, !1)* RetTerm // Void return. : "ret" VoidType OptCommaSepMetadataAttachmentList // Value return. | "ret" ConcreteType Value OptCommaSepMetadataAttachmentList ; // --- [ br ] ------------------------------------------------------------------ // https://llvm.org/docs/LangRef.html#br-instruction // ref: ParseBr // // ::= 'br' TypeAndValue // ::= 'br' TypeAndValue ',' TypeAndValue ',' TypeAndValue // Unconditional branch. BrTerm : "br" LabelType LocalIdent OptCommaSepMetadataAttachmentList ; // Conditional branch. CondBrTerm : "br" IntType Value "," LabelType LocalIdent "," LabelType LocalIdent OptCommaSepMetadataAttachmentList ; // --- [ switch ] -------------------------------------------------------------- // https://llvm.org/docs/LangRef.html#switch-instruction // ref: ParseSwitch // // ::= 'switch' TypeAndValue ',' TypeAndValue '[' JumpTable ']' // JumpTable // ::= (TypeAndValue ',' TypeAndValue)* SwitchTerm : "switch" Type Value "," LabelType LocalIdent "[" Cases "]" OptCommaSepMetadataAttachmentList ; Cases : empty | CaseList ; CaseList : Case | CaseList Case ; Case : Type IntConst "," LabelType LocalIdent ; // --- [ indirectbr ] ---------------------------------------------------------- // https://llvm.org/docs/LangRef.html#indirectbr-instruction // ref: ParseIndirectBr // // ::= 'indirectbr' TypeAndValue ',' '[' LabelList ']' IndirectBrTerm : "indirectbr" Type Value "," "[" LabelList "]" OptCommaSepMetadataAttachmentList ; LabelList : Label | LabelList "," Label ; Label : LabelType LocalIdent ; // --- [ invoke ] -------------------------------------------------------------- // https://llvm.org/docs/LangRef.html#invoke-instruction // ref: ParseInvoke // // ::= 'invoke' OptionalCallingConv OptionalAttrs Type Value ParamList // OptionalAttrs 'to' TypeAndValue 'unwind' TypeAndValue InvokeTerm : "invoke" OptCallingConv ReturnAttrs Type Value "(" Args ")" FuncAttrs OperandBundles "to" LabelType LocalIdent "unwind" LabelType LocalIdent OptCommaSepMetadataAttachmentList ; // --- [ resume ] -------------------------------------------------------------- // https://llvm.org/docs/LangRef.html#resume-instruction // ref: ParseResume // // ::= 'resume' TypeAndValue ResumeTerm : "resume" Type Value OptCommaSepMetadataAttachmentList ; // --- [ catchswitch ] --------------------------------------------------------- // https://llvm.org/docs/LangRef.html#catchswitch-instruction // ref: ParseCatchSwitch // // ::= 'catchswitch' within Parent CatchSwitchTerm : "catchswitch" "within" ExceptionScope "[" LabelList "]" "unwind" UnwindTarget OptCommaSepMetadataAttachmentList ; // --- [ catchret ] ------------------------------------------------------------ // https://llvm.org/docs/LangRef.html#catchret-instruction // ref: ParseCatchRet // // ::= 'catchret' from Parent Value 'to' TypeAndValue CatchRetTerm : "catchret" "from" Value "to" LabelType LocalIdent OptCommaSepMetadataAttachmentList ; // --- [ cleanupret ] ---------------------------------------------------------- // https://llvm.org/docs/LangRef.html#cleanupret-instruction // ref: ParseCleanupRet // // ::= 'cleanupret' from Value unwind ('to' 'caller' | TypeAndValue) CleanupRetTerm : "cleanupret" "from" Value "unwind" UnwindTarget OptCommaSepMetadataAttachmentList ; // --- [ unreachable ] --------------------------------------------------------- // https://llvm.org/docs/LangRef.html#unreachable-instruction // ref: ParseInstruction UnreachableTerm : "unreachable" OptCommaSepMetadataAttachmentList ; // ___ [ Helpers ] _____________________________________________________________ UnwindTarget : "to" "caller" | LabelType LocalIdent ; // === [ Metadata Nodes and Metadata Strings ] ================================ // https://llvm.org/docs/LangRef.html#metadata-nodes-and-metadata-strings // --- [ Metadata Tuple ] ------------------------------------------------------ // ref: ParseMDTuple MDTuple : "!" MDFields ; // ref: ParseMDNodeVector // // ::= { Element (',' Element)* } // Element // ::= 'null' | TypeAndValue // ref: ParseMDField(MDFieldList &) MDFields : "{" "}" | "{" MDFieldList "}" ; MDFieldList : MDField | MDFieldList "," MDField ; // ref: ParseMDField(MDField &) MDField // Null is a special case since it is typeless. : "null" | Metadata ; // --- [ Metadata ] ------------------------------------------------------------ // ref: ParseMetadata // // ::= i32 %local // ::= i32 @global // ::= i32 7 // ::= !42 // ::= !{...} // ::= !"string" // ::= !DILocation(...) Metadata : Type Value | MDString // !{ ... } | MDTuple // !7 | MetadataID | SpecializedMDNode ; // --- [ Metadata String ] ----------------------------------------------------- // ref: ParseMDString // // ::= '!' STRINGCONSTANT MDString : "!" StringLit ; // --- [ Metadata Attachment ] ------------------------------------------------- // ref: ParseMetadataAttachment // // ::= !dbg !42 MetadataAttachment : MetadataName MDNode ; // --- [ Metadata Node ] ------------------------------------------------------- // ref: ParseMDNode // // ::= !{ ... } // ::= !7 // ::= !DILocation(...) MDNode // !{ ... } : MDTuple // !42 | MetadataID | SpecializedMDNode ; // ### [ Helper productions ] ################################################## // ref: ParseOptionalFunctionMetadata // // ::= (!dbg !57)* MetadataAttachments : empty | MetadataAttachmentList ; MetadataAttachmentList : MetadataAttachment | MetadataAttachmentList MetadataAttachment ; // ref: ParseInstructionMetadata // // ::= !dbg !42 (',' !dbg !57)* OptCommaSepMetadataAttachmentList : empty | "," CommaSepMetadataAttachmentList ; CommaSepMetadataAttachmentList : MetadataAttachment | CommaSepMetadataAttachmentList "," MetadataAttachment ; // --- [ Specialized Metadata Nodes ] ------------------------------------------ // https://llvm.org/docs/LangRef.html#specialized-metadata-nodes // ref: ParseSpecializedMDNode SpecializedMDNode : DICompileUnit | DIFile | DIBasicType | DISubroutineType | DIDerivedType | DICompositeType | DISubrange | DIEnumerator | DITemplateTypeParameter | DITemplateValueParameter | DIModule // not in spec as of 2018-02-21 | DINamespace | DIGlobalVariable | DISubprogram | DILexicalBlock | DILexicalBlockFile | DILocation | DILocalVariable | DIExpression | DIGlobalVariableExpression // not in spec as of 2018-02-21 | DIObjCProperty | DIImportedEntity | DIMacro | DIMacroFile | GenericDINode // not in spec as of 2018-02-21 ; // ~~~ [ DICompileUnit ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#dicompileunit // ref: ParseDICompileUnit // // ::= !DICompileUnit(language: DW_LANG_C99, file: !0, producer: "clang", // isOptimized: true, flags: "-O2", runtimeVersion: 1, // splitDebugFilename: "abc.debug", // emissionKind: FullDebug, enums: !1, retainedTypes: !2, // globals: !4, imports: !5, macros: !6, dwoId: 0x0abcd) // // REQUIRED(language, DwarfLangField, ); // REQUIRED(file, MDField, (AllowNull false)); // OPTIONAL(producer, MDStringField, ); // OPTIONAL(isOptimized, MDBoolField, ); // OPTIONAL(flags, MDStringField, ); // OPTIONAL(runtimeVersion, MDUnsignedField, (0, UINT32_MAX)); // OPTIONAL(splitDebugFilename, MDStringField, ); // OPTIONAL(emissionKind, EmissionKindField, ); // OPTIONAL(enums, MDField, ); // OPTIONAL(retainedTypes, MDField, ); // OPTIONAL(globals, MDField, ); // OPTIONAL(imports, MDField, ); // OPTIONAL(macros, MDField, ); // OPTIONAL(dwoId, MDUnsignedField, ); // OPTIONAL(splitDebugInlining, MDBoolField, = true); // OPTIONAL(debugInfoForProfiling, MDBoolField, = false); // OPTIONAL(gnuPubnames, MDBoolField, = false); DICompileUnit : "!DICompileUnit" "(" DICompileUnitFields ")" ; DICompileUnitFields : empty | DICompileUnitFieldList ; DICompileUnitFieldList : DICompileUnitField | DICompileUnitFieldList "," DICompileUnitField ; DICompileUnitField : "language:" DwarfLang | FileField | "producer:" StringLit | IsOptimizedField | "flags:" StringLit | "runtimeVersion:" IntLit | "splitDebugFilename:" StringLit | "emissionKind:" EmissionKind | "enums:" MDField | "retainedTypes:" MDField | "globals:" MDField | "imports:" MDField | "macros:" MDField | "dwoId:" IntLit | "splitDebugInlining:" BoolLit | "debugInfoForProfiling:" BoolLit | "gnuPubnames:" BoolLit ; // ~~~ [ DIFile ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#difile // ref: ParseDIFileType // // ::= !DIFileType(filename: "path/to/file", directory: "/path/to/dir" // checksumkind: CSK_MD5, // checksum: "000102030405060708090a0b0c0d0e0f") // // REQUIRED(filename, MDStringField, ); // REQUIRED(directory, MDStringField, ); // OPTIONAL(checksumkind, ChecksumKindField, (DIFile::CSK_MD5)); // OPTIONAL(checksum, MDStringField, ); DIFile : "!DIFile" "(" DIFileFields ")" ; DIFileFields : empty | DIFileFieldList ; DIFileFieldList : DIFileField | DIFileFieldList "," DIFileField ; DIFileField : "filename:" StringLit | "directory:" StringLit | "checksumkind:" ChecksumKind | "checksum:" StringLit ; // ~~~ [ DIBasicType ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#dibasictype // ref: ParseDIBasicType // // ::= !DIBasicType(tag: DW_TAG_base_type, name: "int", size: 32, align: 32) // // OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_base_type)); // OPTIONAL(name, MDStringField, ); // OPTIONAL(size, MDUnsignedField, (0, UINT64_MAX)); // OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); // OPTIONAL(encoding, DwarfAttEncodingField, ); DIBasicType : "!DIBasicType" "(" DIBasicTypeFields ")" ; DIBasicTypeFields : empty | DIBasicTypeFieldList ; DIBasicTypeFieldList : DIBasicTypeField | DIBasicTypeFieldList "," DIBasicTypeField ; DIBasicTypeField : TagField | NameField | SizeField | AlignField | "encoding:" DwarfAttEncoding ; // ~~~ [ DISubroutineType ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#disubroutinetype // ref: ParseDISubroutineType // // OPTIONAL(flags, DIFlagField, ); // OPTIONAL(cc, DwarfCCField, ); // REQUIRED(types, MDField, ); DISubroutineType : "!DISubroutineType" "(" DISubroutineTypeFields ")" ; DISubroutineTypeFields : empty | DISubroutineTypeFieldList ; DISubroutineTypeFieldList : DISubroutineTypeField | DISubroutineTypeFieldList "," DISubroutineTypeField ; DISubroutineTypeField : FlagsField | "cc:" DwarfCC | "types:" MDField ; // ~~~ [ DIDerivedType ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#diderivedtype // ref: ParseDIDerivedType // // ::= !DIDerivedType(tag: DW_TAG_pointer_type, name: "int", file: !0, // line: 7, scope: !1, baseType: !2, size: 32, // align: 32, offset: 0, flags: 0, extraData: !3, // dwarfAddressSpace: 3) // // REQUIRED(tag, DwarfTagField, ); // OPTIONAL(name, MDStringField, ); // OPTIONAL(scope, MDField, ); // OPTIONAL(file, MDField, ); // OPTIONAL(line, LineField, ); // REQUIRED(baseType, MDField, ); // OPTIONAL(size, MDUnsignedField, (0, UINT64_MAX)); // OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); // OPTIONAL(offset, MDUnsignedField, (0, UINT64_MAX)); // OPTIONAL(flags, DIFlagField, ); // OPTIONAL(extraData, MDField, ); // OPTIONAL(dwarfAddressSpace, MDUnsignedField, (UINT32_MAX, UINT32_MAX)); DIDerivedType : "!DIDerivedType" "(" DIDerivedTypeFields ")" ; DIDerivedTypeFields : empty | DIDerivedTypeFieldList ; DIDerivedTypeFieldList : DIDerivedTypeField | DIDerivedTypeFieldList "," DIDerivedTypeField ; DIDerivedTypeField : TagField | NameField | ScopeField | FileField | LineField | BaseTypeField | SizeField | AlignField | OffsetField | FlagsField | "extraData:" MDField | "dwarfAddressSpace:" IntLit ; // ~~~ [ DICompositeType ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#dicompositetype // ref: ParseDICompositeType // // REQUIRED(tag, DwarfTagField, ); // OPTIONAL(name, MDStringField, ); // OPTIONAL(scope, MDField, ); // OPTIONAL(file, MDField, ); // OPTIONAL(line, LineField, ); // OPTIONAL(baseType, MDField, ); // OPTIONAL(size, MDUnsignedField, (0, UINT64_MAX)); // OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); // OPTIONAL(offset, MDUnsignedField, (0, UINT64_MAX)); // OPTIONAL(flags, DIFlagField, ); // OPTIONAL(elements, MDField, ); // OPTIONAL(runtimeLang, DwarfLangField, ); // OPTIONAL(vtableHolder, MDField, ); // OPTIONAL(templateParams, MDField, ); // OPTIONAL(identifier, MDStringField, ); // OPTIONAL(discriminator, MDField, ); DICompositeType : "!DICompositeType" "(" DICompositeTypeFields ")" ; DICompositeTypeFields : empty | DICompositeTypeFieldList ; DICompositeTypeFieldList : DICompositeTypeField | DICompositeTypeFieldList "," DICompositeTypeField ; DICompositeTypeField : TagField | NameField | ScopeField | FileField | LineField | BaseTypeField | SizeField | AlignField | OffsetField | FlagsField | "elements:" MDField | "runtimeLang:" DwarfLang | "vtableHolder:" MDField | TemplateParamsField | "identifier:" StringLit | "discriminator:" MDField ; // ~~~ [ DISubrange ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#disubrange // ref: ParseDISubrange // // ::= !DISubrange(count: 30, lowerBound: 2) // ::= !DISubrange(count: !node, lowerBound: 2) // // REQUIRED(count, MDSignedOrMDField, (-1, -1, INT64_MAX, false)); // OPTIONAL(lowerBound, MDSignedField, ); DISubrange : "!DISubrange" "(" DISubrangeFields ")" ; DISubrangeFields : empty | DISubrangeFieldList ; DISubrangeFieldList : DISubrangeField | DISubrangeFieldList "," DISubrangeField ; DISubrangeField : "count:" IntOrMDField | "lowerBound:" IntLit ; // ~~~ [ DIEnumerator ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#dienumerator // ref: ParseDIEnumerator // // ::= !DIEnumerator(value: 30, isUnsigned: true, name: "SomeKind") // // REQUIRED(name, MDStringField, ); // REQUIRED(value, MDSignedOrUnsignedField, ); // OPTIONAL(isUnsigned, MDBoolField, (false)); DIEnumerator : "!DIEnumerator" "(" DIEnumeratorFields ")" ; DIEnumeratorFields : empty | DIEnumeratorFieldList ; DIEnumeratorFieldList : DIEnumeratorField | DIEnumeratorFieldList "," DIEnumeratorField ; DIEnumeratorField : NameField | "value:" IntLit | "isUnsigned:" BoolLit ; // ~~~ [ DITemplateTypeParameter ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#ditemplatetypeparameter // ref: ParseDITemplateTypeParameter // // ::= !DITemplateTypeParameter(name: "Ty", type: !1) // // OPTIONAL(name, MDStringField, ); // REQUIRED(type, MDField, ); DITemplateTypeParameter : "!DITemplateTypeParameter" "(" DITemplateTypeParameterFields ")" ; DITemplateTypeParameterFields : empty | DITemplateTypeParameterFieldList ; DITemplateTypeParameterFieldList : DITemplateTypeParameterField | DITemplateTypeParameterFieldList "," DITemplateTypeParameterField ; DITemplateTypeParameterField : NameField | TypeField ; // ~~~ [ DITemplateValueParameter ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#ditemplatevalueparameter // ref: ParseDITemplateValueParameter // // ::= !DITemplateValueParameter(tag: DW_TAG_template_value_parameter, // name: "V", type: !1, value: i32 7) // // OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_template_value_parameter)); // OPTIONAL(name, MDStringField, ); // OPTIONAL(type, MDField, ); // REQUIRED(value, MDField, ); DITemplateValueParameter : "!DITemplateValueParameter" "(" DITemplateValueParameterFields ")" ; DITemplateValueParameterFields : empty | DITemplateValueParameterFieldList ; DITemplateValueParameterFieldList : DITemplateValueParameterField | DITemplateValueParameterFieldList "," DITemplateValueParameterField ; DITemplateValueParameterField : TagField | NameField | TypeField | "value:" MDField ; // ~~~ [ DIModule ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseDIModule // // ::= !DIModule(scope: !0, name: "SomeModule", configMacros: "-DNDEBUG", // includePath: "/usr/include", isysroot: "/") // // REQUIRED(scope, MDField, ); // REQUIRED(name, MDStringField, ); // OPTIONAL(configMacros, MDStringField, ); // OPTIONAL(includePath, MDStringField, ); // OPTIONAL(isysroot, MDStringField, ); DIModule : "!DIModule" "(" DIModuleFields ")" ; DIModuleFields : empty | DIModuleFieldList ; DIModuleFieldList : DIModuleField | DIModuleFieldList "," DIModuleField ; DIModuleField : ScopeField | NameField | "configMacros:" StringLit | "includePath:" StringLit | "isysroot:" StringLit ; // ~~~ [ DINamespace ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#dinamespace // ref: ParseDINamespace // // ::= !DINamespace(scope: !0, file: !2, name: "SomeNamespace", line: 9) // // REQUIRED(scope, MDField, ); // OPTIONAL(name, MDStringField, ); // OPTIONAL(exportSymbols, MDBoolField, ); DINamespace : "!DINamespace" "(" DINamespaceFields ")" ; DINamespaceFields : empty | DINamespaceFieldList ; DINamespaceFieldList : DINamespaceField | DINamespaceFieldList "," DINamespaceField ; DINamespaceField : ScopeField | NameField | "exportSymbols:" BoolLit ; // ~~~ [ DIGlobalVariable ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#diglobalvariable // ref: ParseDIGlobalVariable // // ::= !DIGlobalVariable(scope: !0, name: "foo", linkageName: "foo", // file: !1, line: 7, type: !2, isLocal: false, // isDefinition: true, declaration: !3, align: 8) // // REQUIRED(name, MDStringField, (AllowEmpty false)); // OPTIONAL(scope, MDField, ); // OPTIONAL(linkageName, MDStringField, ); // OPTIONAL(file, MDField, ); // OPTIONAL(line, LineField, ); // OPTIONAL(type, MDField, ); // OPTIONAL(isLocal, MDBoolField, ); // OPTIONAL(isDefinition, MDBoolField, (true)); // OPTIONAL(declaration, MDField, ); // OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); DIGlobalVariable : "!DIGlobalVariable" "(" DIGlobalVariableFields ")" ; DIGlobalVariableFields : empty | DIGlobalVariableFieldList ; DIGlobalVariableFieldList : DIGlobalVariableField | DIGlobalVariableFieldList "," DIGlobalVariableField ; DIGlobalVariableField : NameField | ScopeField | LinkageNameField | FileField | LineField | TypeField | IsLocalField | IsDefinitionField | DeclarationField | AlignField ; // ~~~ [ DISubprogram ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#disubprogram // ref: ParseDISubprogram // // ::= !DISubprogram(scope: !0, name: "foo", linkageName: "_Zfoo", // file: !1, line: 7, type: !2, isLocal: false, // isDefinition: true, scopeLine: 8, containingType: !3, // virtuality: DW_VIRTUALTIY_pure_virtual, // virtualIndex: 10, thisAdjustment: 4, flags: 11, // isOptimized: false, templateParams: !4, declaration: !5, // variables: !6, thrownTypes: !7) // // OPTIONAL(name, MDStringField, ); // OPTIONAL(scope, MDField, ); // OPTIONAL(linkageName, MDStringField, ); // OPTIONAL(file, MDField, ); // OPTIONAL(line, LineField, ); // OPTIONAL(type, MDField, ); // OPTIONAL(isLocal, MDBoolField, ); // OPTIONAL(isDefinition, MDBoolField, (true)); // OPTIONAL(scopeLine, LineField, ); // OPTIONAL(containingType, MDField, ); // OPTIONAL(virtuality, DwarfVirtualityField, ); // OPTIONAL(virtualIndex, MDUnsignedField, (0, UINT32_MAX)); // OPTIONAL(thisAdjustment, MDSignedField, (0, INT32_MIN, INT32_MAX)); // OPTIONAL(flags, DIFlagField, ); // OPTIONAL(isOptimized, MDBoolField, ); // OPTIONAL(unit, MDField, ); // OPTIONAL(templateParams, MDField, ); // OPTIONAL(declaration, MDField, ); // OPTIONAL(variables, MDField, ); // OPTIONAL(thrownTypes, MDField, ); DISubprogram : "!DISubprogram" "(" DISubprogramFields ")" ; DISubprogramFields : empty | DISubprogramFieldList ; DISubprogramFieldList : DISubprogramField | DISubprogramFieldList "," DISubprogramField ; DISubprogramField : NameField | ScopeField | LinkageNameField | FileField | LineField | TypeField | IsLocalField | IsDefinitionField | "scopeLine:" IntLit | "containingType:" MDField | "virtuality:" DwarfVirtuality | "virtualIndex:" IntLit | "thisAdjustment:" IntLit | FlagsField | IsOptimizedField | "unit:" MDField | TemplateParamsField | DeclarationField | "variables:" MDField | "thrownTypes:" MDField ; // ~~~ [ DILexicalBlock ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#dilexicalblock // ref: ParseDILexicalBlock // // ::= !DILexicalBlock(scope: !0, file: !2, line: 7, column: 9) // // REQUIRED(scope, MDField, (AllowNull false)); // OPTIONAL(file, MDField, ); // OPTIONAL(line, LineField, ); // OPTIONAL(column, ColumnField, ); DILexicalBlock : "!DILexicalBlock" "(" DILexicalBlockFields ")" ; DILexicalBlockFields : empty | DILexicalBlockFieldList ; DILexicalBlockFieldList : DILexicalBlockField | DILexicalBlockFieldList "," DILexicalBlockField ; DILexicalBlockField : ScopeField | FileField | LineField | ColumnField ; // ~~~ [ DILexicalBlockFile ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#dilexicalblockfile // ref: ParseDILexicalBlockFile // // ::= !DILexicalBlockFile(scope: !0, file: !2, discriminator: 9) // // REQUIRED(scope, MDField, (AllowNull false)); // OPTIONAL(file, MDField, ); // REQUIRED(discriminator, MDUnsignedField, (0, UINT32_MAX)); DILexicalBlockFile : "!DILexicalBlockFile" "(" DILexicalBlockFileFields ")" ; DILexicalBlockFileFields : empty | DILexicalBlockFileFieldList ; DILexicalBlockFileFieldList : DILexicalBlockFileField | DILexicalBlockFileFieldList "," DILexicalBlockFileField ; DILexicalBlockFileField : ScopeField | FileField | "discriminator:" IntLit ; // ~~~ [ DILocation ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#dilocation // ref: ParseDILocation // // ::= !DILocation(line: 43, column: 8, scope: !5, inlinedAt: !6) // // OPTIONAL(line, LineField, ); // OPTIONAL(column, ColumnField, ); // REQUIRED(scope, MDField, (AllowNull false)); // OPTIONAL(inlinedAt, MDField, ); DILocation : "!DILocation" "(" DILocationFields ")" ; DILocationFields : empty | DILocationFieldList ; DILocationFieldList : DILocationField | DILocationFieldList "," DILocationField ; DILocationField : LineField | ColumnField | ScopeField | "inlinedAt:" MDField ; // ~~~ [ DILocalVariable ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#dilocalvariable // ref: ParseDILocalVariable // // ::= !DILocalVariable(arg: 7, scope: !0, name: "foo", // file: !1, line: 7, type: !2, arg: 2, flags: 7, // align: 8) // ::= !DILocalVariable(scope: !0, name: "foo", // file: !1, line: 7, type: !2, arg: 2, flags: 7, // align: 8) // // OPTIONAL(name, MDStringField, ); // OPTIONAL(arg, MDUnsignedField, (0, UINT16_MAX)); // REQUIRED(scope, MDField, (AllowNull false)); // OPTIONAL(file, MDField, ); // OPTIONAL(line, LineField, ); // OPTIONAL(type, MDField, ); // OPTIONAL(flags, DIFlagField, ); // OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); DILocalVariable : "!DILocalVariable" "(" DILocalVariableFields ")" ; DILocalVariableFields : empty | DILocalVariableFieldList ; DILocalVariableFieldList : DILocalVariableField | DILocalVariableFieldList "," DILocalVariableField ; DILocalVariableField : NameField | "arg:" IntLit | ScopeField | FileField | LineField | TypeField | FlagsField | AlignField ; // ~~~ [ DIExpression ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#diexpression // ref: ParseDIExpression // // ::= !DIExpression(0, 7, -1) DIExpression : "!DIExpression" "(" DIExpressionFields ")" ; DIExpressionFields : empty | DIExpressionFieldList ; DIExpressionFieldList : DIExpressionField | DIExpressionFieldList "," DIExpressionField ; DIExpressionField : int_lit | DwarfOp ; // ~~~ [ DIGlobalVariableExpression ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseDIGlobalVariableExpression // // ::= !DIGlobalVariableExpression(var: !0, expr: !1) // // REQUIRED(var, MDField, ); // REQUIRED(expr, MDField, ); DIGlobalVariableExpression : "!DIGlobalVariableExpression" "(" DIGlobalVariableExpressionFields ")" ; DIGlobalVariableExpressionFields : empty | DIGlobalVariableExpressionFieldList ; DIGlobalVariableExpressionFieldList : DIGlobalVariableExpressionField | DIGlobalVariableExpressionFieldList "," DIGlobalVariableExpressionField ; DIGlobalVariableExpressionField : "var:" MDField | "expr:" MDField ; // ~~~ [ DIObjCProperty ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#diobjcproperty // ref: ParseDIObjCProperty // // ::= !DIObjCProperty(name: "foo", file: !1, line: 7, setter: "setFoo", // getter: "getFoo", attributes: 7, type: !2) // // OPTIONAL(name, MDStringField, ); // OPTIONAL(file, MDField, ); // OPTIONAL(line, LineField, ); // OPTIONAL(setter, MDStringField, ); // OPTIONAL(getter, MDStringField, ); // OPTIONAL(attributes, MDUnsignedField, (0, UINT32_MAX)); // OPTIONAL(type, MDField, ); DIObjCProperty : "!DIObjCProperty" "(" DIObjCPropertyFields ")" ; DIObjCPropertyFields : empty | DIObjCPropertyFieldList ; DIObjCPropertyFieldList : DIObjCPropertyField | DIObjCPropertyFieldList "," DIObjCPropertyField ; DIObjCPropertyField : NameField | FileField | LineField | "setter:" StringLit | "getter:" StringLit | "attributes:" IntLit | TypeField ; // ~~~ [ DIImportedEntity ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#diimportedentity // ref: ParseDIImportedEntity // // ::= !DIImportedEntity(tag: DW_TAG_imported_module, scope: !0, entity: !1, // line: 7, name: "foo") // // REQUIRED(tag, DwarfTagField, ); // REQUIRED(scope, MDField, ); // OPTIONAL(entity, MDField, ); // OPTIONAL(file, MDField, ); // OPTIONAL(line, LineField, ); // OPTIONAL(name, MDStringField, ); DIImportedEntity : "!DIImportedEntity" "(" DIImportedEntityFields ")" ; DIImportedEntityFields : empty | DIImportedEntityFieldList ; DIImportedEntityFieldList : DIImportedEntityField | DIImportedEntityFieldList "," DIImportedEntityField ; DIImportedEntityField : TagField | ScopeField | "entity:" MDField | FileField | LineField | NameField ; // ~~~ [ DIMacro ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#dimacro // ref: ParseDIMacro // // ::= !DIMacro(macinfo: type, line: 9, name: "SomeMacro", value: "SomeValue") // // REQUIRED(type, DwarfMacinfoTypeField, ); // OPTIONAL(line, LineField, ); // REQUIRED(name, MDStringField, ); // OPTIONAL(value, MDStringField, ); DIMacro : "!DIMacro" "(" DIMacroFields ")" ; DIMacroFields : empty | DIMacroFieldList ; DIMacroFieldList : DIMacroField | DIMacroFieldList "," DIMacroField ; DIMacroField : TypeMacinfoField | LineField | NameField | "value:" StringLit ; // ~~~ [ DIMacroFile ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // https://llvm.org/docs/LangRef.html#dimacrofile // ref: ParseDIMacroFile // // ::= !DIMacroFile(line: 9, file: !2, nodes: !3) // // OPTIONAL(type, DwarfMacinfoTypeField, (dwarf::DW_MACINFO_start_file)); // OPTIONAL(line, LineField, ); // REQUIRED(file, MDField, ); // OPTIONAL(nodes, MDField, ); DIMacroFile : "!DIMacroFile" "(" DIMacroFileFields ")" ; DIMacroFileFields : empty | DIMacroFileFieldList ; DIMacroFileFieldList : DIMacroFileField | DIMacroFileFieldList "," DIMacroFileField ; DIMacroFileField : TypeMacinfoField | LineField | FileField | "nodes:" MDField ; // ~~~ [ GenericDINode ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ref: ParseGenericDINode // // ::= !GenericDINode(tag: 15, header: "...", operands: {...}) // // REQUIRED(tag, DwarfTagField, ); // OPTIONAL(header, MDStringField, ); // OPTIONAL(operands, MDFieldList, ); GenericDINode : "!GenericDINode" "(" GenericDINodeFields ")" ; GenericDINodeFields : empty | GenericDINodeFieldList ; GenericDINodeFieldList : GenericDINodeField | GenericDINodeFieldList "," GenericDINodeField ; GenericDINodeField : TagField | "header:" StringLit | "operands:" MDFields ; // ### [ Helper productions ] ################################################## FileField : "file:" MDField ; IsOptimizedField : "isOptimized:" BoolLit ; TagField : "tag:" DwarfTag ; NameField : "name:" StringLit ; SizeField : "size:" IntLit ; AlignField : "align:" IntLit ; FlagsField : "flags:" DIFlagList ; LineField : "line:" IntLit ; ScopeField : "scope:" MDField ; BaseTypeField : "baseType:" MDField ; OffsetField : "offset:" IntLit ; TemplateParamsField : "templateParams:" MDField ; // ref: ParseMDField(MDSignedOrMDField &) IntOrMDField : int_lit | MDField ; TypeField : "type:" MDField ; LinkageNameField : "linkageName:" StringLit ; IsLocalField : "isLocal:" BoolLit ; IsDefinitionField : "isDefinition:" BoolLit ; DeclarationField : "declaration:" MDField ; ColumnField : "column:" IntLit ; TypeMacinfoField : "type:" DwarfMacinfo ; ChecksumKind // CSK_foo : checksum_kind ; // ref: ParseMDField(DIFlagField &) // // ::= uint32 // ::= DIFlagVector // ::= DIFlagVector '|' DIFlagFwdDecl '|' uint32 '|' DIFlagPublic DIFlagList : DIFlag | DIFlagList "|" DIFlag ; DIFlag : IntLit // DIFlagFoo | di_flag ; // ref: ParseMDField(DwarfAttEncodingField &) DwarfAttEncoding : IntLit // DW_ATE_foo | dwarf_att_encoding ; // ref: ParseMDField(DwarfCCField &Result) DwarfCC : IntLit // DW_CC_foo | dwarf_cc ; // ref: ParseMDField(DwarfLangField &) DwarfLang : IntLit // DW_LANG_foo | dwarf_lang ; // ref: ParseMDField(DwarfMacinfoTypeField &) DwarfMacinfo : IntLit // DW_MACINFO_foo | dwarf_macinfo ; DwarfOp // DW_OP_foo : dwarf_op ; // ref: ParseMDField(DwarfTagField &) DwarfTag : IntLit // DW_TAG_foo | dwarf_tag ; // ref: ParseMDField(DwarfVirtualityField &) DwarfVirtuality : IntLit // DW_VIRTUALITY_foo | dwarf_virtuality ; EmissionKind : IntLit | "FullDebug" | "LineTablesOnly" | "NoDebug" ; // ### [ Helper productions ] ################################################## TypeValues : empty | TypeValueList ; TypeValueList : TypeValue | TypeValueList TypeValue ; CommaSepTypeValueList : TypeValue | CommaSepTypeValueList "," TypeValue ; TypeValue : Type Value ; TypeConsts : empty | TypeConstList ; TypeConstList : TypeConst | TypeConstList "," TypeConst ; TypeConst : Type Constant ; // ref: ParseOptionalAlignment // // ::= empty // ::= 'align' 4 Alignment : "align" int_lit ; // ref: parseAllocSizeArguments AllocSize : "allocsize" "(" int_lit ")" | "allocsize" "(" int_lit "," int_lit ")" ; // ref: ParseParameterList // // ::= '(' ')' // ::= '(' Arg (',' Arg)* ')' // Arg // ::= Type OptionalAttributes Value OptionalAttributes Args : empty | "..." | ArgList | ArgList "," "..." ; ArgList : Arg | ArgList "," Arg ; // ref: ParseMetadataAsValue // // ::= metadata i32 %local // ::= metadata i32 @global // ::= metadata i32 7 // ::= metadata !0 // ::= metadata !{...} // ::= metadata !"string" Arg : ConcreteType ParamAttrs Value | MetadataType Metadata ; // ref: ParseOrdering // // ::= AtomicOrdering AtomicOrdering : "acq_rel" | "acquire" | "monotonic" | "release" | "seq_cst" | "unordered" ; // ref: ParseOptionalCallingConv // // ::= empty // ::= 'ccc' // ::= 'fastcc' // ::= 'intel_ocl_bicc' // ::= 'coldcc' // ::= 'x86_stdcallcc' // ::= 'x86_fastcallcc' // ::= 'x86_thiscallcc' // ::= 'x86_vectorcallcc' // ::= 'arm_apcscc' // ::= 'arm_aapcscc' // ::= 'arm_aapcs_vfpcc' // ::= 'msp430_intrcc' // ::= 'avr_intrcc' // ::= 'avr_signalcc' // ::= 'ptx_kernel' // ::= 'ptx_device' // ::= 'spir_func' // ::= 'spir_kernel' // ::= 'x86_64_sysvcc' // ::= 'win64cc' // ::= 'webkit_jscc' // ::= 'anyregcc' // ::= 'preserve_mostcc' // ::= 'preserve_allcc' // ::= 'ghccc' // ::= 'swiftcc' // ::= 'x86_intrcc' // ::= 'hhvmcc' // ::= 'hhvm_ccc' // ::= 'cxx_fast_tlscc' // ::= 'amdgpu_vs' // ::= 'amdgpu_ls' // ::= 'amdgpu_hs' // ::= 'amdgpu_es' // ::= 'amdgpu_gs' // ::= 'amdgpu_ps' // ::= 'amdgpu_cs' // ::= 'amdgpu_kernel' // ::= 'cc' UINT OptCallingConv : empty | CallingConv ; CallingConv : "amdgpu_cs" | "amdgpu_es" | "amdgpu_gs" | "amdgpu_hs" | "amdgpu_kernel" | "amdgpu_ls" | "amdgpu_ps" | "amdgpu_vs" | "anyregcc" | "arm_aapcs_vfpcc" | "arm_aapcscc" | "arm_apcscc" | "avr_intrcc" | "avr_signalcc" | "ccc" | "coldcc" | "cxx_fast_tlscc" | "fastcc" | "ghccc" | "hhvm_ccc" | "hhvmcc" | "intel_ocl_bicc" | "msp430_intrcc" | "preserve_allcc" | "preserve_mostcc" | "ptx_device" | "ptx_kernel" | "spir_func" | "spir_kernel" | "swiftcc" | "webkit_jscc" | "win64cc" | "x86_64_sysvcc" | "x86_fastcallcc" | "x86_intrcc" | "x86_regcallcc" | "x86_stdcallcc" | "x86_thiscallcc" | "x86_vectorcallcc" | "cc" int_lit ; // ref: parseOptionalComdat OptComdat : empty | Comdat ; Comdat : "comdat" | "comdat" "(" ComdatName ")" ; Dereferenceable : "dereferenceable" "(" int_lit ")" | "dereferenceable_or_null" "(" int_lit ")" ; // https://llvm.org/docs/LangRef.html#dll-storage-classes // ref: ParseOptionalDLLStorageClass // // ::= empty // ::= 'dllimport' // ::= 'dllexport' OptDLLStorageClass : empty | DLLStorageClass ; DLLStorageClass : "dllexport" | "dllimport" ; OptExact : empty | "exact" ; // ref: ParseExceptionArgs ExceptionArgs : empty | ExceptionArgList ; ExceptionArgList : ExceptionArg | ExceptionArgList "," ExceptionArg ; ExceptionArg : ConcreteType Value | MetadataType Metadata ; ExceptionScope : NoneConst | LocalIdent ; // ref: EatFastMathFlagsIfPresent FastMathFlags : empty | FastMathFlagList ; FastMathFlagList : FastMathFlag | FastMathFlagList FastMathFlag ; FastMathFlag : "afn" | "arcp" | "contract" | "fast" | "ninf" | "nnan" | "nsz" | "reassoc" ; // ref: ParseCmpPredicate FPred : "false" | "oeq" | "oge" | "ogt" | "ole" | "olt" | "one" | "ord" | "true" | "ueq" | "uge" | "ugt" | "ule" | "ult" | "une" | "uno" ; // ___ [ Function Attribute ] __________________________________________________ // ref: ParseFnAttributeValuePairs // // ::= <attr> | <attr> '=' <value> FuncAttrs : empty | FuncAttrList ; FuncAttrList : FuncAttr | FuncAttrList FuncAttr ; FuncAttr // not used in attribute groups. : AttrGroupID // used in attribute groups. | "align" "=" int_lit | "alignstack" "=" int_lit // used in functions. | Alignment | AllocSize | StackAlignment | StringLit | StringLit "=" StringLit | "alwaysinline" | "argmemonly" | "builtin" | "cold" | "convergent" | "inaccessiblemem_or_argmemonly" | "inaccessiblememonly" | "inlinehint" | "jumptable" | "minsize" | "naked" | "nobuiltin" | "noduplicate" | "noimplicitfloat" | "noinline" | "nonlazybind" | "norecurse" | "noredzone" | "noreturn" | "nounwind" | "optnone" | "optsize" | "readnone" | "readonly" | "returns_twice" | "safestack" | "sanitize_address" | "sanitize_hwaddress" | "sanitize_memory" | "sanitize_thread" | "speculatable" | "ssp" | "sspreq" | "sspstrong" | "strictfp" | "uwtable" | "writeonly" ; OptInBounds : empty | "inbounds" ; // ref: ParseIndexList // // ::= (',' uint32)+ Indices : empty | "," IndexList ; IndexList : Index | IndexList "," Index ; Index : int_lit ; // ref: ParseCmpPredicate IPred : "eq" | "ne" | "sge" | "sgt" | "sle" | "slt" | "uge" | "ugt" | "ule" | "ult" ; // https://llvm.org/docs/LangRef.html#linkage-types // ref: ParseOptionalLinkage // // ::= empty // ::= 'private' // ::= 'internal' // ::= 'weak' // ::= 'weak_odr' // ::= 'linkonce' // ::= 'linkonce_odr' // ::= 'available_externally' // ::= 'appending' // ::= 'common' // ::= 'extern_weak' // ::= 'external' OptLinkage : empty | Linkage ; Linkage : "appending" | "available_externally" | "common" | "internal" | "linkonce" | "linkonce_odr" | "private" | "weak" | "weak_odr" ; OptExternLinkage : empty | ExternLinkage ; ExternLinkage : "extern_weak" | "external" ; // ref: ParseOptionalOperandBundles // // ::= empty // ::= '[' OperandBundle [, OperandBundle ]* ']' // // OperandBundle // ::= bundle-tag '(' ')' // ::= bundle-tag '(' Type Value [, Type Value ]* ')' // // bundle-tag ::= String Constant OperandBundles : empty | "[" OperandBundleList "]" ; OperandBundleList : OperandBundle | OperandBundleList OperandBundle ; OperandBundle : StringLit "(" TypeValues ")" ; OverflowFlags : empty | OverflowFlagList ; OverflowFlagList : OverflowFlag | OverflowFlagList OverflowFlag ; OverflowFlag : "nsw" | "nuw" ; // ___ [ Parameter Attribute ] _________________________________________________ // ref: ParseOptionalParamAttrs ParamAttrs : empty | ParamAttrList ; ParamAttrList : ParamAttr | ParamAttrList ParamAttr ; // ref: ParseOptionalDerefAttrBytes // // ::= empty // ::= AttrKind '(' 4 ')' ParamAttr : Alignment | Dereferenceable | StringLit | "byval" | "inalloca" | "inreg" | "nest" | "noalias" | "nocapture" | "nonnull" | "readnone" | "readonly" | "returned" | "signext" | "sret" | "swifterror" | "swiftself" | "writeonly" | "zeroext" ; // ref: ParseArgumentList // // ::= '(' ArgTypeListI ')' // ArgTypeListI // ::= empty // ::= '...' // ::= ArgTypeList ',' '...' // ::= ArgType (',' ArgType)* Params : empty | "..." | ParamList | ParamList "," "..." ; ParamList : Param | ParamList "," Param ; Param : Type ParamAttrs | Type ParamAttrs LocalIdent ; // https://llvm.org/docs/LangRef.html#runtime-preemption-model // ref: ParseOptionalDSOLocal OptPreemptionSpecifier : empty | PreemptionSpecifier ; PreemptionSpecifier : "dso_local" | "dso_preemptable" ; // ___ [ Return Attribute ] __________________________________________________ // ref: ParseOptionalReturnAttrs ReturnAttrs : empty | ReturnAttrList ; ReturnAttrList : ReturnAttr | ReturnAttrList ReturnAttr ; ReturnAttr : Alignment | Dereferenceable | StringLit | "inreg" | "noalias" | "nonnull" | "signext" | "zeroext" ; OptSection : empty | Section ; Section : "section" StringLit ; // ref: ParseOptionalStackAlignment // // ::= empty // ::= 'alignstack' '(' 4 ')' StackAlignment : "alignstack" "(" int_lit ")" ; // ref: ParseScope // // ::= syncscope("singlethread" | "<target scope>")? OptSyncScope : empty | "syncscope" "(" StringLit ")" ; // ref: ParseOptionalThreadLocal // // := empty // := 'thread_local' // := 'thread_local' '(' tlsmodel ')' OptThreadLocal : empty | ThreadLocal ; ThreadLocal : "thread_local" | "thread_local" "(" TLSModel ")" ; // ref: ParseTLSModel // // := 'localdynamic' // := 'initialexec' // := 'localexec' TLSModel : "initialexec" | "localdynamic" | "localexec" ; // ref: ParseOptionalUnnamedAddr OptUnnamedAddr : empty | UnnamedAddr ; UnnamedAddr : "local_unnamed_addr" | "unnamed_addr" ; // https://llvm.org/docs/LangRef.html#visibility-styles // ref: ParseOptionalVisibility // // ::= empty // ::= 'default' // ::= 'hidden' // ::= 'protected' OptVisibility : empty | Visibility ; Visibility : "default" | "hidden" | "protected" ; OptVolatile : empty | "volatile" ;