Home | History | Annotate | Download | only in src
      1 //===- subzero/src/IceTypeConverter.cpp - Convert ICE/LLVM Types ----------===//
      2 //
      3 //                        The Subzero Code Generator
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 ///
     10 /// \file
     11 /// \brief Implements how to convert LLVM types to ICE types, and ICE types to
     12 /// LLVM types.
     13 ///
     14 //===----------------------------------------------------------------------===//
     15 
     16 #include "IceTypeConverter.h"
     17 
     18 #include "llvm/Support/raw_ostream.h"
     19 
     20 namespace Ice {
     21 
     22 TypeConverter::TypeConverter(llvm::LLVMContext &Context) {
     23   addLLVMType(IceType_void, llvm::Type::getVoidTy(Context));
     24   llvm::Type *Type_i1 = llvm::IntegerType::get(Context, 1);
     25   llvm::Type *Type_i8 = llvm::IntegerType::get(Context, 8);
     26   llvm::Type *Type_i16 = llvm::IntegerType::get(Context, 16);
     27   llvm::Type *Type_i32 = llvm::IntegerType::get(Context, 32);
     28   llvm::Type *Type_f32 = llvm::Type::getFloatTy(Context);
     29   addLLVMType(IceType_i1, Type_i1);
     30   addLLVMType(IceType_i8, Type_i8);
     31   addLLVMType(IceType_i16, Type_i16);
     32   addLLVMType(IceType_i32, Type_i32);
     33   addLLVMType(IceType_i64, llvm::IntegerType::get(Context, 64));
     34   addLLVMType(IceType_f32, Type_f32);
     35   addLLVMType(IceType_f64, llvm::Type::getDoubleTy(Context));
     36   addLLVMType(IceType_v4i1, llvm::VectorType::get(Type_i1, 4));
     37   addLLVMType(IceType_v8i1, llvm::VectorType::get(Type_i1, 8));
     38   addLLVMType(IceType_v16i1, llvm::VectorType::get(Type_i1, 16));
     39   addLLVMType(IceType_v16i8, llvm::VectorType::get(Type_i8, 16));
     40   addLLVMType(IceType_v8i16, llvm::VectorType::get(Type_i16, 8));
     41   addLLVMType(IceType_v4i32, llvm::VectorType::get(Type_i32, 4));
     42   addLLVMType(IceType_v4f32, llvm::VectorType::get(Type_f32, 4));
     43   assert(LLVM2IceMap.size() == static_cast<size_t>(IceType_NUM));
     44 }
     45 
     46 void TypeConverter::addLLVMType(Type Ty, llvm::Type *LLVMTy) {
     47   LLVM2IceMap[LLVMTy] = Ty;
     48 }
     49 
     50 Type TypeConverter::convertToIceTypeOther(llvm::Type *LLVMTy) const {
     51   switch (LLVMTy->getTypeID()) {
     52   case llvm::Type::PointerTyID:
     53   case llvm::Type::FunctionTyID:
     54     return getPointerType();
     55   default:
     56     return Ice::IceType_NUM;
     57   }
     58 }
     59 
     60 } // end of Ice namespace.
     61