mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-30 16:17:05 +00:00 
			
		
		
		
	Problem: LLVM needs more function attributes than currently available (32 bits). One such proposed attribute is "address_safety", which shows that a function is being checked for address safety (by AddressSanitizer, SAFECode, etc). Solution: - extend the Attributes from 32 bits to 64-bits - wrap the object into a class so that unsigned is never erroneously used instead - change "unsigned" to "Attributes" throughout the code, including one place in clang. - the class has no "operator uint64 ()", but it has "uint64_t Raw() " to support packing/unpacking. - the class has "safe operator bool()" to support the common idiom: if (Attributes attr = getAttrs()) useAttrs(attr); - The CTOR from uint64_t is marked explicit, so I had to add a few explicit CTOR calls - Add the new attribute "address_safety". Doing it in the same commit to check that attributes beyond first 32 bits actually work. - Some of the functions from the Attribute namespace are worth moving inside the class, but I'd prefer to have it as a separate commit. Tested: "make check" on Linux (32-bit and 64-bit) and Mac (10.6) built/run spec CPU 2006 on Linux with clang -O2. This change will break clang build in lib/CodeGen/CGCall.cpp. The following patch will fix it. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@148553 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			422 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			422 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| (*
 | |
| 
 | |
| 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.
 | |
| 
 | |
| TODO: Metadata, in all its forms
 | |
| 
 | |
| *)
 | |
| 
 | |
| 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 ::= + OptNW add | fadd | OptNW sub | fsub | OptNW mul | fmul |
 | |
|                   udiv | OptExact 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
 | |
|  | "weak_odr"
 | |
|  | linkonce
 | |
|  | "linkonce_odr"
 | |
|  | appending
 | |
|  | dllexport
 | |
|  | common
 | |
|  | private
 | |
|  | "linker_private"
 | |
|  | "linker_private_weak"
 | |
|  ;
 | |
| 
 | |
| GVExternalLinkage
 | |
|   ::= dllimport
 | |
|  | "extern_weak"
 | |
|  | + external
 | |
|  ;
 | |
| 
 | |
| GVVisibilityStyle
 | |
|   ::= + _
 | |
|  | default
 | |
|  | hidden
 | |
|  | protected
 | |
|  ;
 | |
| 
 | |
| FunctionDeclareLinkage
 | |
|   ::= + _
 | |
|  | dllimport
 | |
|  | "extern_weak"
 | |
|  ;
 | |
| 
 | |
| FunctionDefineLinkage
 | |
|   ::= + _
 | |
|  | internal
 | |
|  | linkonce
 | |
|  | "linkonce_odr"
 | |
|  | weak
 | |
|  | "weak_odr"
 | |
|  | dllexport
 | |
|  ;
 | |
| 
 | |
| AliasLinkage ::= + _ | weak | "weak_odr" | internal ;
 | |
| 
 | |
| OptCallingConv ::= + _ |
 | |
|                  ccc |
 | |
|                  fastcc |
 | |
|                  coldcc |
 | |
|                  "x86_stdcallcc" |
 | |
|                  "x86_fastcallcc" |
 | |
|                  cc EUINT64VAL ;
 | |
| 
 | |
| ParamAttr ::= zeroext
 | |
|  | signext
 | |
|  | inreg
 | |
|  | sret
 | |
|  | noalias
 | |
|  | nocapture
 | |
|  | byval
 | |
|  | nest
 | |
|  | align EUINT64VAL
 | |
|  ;
 | |
| 
 | |
| OptParamAttrs ::= + _ | OptParamAttrs ParamAttr ;
 | |
| 
 | |
| RetAttr       ::= inreg
 | |
|               | zeroext
 | |
|               | signext
 | |
|               | noalias
 | |
|               ;
 | |
| 
 | |
| OptRetAttrs  ::= _
 | |
|              | OptRetAttrs RetAttr
 | |
|              ;
 | |
| 
 | |
| FuncAttr      ::= noreturn
 | |
|  | nounwind
 | |
|  | inreg
 | |
|  | zeroext
 | |
|  | signext
 | |
|  | readnone
 | |
|  | readonly
 | |
|  | inlinehint
 | |
|  | alignstack
 | |
|  | noinline
 | |
|  | alwaysinline
 | |
|  | optsize
 | |
|  | ssp
 | |
|  | sspreq
 | |
|  | returns_twice
 | |
|  | nonlazybind
 | |
|  | address_safety
 | |
|  ;
 | |
| 
 | |
| 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
 | |
|  | Types ESINT64VAL
 | |
|  | Types ESAPINTVAL
 | |
|  | Types EUINT64VAL
 | |
|  | Types EUAPINTVAL
 | |
|  | Types true
 | |
|  | Types false
 | |
|  | Types FPVAL ;
 | |
| 
 | |
| ConstExpr::= CastOps "(" ^ ConstVal to Types ^ ")"
 | |
|  | getelementptr OptInBounds "(" ^ ConstVal IndexList ^ ")"
 | |
|  | select "(" ^ ConstVal ^ "," ConstVal ^ "," ConstVal ^ ")"
 | |
|  | ArithmeticOps "(" ^ ConstVal ^ "," ConstVal ^ ")"
 | |
|  | LogicalOps "(" ^ ConstVal ^ "," ConstVal ^ ")"
 | |
|  | icmp IPredicates "(" ^ ConstVal ^ "," ConstVal ^ ")"
 | |
|  | fcmp FPredicates "(" ^ ConstVal ^ "," ConstVal ^ ")"
 | |
|  | extractelement "(" ^ ConstVal ^ "," ConstVal ^ ")"
 | |
|  | insertelement "(" ^ ConstVal ^ "," ConstVal ^ "," ConstVal ^ ")"
 | |
|  | shufflevector "(" ^ ConstVal ^ "," ConstVal ^ "," ConstVal ^ ")"
 | |
|  | extractvalue "(" ^ ConstVal ^ ConstantIndexList ^ ")"
 | |
|  | insertvalue "(" ^ ConstVal ^ "," ConstVal ^ ConstantIndexList ^ ")" ;
 | |
| 
 | |
| 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
 | |
|  | OptGlobalAssign GVVisibilityStyle ThreadLocal OptAddrSpace GlobalType
 | |
|    ConstVal GlobalVarAttributes
 | |
|  | OptGlobalAssign GVInternalLinkage GVVisibilityStyle ThreadLocal OptAddrSpace
 | |
|    GlobalType ConstVal GlobalVarAttributes
 | |
|  | OptGlobalAssign GVExternalLinkage GVVisibilityStyle ThreadLocal OptAddrSpace
 | |
|    GlobalType Types 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 OptRetAttrs 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 ">"
 | |
|  | "[" ConstVector "]"
 | |
|  | "[" ^ "]"
 | |
|  | "c" ^ STRINGCONSTANT
 | |
|  | "{" ConstVector "}"
 | |
|  | "{" ^ "}"
 | |
|  | "<" ^ "{" 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 ;
 | |
| 
 | |
| ConstantIndexList ::= "," EUINT64VAL | ConstantIndexList ^ "," EUINT64VAL ;
 | |
| 
 | |
| OptTailCall ::= tail call | call ;
 | |
| 
 | |
| InstVal ::=
 | |
|    ArithmeticOps Types ValueRef ^ "," ValueRef
 | |
|  | LogicalOps Types ValueRef ^ "," ValueRef
 | |
|  | icmp IPredicates Types ValueRef ^ "," ValueRef
 | |
|  | fcmp FPredicates Types ValueRef ^ "," ValueRef
 | |
|  | CastOps ResolvedVal to Types
 | |
|  | select ResolvedVal ^ "," ResolvedVal ^ "," ResolvedVal
 | |
|  | "va_arg" ResolvedVal ^ "," Types
 | |
|  | extractelement ResolvedVal ^ "," ResolvedVal
 | |
|  | insertelement ResolvedVal ^ "," ResolvedVal ^ "," ResolvedVal
 | |
|  | shufflevector ResolvedVal ^ "," ResolvedVal ^ "," ResolvedVal
 | |
|  | phi PHIList
 | |
|  | OptTailCall OptCallingConv ResultTypes ValueRef ^ "(" ^ ParamList ^ ")"
 | |
|    OptFuncAttrs
 | |
|  | MemoryInst ;
 | |
| 
 | |
| OptVolatile ::= - volatile | _ ;
 | |
| OptExact ::= - exact | _ ;
 | |
| OptNSW ::= - nsw | _ ;
 | |
| OptNUW ::= - nuw | _ ;
 | |
| OptNW  ::= OptNUW OptNSW | OptNSW OptNUW ;
 | |
| OptInBounds  ::= - inbounds | _ ;
 | |
| 
 | |
| 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 OptInBounds Types ValueRef IndexList
 | |
|  | extractvalue Types ValueRef ^ ConstantIndexList 
 | |
|  | insertvalue Types ValueRef ^ "," Types ValueRef ^ ConstantIndexList ;
 |