| Index: lib/Analysis/NaCl/PNaClABITypeChecker.cpp
|
| diff --git a/lib/Analysis/NaCl/PNaClABITypeChecker.cpp b/lib/Analysis/NaCl/PNaClABITypeChecker.cpp
|
| index 8749abcaa6f5d2c2c9256ff062ead93275c166d2..bf4a6997b3863c02f637dd523fbdb0590a9b555c 100644
|
| --- a/lib/Analysis/NaCl/PNaClABITypeChecker.cpp
|
| +++ b/lib/Analysis/NaCl/PNaClABITypeChecker.cpp
|
| @@ -21,7 +21,7 @@
|
| using namespace llvm;
|
|
|
| bool PNaClABITypeChecker::isValidParamType(const Type *Ty) {
|
| - if (!isValidScalarType(Ty))
|
| + if (!(isValidScalarType(Ty) || isValidVectorType(Ty)))
|
| return false;
|
| if (const IntegerType *IntTy = dyn_cast<IntegerType>(Ty)) {
|
| // PNaCl requires function arguments and return values to be 32
|
| @@ -62,3 +62,28 @@ bool PNaClABITypeChecker::isValidScalarType(const Type *Ty) {
|
| return false;
|
| }
|
| }
|
| +
|
| +// TODO(jfb) Handle 64-bit int and double, and 2xi1.
|
| +bool PNaClABITypeChecker::isValidVectorType(const Type *Ty) {
|
| + if (!Ty->isVectorTy())
|
| + return false;
|
| + unsigned Elems = Ty->getVectorNumElements();
|
| + const Type *VTy = Ty->getVectorElementType();
|
| +
|
| + switch (VTy->getTypeID()) {
|
| + case Type::IntegerTyID: {
|
| + unsigned Width = cast<const IntegerType>(VTy)->getBitWidth();
|
| + switch (Width) {
|
| + case 1: return Elems == 4 || Elems == 8 || Elems == 16;
|
| + case 8: return Elems == 16;
|
| + case 16: return Elems == 8;
|
| + case 32: return Elems == 4;
|
| + default: return false;
|
| + }
|
| + }
|
| + case Type::FloatTyID:
|
| + return Elems == 4;
|
| + default:
|
| + return false;
|
| + }
|
| +}
|
|
|