Home | History | Annotate | Download | only in MBlaze
      1 //===-- MBlazeIntrinsicInfo.cpp - Intrinsic Information -------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file contains the MBlaze implementation of TargetIntrinsicInfo.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "MBlazeIntrinsicInfo.h"
     15 #include "llvm/DerivedTypes.h"
     16 #include "llvm/Function.h"
     17 #include "llvm/Intrinsics.h"
     18 #include "llvm/Module.h"
     19 #include "llvm/Type.h"
     20 #include "llvm/Support/raw_ostream.h"
     21 #include "llvm/Support/ErrorHandling.h"
     22 #include <cstring>
     23 
     24 using namespace llvm;
     25 
     26 namespace mblazeIntrinsic {
     27 
     28   enum ID {
     29     last_non_mblaze_intrinsic = Intrinsic::num_intrinsics-1,
     30 #define GET_INTRINSIC_ENUM_VALUES
     31 #include "MBlazeGenIntrinsics.inc"
     32 #undef GET_INTRINSIC_ENUM_VALUES
     33     , num_mblaze_intrinsics
     34   };
     35 
     36 #define GET_LLVM_INTRINSIC_FOR_GCC_BUILTIN
     37 #include "MBlazeGenIntrinsics.inc"
     38 #undef GET_LLVM_INTRINSIC_FOR_GCC_BUILTIN
     39 }
     40 
     41 std::string MBlazeIntrinsicInfo::getName(unsigned IntrID, Type **Tys,
     42                                          unsigned numTys) const {
     43   static const char *const names[] = {
     44 #define GET_INTRINSIC_NAME_TABLE
     45 #include "MBlazeGenIntrinsics.inc"
     46 #undef GET_INTRINSIC_NAME_TABLE
     47   };
     48 
     49   assert(!isOverloaded(IntrID) && "MBlaze intrinsics are not overloaded");
     50   if (IntrID < Intrinsic::num_intrinsics)
     51     return 0;
     52   assert(IntrID < mblazeIntrinsic::num_mblaze_intrinsics &&
     53          "Invalid intrinsic ID");
     54 
     55   std::string Result(names[IntrID - Intrinsic::num_intrinsics]);
     56   return Result;
     57 }
     58 
     59 unsigned MBlazeIntrinsicInfo::
     60 lookupName(const char *Name, unsigned Len) const {
     61   if (Len < 5 || Name[4] != '.' || Name[0] != 'l' || Name[1] != 'l'
     62       || Name[2] != 'v' || Name[3] != 'm')
     63     return 0;  // All intrinsics start with 'llvm.'
     64 
     65 #define GET_FUNCTION_RECOGNIZER
     66 #include "MBlazeGenIntrinsics.inc"
     67 #undef GET_FUNCTION_RECOGNIZER
     68   return 0;
     69 }
     70 
     71 unsigned MBlazeIntrinsicInfo::
     72 lookupGCCName(const char *Name) const {
     73     return mblazeIntrinsic::getIntrinsicForGCCBuiltin("mblaze",Name);
     74 }
     75 
     76 bool MBlazeIntrinsicInfo::isOverloaded(unsigned IntrID) const {
     77   if (IntrID == 0)
     78     return false;
     79 
     80   unsigned id = IntrID - Intrinsic::num_intrinsics + 1;
     81 #define GET_INTRINSIC_OVERLOAD_TABLE
     82 #include "MBlazeGenIntrinsics.inc"
     83 #undef GET_INTRINSIC_OVERLOAD_TABLE
     84 }
     85 
     86 /// This defines the "getAttributes(ID id)" method.
     87 #define GET_INTRINSIC_ATTRIBUTES
     88 #include "MBlazeGenIntrinsics.inc"
     89 #undef GET_INTRINSIC_ATTRIBUTES
     90 
     91 static FunctionType *getType(LLVMContext &Context, unsigned id) {
     92   Type *ResultTy = NULL;
     93   SmallVector<Type*, 8> ArgTys;
     94   bool IsVarArg = false;
     95 
     96 #define GET_INTRINSIC_GENERATOR
     97 #include "MBlazeGenIntrinsics.inc"
     98 #undef GET_INTRINSIC_GENERATOR
     99 
    100   return FunctionType::get(ResultTy, ArgTys, IsVarArg);
    101 }
    102 
    103 Function *MBlazeIntrinsicInfo::getDeclaration(Module *M, unsigned IntrID,
    104                                                 Type **Tys,
    105                                                 unsigned numTy) const {
    106   assert(!isOverloaded(IntrID) && "MBlaze intrinsics are not overloaded");
    107   AttrListPtr AList = getAttributes((mblazeIntrinsic::ID) IntrID);
    108   return cast<Function>(M->getOrInsertFunction(getName(IntrID),
    109                                                getType(M->getContext(), IntrID),
    110                                                AList));
    111 }
    112