aboutsummaryrefslogtreecommitdiffstats
path: root/lib/AsmParser
diff options
context:
space:
mode:
authorAnton Korobeynikov <asl@math.spbu.ru>2007-12-03 19:16:54 +0000
committerAnton Korobeynikov <asl@math.spbu.ru>2007-12-03 19:16:54 +0000
commita2c0227fee0ae48f167446abfadc52206b528cca (patch)
tree861b8e7ee8b1339268e7b0777766a8b9aee823e5 /lib/AsmParser
parent85d1d0b9eaee401681ef13b24c027342ce44554a (diff)
downloadexternal_llvm-a2c0227fee0ae48f167446abfadc52206b528cca.zip
external_llvm-a2c0227fee0ae48f167446abfadc52206b528cca.tar.gz
external_llvm-a2c0227fee0ae48f167446abfadc52206b528cca.tar.bz2
More sanity checks for function types.
Thanks goes to PyPy folks for generating broken stuff :) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44538 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AsmParser')
-rw-r--r--lib/AsmParser/llvmAsmParser.y14
-rw-r--r--lib/AsmParser/llvmAsmParser.y.cvs14
2 files changed, 26 insertions, 2 deletions
diff --git a/lib/AsmParser/llvmAsmParser.y b/lib/AsmParser/llvmAsmParser.y
index 31fd619..ae6da07 100644
--- a/lib/AsmParser/llvmAsmParser.y
+++ b/lib/AsmParser/llvmAsmParser.y
@@ -1330,16 +1330,24 @@ Types
| 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() || 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();
+ if (!(Ty->isFirstClassType() || isa<OpaqueType>(Ty)))
+ GEN_ERROR("Function arguments must be value types!");
Params.push_back(Ty);
}
+ CHECK_FOR_ERROR
+
bool isVarArg = Params.size() && Params.back() == Type::VoidTy;
if (isVarArg) Params.pop_back();
- FunctionType *FT = FunctionType::get(*$1, Params, isVarArg);
+ FunctionType *FT = FunctionType::get(RetTy, Params, isVarArg);
delete $3; // Delete the argument list
delete $1; // Delete the return type handle
$$ = new PATypeHolder(HandleUpRefs(FT));
@@ -1352,8 +1360,12 @@ Types
TypeWithAttrsList::iterator I = $3->begin(), E = $3->end();
for ( ; I != E; ++I ) {
const Type* Ty = I->Ty->get();
+ if (!(Ty->isFirstClassType() || isa<OpaqueType>(Ty)))
+ GEN_ERROR("Function arguments must be value types!");
Params.push_back(Ty);
}
+ CHECK_FOR_ERROR
+
bool isVarArg = Params.size() && Params.back() == Type::VoidTy;
if (isVarArg) Params.pop_back();
diff --git a/lib/AsmParser/llvmAsmParser.y.cvs b/lib/AsmParser/llvmAsmParser.y.cvs
index 31fd619..ae6da07 100644
--- a/lib/AsmParser/llvmAsmParser.y.cvs
+++ b/lib/AsmParser/llvmAsmParser.y.cvs
@@ -1330,16 +1330,24 @@ Types
| 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() || 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();
+ if (!(Ty->isFirstClassType() || isa<OpaqueType>(Ty)))
+ GEN_ERROR("Function arguments must be value types!");
Params.push_back(Ty);
}
+ CHECK_FOR_ERROR
+
bool isVarArg = Params.size() && Params.back() == Type::VoidTy;
if (isVarArg) Params.pop_back();
- FunctionType *FT = FunctionType::get(*$1, Params, isVarArg);
+ FunctionType *FT = FunctionType::get(RetTy, Params, isVarArg);
delete $3; // Delete the argument list
delete $1; // Delete the return type handle
$$ = new PATypeHolder(HandleUpRefs(FT));
@@ -1352,8 +1360,12 @@ Types
TypeWithAttrsList::iterator I = $3->begin(), E = $3->end();
for ( ; I != E; ++I ) {
const Type* Ty = I->Ty->get();
+ if (!(Ty->isFirstClassType() || isa<OpaqueType>(Ty)))
+ GEN_ERROR("Function arguments must be value types!");
Params.push_back(Ty);
}
+ CHECK_FOR_ERROR
+
bool isVarArg = Params.size() && Params.back() == Type::VoidTy;
if (isVarArg) Params.pop_back();