mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-26 21:32:10 +00:00
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
This commit is contained in:
parent
fdfef0da6b
commit
890c31cfcc
376
utils/llvm.grm
Normal file
376
utils/llvm.grm
Normal file
@ -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 ;
|
Loading…
Reference in New Issue
Block a user