1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 11:42:57 +01:00

What if functions can return aggregate values ?

One small step towards multiple return value support.

llvm-svn: 47406
This commit is contained in:
Devang Patel 2008-02-20 22:36:03 +00:00
parent 7c2d87a9fc
commit d2142aeb44
3 changed files with 9 additions and 4 deletions

View File

@ -179,7 +179,8 @@ Function::Function(const FunctionType *Ty, LinkageTypes Linkage,
ParamAttrs(0) {
SymTab = new ValueSymbolTable();
assert((getReturnType()->isFirstClassType() ||getReturnType() == Type::VoidTy)
assert((getReturnType()->isFirstClassType() ||getReturnType() == Type::VoidTy
|| getReturnType()->getTypeID() == Type::StructTyID)
&& "LLVM functions cannot return aggregate values!");
// If the function has arguments, mark them as lazily built.

View File

@ -443,6 +443,7 @@ FunctionType::FunctionType(const Type *Result,
ContainedTys = reinterpret_cast<PATypeHandle*>(this+1);
NumContainedTys = Params.size() + 1; // + 1 for result type
assert((Result->isFirstClassType() || Result == Type::VoidTy ||
Result->getTypeID() == Type::StructTyID ||
isa<OpaqueType>(Result)) &&
"LLVM functions cannot return aggregates");
bool isAbstract = Result->isAbstract();

View File

@ -451,7 +451,8 @@ void Verifier::visitFunction(Function &F) {
"# formal arguments must match # of arguments for function type!",
&F, FT);
Assert1(F.getReturnType()->isFirstClassType() ||
F.getReturnType() == Type::VoidTy,
F.getReturnType() == Type::VoidTy ||
F.getReturnType()->getTypeID() == Type::StructTyID,
"Functions cannot return aggregate values!", &F);
Assert1(!F.isStructReturn() || FT->getReturnType() == Type::VoidTy,
@ -1090,7 +1091,9 @@ void Verifier::visitInstruction(Instruction &I) {
// Check to make sure that only first-class-values are operands to
// instructions.
Assert1(I.getOperand(i)->getType()->isFirstClassType(),
Assert1(I.getOperand(i)->getType()->isFirstClassType()
|| (isa<ReturnInst>(I)
&& I.getOperand(i)->getType()->getTypeID() == Type::StructTyID),
"Instruction operands must be first-class values!", &I);
if (Function *F = dyn_cast<Function>(I.getOperand(i))) {