%token<StrVal> STRINGCONSTANT ATSTRINGCONSTANT PCTSTRINGCONSTANT
%type <StrVal> LocalName OptLocalName OptLocalAssign
%type <StrVal> GlobalName OptGlobalAssign GlobalAssign
-%type <StrVal> OptSection SectionString
+%type <StrVal> OptSection SectionString OptGC
%type <UIntVal> OptAlign OptCAlign
// Function Attributes
%token SIGNEXT ZEROEXT NORETURN INREG SRET NOUNWIND NOALIAS BYVAL NEST
-%token READNONE READONLY
+%token READNONE READONLY GC
// Visibility Styles
%token DEFAULT HIDDEN PROTECTED
}
;
+OptGC : /* empty */ { $$ = 0; }
+ | GC STRINGCONSTANT {
+ $$ = $2;
+ }
+ ;
+
// OptAlign/OptCAlign - An optional alignment, and an optional alignment with
// a comma before it.
OptAlign : /*empty*/ { $$ = 0; } |
| Types '(' ArgTypeListI ')' OptFuncAttrs {
// Allow but ignore attributes on function types; this permits auto-upgrade.
// FIXME: remove in LLVM 3.0.
+ const Type* RetTy = *$1;
+ if (!(RetTy->isFirstClassType() || RetTy == Type::VoidTy ||
+ isa<OpaqueType>(RetTy)))
+ GEN_ERROR("LLVM Functions cannot return aggregates");
+
std::vector<const Type*> Params;
TypeWithAttrsList::iterator I = $3->begin(), E = $3->end();
for (; I != E; ++I ) {
const Type *Ty = I->Ty->get();
Params.push_back(Ty);
}
+
bool isVarArg = Params.size() && Params.back() == Type::VoidTy;
if (isVarArg) Params.pop_back();
- FunctionType *FT = FunctionType::get(*$1, Params, isVarArg);
+ for (unsigned i = 0; i != Params.size(); ++i)
+ if (!(Params[i]->isFirstClassType() || isa<OpaqueType>(Params[i])))
+ GEN_ERROR("Function arguments must be value types!");
+
+ CHECK_FOR_ERROR
+
+ FunctionType *FT = FunctionType::get(RetTy, Params, isVarArg);
delete $3; // Delete the argument list
delete $1; // Delete the return type handle
$$ = new PATypeHolder(HandleUpRefs(FT));
const Type* Ty = I->Ty->get();
Params.push_back(Ty);
}
+
bool isVarArg = Params.size() && Params.back() == Type::VoidTy;
if (isVarArg) Params.pop_back();
+ for (unsigned i = 0; i != Params.size(); ++i)
+ if (!(Params[i]->isFirstClassType() || isa<OpaqueType>(Params[i])))
+ GEN_ERROR("Function arguments must be value types!");
+
+ CHECK_FOR_ERROR
+
FunctionType *FT = FunctionType::get($1, Params, isVarArg);
delete $3; // Delete the argument list
$$ = new PATypeHolder(HandleUpRefs(FT));
};
FunctionHeaderH : OptCallingConv ResultTypes GlobalName '(' ArgList ')'
- OptFuncAttrs OptSection OptAlign {
+ OptFuncAttrs OptSection OptAlign OptGC {
std::string FunctionName(*$3);
delete $3; // Free strdup'd memory!
Fn->setSection(*$8);
delete $8;
}
+ if ($10) {
+ Fn->setCollector($10->c_str());
+ delete $10;
+ }
// Add all of the arguments we parsed to the function...
if ($5) { // Is null if empty...