mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-01 15:11:24 +00:00
Enforce that multiple return values have to have at least one result.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50137 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
69e6317083
commit
d52b62ae05
@ -154,6 +154,10 @@ public:
|
||||
const std::vector<const Type*> &Params, ///< The types of the parameters
|
||||
bool isVarArg ///< Whether this is a variable argument length function
|
||||
);
|
||||
|
||||
/// isValidReturnType - Return true if the specified type is valid as a return
|
||||
/// type.
|
||||
static bool isValidReturnType(const Type *RetTy);
|
||||
|
||||
inline bool isVarArg() const { return isVarArgs; }
|
||||
inline const Type *getReturnType() const { return ContainedTys[0]; }
|
||||
|
@ -2691,7 +2691,7 @@ bool GetResultInst::isValidOperands(const Value *Aggregate, unsigned Index) {
|
||||
|
||||
if (const StructType *STy = dyn_cast<StructType>(Aggregate->getType())) {
|
||||
unsigned NumElements = STy->getNumElements();
|
||||
if (Index >= NumElements)
|
||||
if (Index >= NumElements || NumElements == 0)
|
||||
return false;
|
||||
|
||||
// getresult aggregate value's element types are restricted to
|
||||
|
@ -437,16 +437,35 @@ const IntegerType *Type::Int64Ty = new BuiltinIntegerType(64);
|
||||
// Derived Type Constructors
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
/// isValidReturnType - Return true if the specified type is valid as a return
|
||||
/// type.
|
||||
bool FunctionType::isValidReturnType(const Type *RetTy) {
|
||||
if (RetTy->isFirstClassType())
|
||||
return true;
|
||||
if (RetTy == Type::VoidTy || isa<OpaqueType>(RetTy))
|
||||
return true;
|
||||
|
||||
// If this is a multiple return case, verify that each return is a first class
|
||||
// value and that there is at least one value.
|
||||
const StructType *SRetTy = dyn_cast<StructType>(RetTy);
|
||||
if (SRetTy == 0 || SRetTy->getNumElements() == 0)
|
||||
return false;
|
||||
|
||||
for (unsigned i = 0, e = SRetTy->getNumElements(); i != e; ++i)
|
||||
if (!SRetTy->getElementType(i)->isFirstClassType())
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
FunctionType::FunctionType(const Type *Result,
|
||||
const std::vector<const Type*> &Params,
|
||||
bool IsVarArgs)
|
||||
: DerivedType(FunctionTyID), isVarArgs(IsVarArgs) {
|
||||
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");
|
||||
assert(isValidReturnType(Result) && "invalid return type for function");
|
||||
|
||||
|
||||
bool isAbstract = Result->isAbstract();
|
||||
new (&ContainedTys[0]) PATypeHandle(Result, this);
|
||||
|
||||
@ -1091,9 +1110,8 @@ FunctionType *FunctionType::get(const Type *ReturnType,
|
||||
bool isVarArg) {
|
||||
FunctionValType VT(ReturnType, Params, isVarArg);
|
||||
FunctionType *FT = FunctionTypes->get(VT);
|
||||
if (FT) {
|
||||
if (FT)
|
||||
return FT;
|
||||
}
|
||||
|
||||
FT = (FunctionType*) new char[sizeof(FunctionType) +
|
||||
sizeof(PATypeHandle)*(Params.size()+1)];
|
||||
|
Loading…
Reference in New Issue
Block a user