std::vector<void*> StructTypeInterface::get(void* storage)
 {
   std::vector<void*> result;
   unsigned count = memberTypes().size();
   for (unsigned i=0; i<count; ++i)
     result.push_back(get(storage, i));
   return result;
 }
 AnyReferenceVector StructTypeInterface::values(void* storage)
 {
   std::vector<TypeInterface*> types = memberTypes();
   std::vector<void*> values = get(storage);
   AnyReferenceVector result;
   for (unsigned i=0; i<types.size(); ++i)
     result.push_back(AnyReference(types[i], values[i]));
   return result;
 }
Beispiel #3
0
// Get the LLVM type for an IR type.
llvm::Type* 
CgTypes::Convert(const IRType* ty) const
{
    IRTypeKind kind = ty->GetKind();
    switch (kind) {
      case kIRVoidTy:
      case kIRBoolTy:
      case kIRFloatTy:
      case kIRPointTy:
      case kIRVectorTy:
      case kIRNormalTy:
      case kIRColorTy:
      case kIRMatrixTy:
      case kIRStringTy:
      case kIRShaderTy:
          return mBasicTypes[kind];
      case kIRArrayTy: {
          // TODO: codegen support resizable arrays.
          const IRArrayType* arrayTy = UtStaticCast<const IRArrayType*>(ty);
          assert(arrayTy->GetLength() >= 0 &&
                 "No codegen support for resizable arrays");
          llvm::Type* elemTy = Convert(arrayTy->GetElementType());
          return llvm::ArrayType::get(elemTy, arrayTy->GetLength());
      }
      case kIRStructTy: {
          const IRStructType* structTy = UtStaticCast<const IRStructType*>(ty);
          unsigned int numMembers = structTy->GetNumMembers();
          std::vector<llvm::Type*> memberTypes(numMembers);
          for (unsigned int i = 0; i < numMembers; ++i)
              memberTypes[i] = Convert(structTy->GetMemberType(i));
          return llvm::StructType::get(*GetContext(), llvm::ArrayRef<llvm::Type*>(memberTypes));
      }
      case kIRNumTypeKinds:
          assert(false && "Invalid IR type");
    }
    assert(false && "Unimplemented kind of IR type");
    return llvm::Type::getFloatTy(*GetContext());
}