+OptLinkage : INTERNAL { $$ = GlobalValue::InternalLinkage; } |
+ LINKONCE { $$ = GlobalValue::LinkOnceLinkage; } |
+ WEAK { $$ = GlobalValue::WeakLinkage; } |
+ APPENDING { $$ = GlobalValue::AppendingLinkage; } |
+ DLLIMPORT { $$ = GlobalValue::DLLImportLinkage; } |
+ DLLEXPORT { $$ = GlobalValue::DLLExportLinkage; } |
+ EXTERN_WEAK { $$ = GlobalValue::ExternalWeakLinkage; } |
+ /*empty*/ { $$ = GlobalValue::ExternalLinkage; };
+
+OptCallingConv : /*empty*/ { $$ = CallingConv::C; } |
+ CCC_TOK { $$ = CallingConv::C; } |
+ CSRETCC_TOK { $$ = CallingConv::CSRet; } |
+ FASTCC_TOK { $$ = CallingConv::Fast; } |
+ COLDCC_TOK { $$ = CallingConv::Cold; } |
+ X86_STDCALLCC_TOK { $$ = CallingConv::X86_StdCall; } |
+ X86_FASTCALLCC_TOK { $$ = CallingConv::X86_FastCall; } |
+ CC_TOK EUINT64VAL {
+ if ((unsigned)$2 != $2)
+ GEN_ERROR("Calling conv too large!");
+ $$ = $2;
+ CHECK_FOR_ERROR
+ };
+
+// OptAlign/OptCAlign - An optional alignment, and an optional alignment with
+// a comma before it.
+OptAlign : /*empty*/ { $$ = 0; } |
+ ALIGN EUINT64VAL {
+ $$ = $2;
+ if ($$ != 0 && !isPowerOf2_32($$))
+ GEN_ERROR("Alignment must be a power of two!");
+ CHECK_FOR_ERROR
+};
+OptCAlign : /*empty*/ { $$ = 0; } |
+ ',' ALIGN EUINT64VAL {
+ $$ = $3;
+ if ($$ != 0 && !isPowerOf2_32($$))
+ GEN_ERROR("Alignment must be a power of two!");
+ CHECK_FOR_ERROR
+};
+
+
+SectionString : SECTION STRINGCONSTANT {
+ for (unsigned i = 0, e = strlen($2); i != e; ++i)
+ if ($2[i] == '"' || $2[i] == '\\')
+ GEN_ERROR("Invalid character in section name!");
+ $$ = $2;
+ CHECK_FOR_ERROR
+};
+
+OptSection : /*empty*/ { $$ = 0; } |
+ SectionString { $$ = $1; };
+
+// GlobalVarAttributes - Used to pass the attributes string on a global. CurGV
+// is set to be the global we are processing.
+//
+GlobalVarAttributes : /* empty */ {} |
+ ',' GlobalVarAttribute GlobalVarAttributes {};
+GlobalVarAttribute : SectionString {
+ CurGV->setSection($1);
+ free($1);
+ CHECK_FOR_ERROR
+ }
+ | ALIGN EUINT64VAL {
+ if ($2 != 0 && !isPowerOf2_32($2))
+ GEN_ERROR("Alignment must be a power of two!");
+ CurGV->setAlignment($2);
+ CHECK_FOR_ERROR
+ };