From 890c31cfccaa17c9a99a66831018613834dd34a1 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Thu, 22 May 2008 22:45:03 +0000 Subject: [PATCH] Add a polygen grammar definition for LLVM assembly language. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@51449 91177308-0d34-0410-b5e6-96231b3b80d8 --- utils/llvm.grm | 376 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 376 insertions(+) create mode 100644 utils/llvm.grm diff --git a/utils/llvm.grm b/utils/llvm.grm new file mode 100644 index 00000000000..8a2ce0dfb53 --- /dev/null +++ b/utils/llvm.grm @@ -0,0 +1,376 @@ +(* + +polygen grammar for LLVM assembly language. + +This file defines an LLVM assembly language grammar for polygen, +which is a tool for generating random text based on a grammar. +It is strictly syntax-based, and makes no attempt to generate +IR that is semantically valid. Most of the IR produced doesn't +pass the Verifier. + +*) + +I ::= "title: LLVM assembly language\n" + ^ "status: experimental\n" + ^ "audience: LLVM developers\n" +; + +S ::= Module ; + +(* +Define rules for non-keyword tokens. This is currently just a bunch +of hacks. They don't cover many valid forms of tokens, and they also +generate some invalid forms of tokens. The LLVM parser has custom +C++ code to lex these; custom C++ code for emitting them would be +convenient, but polygen doesn't support that. +*) +NonZeroDecimalDigit ::= 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 ; +DecimalDigit ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 ; +DecimalDigitSeq ::= DecimalDigit [^ DecimalDigitSeq ]; +HexDigit ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 + | a | b | c | d | e | f ; +HexDigitSeq ::= HexDigit [^ HexDigitSeq ]; +StringChar ::= a | b | c | d | e | f | g | h | i | j | k | l | m + | n | o | p | q | r | s | t | u | v | w | x | y | z ; +StringConstantSeq ::= StringChar [^ StringConstantSeq ]; +StringConstant ::= StringChar [^ StringConstantSeq ]; +EUINT64VAL ::= NonZeroDecimalDigit [^ DecimalDigitSeq ]; +ESINT64VAL ::= [ "-" ] ^ EUINT64VAL ; +EUAPINTVAL ::= EUINT64VAL ; +ESAPINTVAL ::= ESINT64VAL ; +LOCALVALID ::= "%" ^ DecimalDigitSeq ; +GLOBALVALID ::= "@" ^ DecimalDigitSeq ; +INTTYPE ::= "i" ^ EUINT64VAL ; +GLOBALVAR ::= "@" ^ StringConstant ; +LOCALVAR ::= "%" ^ StringConstant ; +STRINGCONSTANT ::= "\"" ^ StringConstant ^ "\"" ; +ATSTRINGCONSTANT ::= "@" ^ STRINGCONSTANT ; +PCTSTRINGCONSTANT ::= "%" ^ STRINGCONSTANT ; +LABELSTR ::= StringConstant ; +FPVAL ::= ESAPINTVAL ^ "." ^ EUAPINTVAL | "0x" ^ HexDigitSeq ; + +(* +The rest of this file is derived directly from llvmAsmParser.y. +*) + +ArithmeticOps ::= add | sub | mul | udiv | sdiv | fdiv | urem | srem | frem ; +LogicalOps ::= shl | lshr | ashr | and | or | xor; +CastOps ::= trunc | zext | sext | fptrunc | fpext | bitcast | + uitofp | sitofp | fptoui | fptosi | inttoptr | ptrtoint ; + +IPredicates ::= eq | ne | slt | sgt | sle | sge | ult | ugt | ule | uge ; + +FPredicates ::= oeq | one | olt | ogt | ole | oge | ord | uno | ueq | une + | ult | ugt | ule | uge | true | false ; + +IntType ::= INTTYPE; +FPType ::= float | double | "ppc_fp128" | fp128 | "x86_fp80"; + +LocalName ::= LOCALVAR | STRINGCONSTANT | PCTSTRINGCONSTANT ; +OptLocalName ::= LocalName | _ ; + +OptAddrSpace ::= - addrspace "(" ^ EUINT64VAL ^ ")" | _ ; + +OptLocalAssign ::= LocalName "=" | _ ; + +GlobalName ::= GLOBALVAR | ATSTRINGCONSTANT ; + +OptGlobalAssign ::= GlobalAssign | _ ; + +GlobalAssign ::= GlobalName "=" ; + +GVInternalLinkage + ::= + internal + | weak + | linkonce + | appending + | dllexport + | common + ; + +GVExternalLinkage + ::= dllimport + | "extern_weak" + | + external + ; + +GVVisibilityStyle + ::= + _ + | default + | hidden + | protected + ; + +FunctionDeclareLinkage + ::= + _ + | dllimport + | "extern_weak" + ; + +FunctionDefineLinkage + ::= + _ + | internal + | linkonce + | weak + | dllexport + ; + +AliasLinkage ::= + _ | weak | internal ; + +OptCallingConv ::= + _ | + ccc | + fastcc | + coldcc | + "x86_stdcallcc" | + "x86_fastcallcc" | + cc EUINT64VAL ; + +ParamAttr ::= zeroext + | zext + | signext + | sext + | inreg + | sret + | noalias + | byval + | nest + | align EUINT64VAL + ; + +OptParamAttrs ::= + _ | OptParamAttrs ParamAttr ; + +FuncAttr ::= noreturn + | nounwind + | zeroext + | signext + | readnone + | readonly + ; + +OptFuncAttrs ::= + _ | OptFuncAttrs FuncAttr ; + +OptGC ::= + _ | gc STRINGCONSTANT ; + +OptAlign ::= + _ | align EUINT64VAL ; +OptCAlign ::= + _ | ^ "," align EUINT64VAL ; + +SectionString ::= section STRINGCONSTANT ; + +OptSection ::= + _ | SectionString ; + +GlobalVarAttributes ::= + _ | ^ "," GlobalVarAttribute GlobalVarAttributes ; +GlobalVarAttribute ::= SectionString | align EUINT64VAL ; + +PrimType ::= INTTYPE | float | double | "ppc_fp128" | fp128 | "x86_fp80" + | - label ; + +Types + ::= opaque + | PrimType + | Types OptAddrSpace ^ "*" + | SymbolicValueRef + | "\\" ^ EUINT64VAL + | Types "(" ^ ArgTypeListI ^ ")" OptFuncAttrs + | void "(" ^ ArgTypeListI ^ ")" OptFuncAttrs + | "[" ^ EUINT64VAL "x" Types ^ "]" + | "<" ^ EUINT64VAL "x" Types ^ ">" + | "{" TypeListI "}" + | "{" "}" + | "<" ^ "{" TypeListI "}" ^ ">" + | "<" ^ "{" "}" ^ ">" + ; + +ArgType ::= Types OptParamAttrs ; + +ResultTypes ::= Types | void ; + +ArgTypeList ::= ArgType | ArgTypeList ^ "," ArgType ; + +ArgTypeListI ::= ArgTypeList | ArgTypeList ^ "," "..." | "..." | _ ; + +TypeListI ::= Types | TypeListI ^ "," Types ; + +ConstVal::= Types "[" ^ ConstVector ^ "]" + | Types "[" "]" + | Types "c" ^ STRINGCONSTANT + | Types "<" ^ ConstVector ^ ">" + | Types "{" ConstVector "}" + | Types "{" "}" + | Types "<" ^ "{" ConstVector "}" ^ ">" + | Types "<" ^ "{" "}" ^ ">" + | Types null + | Types undef + | Types SymbolicValueRef + | Types ConstExpr + | Types zeroinitializer + | IntType ESINT64VAL + | IntType ESAPINTVAL + | IntType EUINT64VAL + | IntType EUAPINTVAL + | INTTYPE true + | INTTYPE false + | FPType FPVAL ; + +ConstExpr::= CastOps "(" ^ ConstVal to Types ^ ")" + | getelementptr "(" ^ ConstVal IndexList ^ ")" + | select "(" ^ ConstVal ^ "," ConstVal ^ "," ConstVal ^ ")" + | ArithmeticOps "(" ^ ConstVal ^ "," ConstVal ^ ")" + | LogicalOps "(" ^ ConstVal ^ "," ConstVal ^ ")" + | icmp IPredicates "(" ^ ConstVal ^ "," ConstVal ^ ")" + | fcmp FPredicates "(" ^ ConstVal ^ "," ConstVal ^ ")" + | vicmp IPredicates "(" ^ ConstVal ^ "," ConstVal ^ ")" + | vfcmp FPredicates "(" ^ ConstVal ^ "," ConstVal ^ ")" + | extractelement "(" ^ ConstVal ^ "," ConstVal ^ ")" + | insertelement "(" ^ ConstVal ^ "," ConstVal ^ "," ConstVal ^ ")" + | shufflevector "(" ^ ConstVal ^ "," ConstVal ^ "," ConstVal ^ ")" ; + +ConstVector ::= ConstVector ^ "," ConstVal | ConstVal ; + +GlobalType ::= global | constant ; + +ThreadLocal ::= - "thread_local" | _ ; + +AliaseeRef ::= ResultTypes SymbolicValueRef + | bitcast "(" ^ AliaseeRef to Types ^ ")" ; + +Module ::= +++ DefinitionList | --- _ ; + +DefinitionList ::= - Definition | + DefinitionList Definition ; + +Definition + ::= ^ ( +++++ define Function + | declare FunctionProto + | - module asm AsmBlock + | OptLocalAssign type Types + | OptLocalAssign type void + | OptGlobalAssign GVVisibilityStyle ThreadLocal GlobalType ConstVal + OptAddrSpace GlobalVarAttributes + | OptGlobalAssign GVInternalLinkage GVVisibilityStyle ThreadLocal GlobalType + ConstVal OptAddrSpace GlobalVarAttributes + | OptGlobalAssign GVExternalLinkage GVVisibilityStyle ThreadLocal GlobalType + Types OptAddrSpace GlobalVarAttributes + | OptGlobalAssign GVVisibilityStyle alias AliasLinkage AliaseeRef + | target TargetDefinition + | deplibs "=" LibrariesDefinition + ) ^ "\n"; + +AsmBlock ::= STRINGCONSTANT ; + +TargetDefinition ::= triple "=" STRINGCONSTANT + | datalayout "=" STRINGCONSTANT ; + +LibrariesDefinition ::= "[" LibList "]"; + +LibList ::= LibList ^ "," STRINGCONSTANT | STRINGCONSTANT | _ ; + +ArgListH ::= ArgListH ^ "," Types OptParamAttrs OptLocalName + | Types OptParamAttrs OptLocalName ; + +ArgList ::= ArgListH | ArgListH ^ "," "..." | "..." | _ ; + +FunctionHeaderH ::= OptCallingConv ResultTypes GlobalName "(" ^ ArgList ^ ")" + OptFuncAttrs OptSection OptAlign OptGC ; + +BEGIN ::= ( begin | "{" ) ^ "\n"; + +FunctionHeader ::= + FunctionDefineLinkage GVVisibilityStyle FunctionHeaderH BEGIN ; + +END ::= ^ ( end | "}" ) ^ "\n"; + +Function ::= BasicBlockList END ; + +FunctionProto ::= FunctionDeclareLinkage GVVisibilityStyle FunctionHeaderH ; + +OptSideEffect ::= _ | sideeffect ; + +ConstValueRef ::= ESINT64VAL + | EUINT64VAL + | FPVAL + | true + | false + | null + | undef + | zeroinitializer + | "<" ConstVector ">" + | ConstExpr + | asm OptSideEffect STRINGCONSTANT ^ "," STRINGCONSTANT ; + +SymbolicValueRef ::= LOCALVALID + | GLOBALVALID + | LocalName + | GlobalName ; + +ValueRef ::= SymbolicValueRef | ConstValueRef; + +ResolvedVal ::= Types ValueRef ; + +ReturnedVal ::= ResolvedVal | ReturnedVal ^ "," ResolvedVal ; + +BasicBlockList ::= BasicBlockList BasicBlock | FunctionHeader BasicBlock ; + +BasicBlock ::= InstructionList OptLocalAssign BBTerminatorInst ; + +InstructionList ::= +++ InstructionList Inst + | - _ + | ^ LABELSTR ^ ":\n" ; + +BBTerminatorInst ::= ^ " " ^ + ( ret ReturnedVal + | ret void + | br label ValueRef + | br INTTYPE ValueRef ^ "," label ValueRef ^ "," label ValueRef + | switch IntType ValueRef ^ "," label ValueRef "[" JumpTable "]" + | switch IntType ValueRef ^ "," label ValueRef "[" "]" + | invoke OptCallingConv ResultTypes ValueRef "(" ^ ParamList ^ ")" OptFuncAttrs + to label ValueRef unwind label ValueRef + | unwind + | unreachable ) ^ "\n"; + +JumpTable ::= JumpTable IntType ConstValueRef ^ "," label ValueRef + | IntType ConstValueRef ^ "," label ValueRef ; + +Inst ::= ^ " " ^ OptLocalAssign InstVal ^ "\n"; + +PHIList ::= Types "[" ValueRef ^ "," ValueRef "]" + | PHIList ^ "," "[" ValueRef ^ "," ValueRef "]" ; + +ParamList ::= Types OptParamAttrs ValueRef OptParamAttrs + | label OptParamAttrs ValueRef OptParamAttrs + | ParamList ^ "," Types OptParamAttrs ValueRef OptParamAttrs + | ParamList ^ "," label OptParamAttrs ValueRef OptParamAttrs + | - _ ; + +IndexList ::= _ | IndexList ^ "," ResolvedVal ; + +OptTailCall ::= tail call | call ; + +InstVal ::= + ArithmeticOps Types ValueRef ^ "," ValueRef + | LogicalOps Types ValueRef ^ "," ValueRef + | icmp IPredicates Types ValueRef ^ "," ValueRef + | fcmp FPredicates Types ValueRef ^ "," ValueRef + | vicmp IPredicates Types ValueRef ^ "," ValueRef + | vfcmp FPredicates Types ValueRef ^ "," ValueRef + | CastOps ResolvedVal to Types + | select ResolvedVal ^ "," ResolvedVal ^ "," ResolvedVal + | vaarg ResolvedVal ^ "," Types + | extractelement ResolvedVal ^ "," ResolvedVal + | insertelement ResolvedVal ^ "," ResolvedVal ^ "," ResolvedVal + | shufflevector ResolvedVal ^ "," ResolvedVal ^ "," ResolvedVal + | phi PHIList + | OptTailCall OptCallingConv ResultTypes ValueRef "(" ^ ParamList ^ ")" + OptFuncAttrs + | MemoryInst ; + +OptVolatile ::= - volatile | _ ; + +MemoryInst ::= malloc Types OptCAlign + | malloc Types ^ "," INTTYPE ValueRef OptCAlign + | alloca Types OptCAlign + | alloca Types ^ "," INTTYPE ValueRef OptCAlign + | free ResolvedVal + | OptVolatile load Types ValueRef OptCAlign + | OptVolatile store ResolvedVal ^ "," Types ValueRef OptCAlign + | getresult Types ValueRef ^ "," EUINT64VAL + | getelementptr Types ValueRef IndexList ;