antlr / grammars-v4

Grammars written for ANTLR v4; expectation that the grammars are free of actions.
MIT License
10.13k stars 3.69k forks source link

Fix asm grammars #2808

Open kaby76 opened 2 years ago

kaby76 commented 2 years ago

With the recent port to Antlr 4.11.1, we discovered a couple of the grammars required some tweaking. But, as noted here, we can simplify the asm8080 grammar further.

We should perform a general "clean-up" of the "asm" grammars.

I would:

Note, I don't like the Antlr4Formatter formatting standard. I would format rules one per line. Also, instead of sorting parser rules apparently by functionality, I would sort alphabetically, which would allow for fast navigation through the grammar by eyeball.

KvanTTT commented 2 years ago

Also, instead of sorting parser rules apparently by functionality, I would sort alphabetically, which would allow for fast navigation through the grammar by eyeball.

I don't think it's a good idea to sort alphabetically, I vote for topological sorting (if A uses B then B should be placed below A). The similar sorting is used for sorting functions in programming languages.

kaby76 commented 2 years ago
kaby76 commented 2 years ago

_ascii_letter_upper : 'A' - 'Z' ;

_ascii_letter_lower : 'a' - 'z' ;

_ascii_letter : _ascii_letter_upper | _ascii_letter_lower ;

_letter : _asciiletter | '$' | '-' | '.' | '' ;

_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 dwarftag : 'D' 'W' '' 'T' 'A' 'G' '_' { _ascii_letter | _decimaldigit | '' } ;

// DW_ATE_foo dwarf_attencoding : 'D' 'W' '' 'A' 'T' 'E' '_' { _ascii_letter | _decimaldigit | '' } ;

// DIFlagFoo di_flag : 'D' 'I' 'F' 'l' 'a' 'g' { _ascii_letter | _decimaldigit | '' } ;

// DW_LANG_foo dwarflang : 'D' 'W' '' 'L' 'A' 'N' 'G' '_' { _ascii_letter | _decimaldigit | '' } ;

// DW_CC_foo dwarfcc : 'D' 'W' '' 'C' 'C' '_' { _ascii_letter | _decimaldigit | '' } ;

// CSK_foo checksumkind : 'C' 'S' 'K' '' { _ascii_letter | _decimaldigit | '' } ;

// DW_VIRTUALITY_foo dwarfvirtuality : 'D' 'W' '' 'V' 'I' 'R' 'T' 'U' 'A' 'L' 'I' 'T' 'Y' '_' { _ascii_letter | _decimaldigit | '' } ;

// DW_MACINFO_foo dwarfmacinfo : 'D' 'W' '' 'M' 'A' 'C' 'I' 'N' 'F' 'O' '_' { _ascii_letter | _decimaldigit | '' } ;

// DW_OP_foo dwarfop : 'D' 'W' '' 'O' 'P' '_' { _ascii_letter | _decimaldigit | '' } ;

// === [ 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 // // ::= | '='

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" | "")?

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" ;

teverett commented 2 years ago

A couple comments:

teverett commented 2 years ago

@kaby76 I encourage you to submit ptx and llvm :)

kaby76 commented 2 years ago

If anyone wants to add in the ptx and llvm grammars, feel free to do so. I'll add them at some point when I get a chance.

kaby76 commented 2 years ago

For fast, automated conversion of the llvm "bnf" (this is NOT a BNF, but an EBNF), the Antlr grammar to parse it is:

grammar ebnf;
alternative : element* ;
alternatives : alternative (BAR alternative)* ;
element : optional_ | repetition | grouping | range | STRING | CHAR | id_ | DOT ;
grouping : LPAREN alternatives RPAREN ;
id_ : ruleid ;
lhs : NOT? id_ ;
optional_ : LEND alternatives REND ;
range : CHAR MINUS CHAR ;
repetition : LBRACE alternatives RBRACE ;
rhs : alternatives ;
rule_ : lhs ASSIGN rhs SEMI ;
ruleid : ID ;
rulelist : rule_* EOF ;
ASSIGN : ':' ;
BAR : '|' ;
CHAR : '\'' ~'\''* '\'' ;
COMMENT : '//' ~[\n\r]* -> channel(HIDDEN) ;
DOT : '.' ;
ID : ('a'..'z'|'A'..'Z'|'0'..'9'|'-'|'_')+ ;
LBRACE : '{' ;
LEND : '[' ;
LPAREN : '(' ;
MINUS : '-' ;
NOT : '!' ;
RBRACE : '}' ;
REND : ']' ;
RPAREN : ')' ;
SEMI : ';' ;
STRING : '"' ~'"'* '"' ;
WS : [ \r\n\t] -> skip ;