1 //===- BlackfinIntrinsicInfo.cpp - Intrinsic Information --------*- C++ -*-===// 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 Blackfin implementation of TargetIntrinsicInfo. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "BlackfinIntrinsicInfo.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 <cstring> 22 23 using namespace llvm; 24 25 namespace bfinIntrinsic { 26 27 enum ID { 28 last_non_bfin_intrinsic = Intrinsic::num_intrinsics-1, 29 #define GET_INTRINSIC_ENUM_VALUES 30 #include "BlackfinGenIntrinsics.inc" 31 #undef GET_INTRINSIC_ENUM_VALUES 32 , num_bfin_intrinsics 33 }; 34 35 } 36 37 std::string BlackfinIntrinsicInfo::getName(unsigned IntrID, Type **Tys, 38 unsigned numTys) const { 39 static const char *const names[] = { 40 #define GET_INTRINSIC_NAME_TABLE 41 #include "BlackfinGenIntrinsics.inc" 42 #undef GET_INTRINSIC_NAME_TABLE 43 }; 44 45 assert(!isOverloaded(IntrID) && "Blackfin intrinsics are not overloaded"); 46 if (IntrID < Intrinsic::num_intrinsics) 47 return 0; 48 assert(IntrID < bfinIntrinsic::num_bfin_intrinsics && "Invalid intrinsic ID"); 49 50 std::string Result(names[IntrID - Intrinsic::num_intrinsics]); 51 return Result; 52 } 53 54 unsigned 55 BlackfinIntrinsicInfo::lookupName(const char *Name, unsigned Len) const { 56 if (Len < 5 || Name[4] != '.' || Name[0] != 'l' || Name[1] != 'l' 57 || Name[2] != 'v' || Name[3] != 'm') 58 return 0; // All intrinsics start with 'llvm.' 59 60 #define GET_FUNCTION_RECOGNIZER 61 #include "BlackfinGenIntrinsics.inc" 62 #undef GET_FUNCTION_RECOGNIZER 63 return 0; 64 } 65 66 bool BlackfinIntrinsicInfo::isOverloaded(unsigned IntrID) const { 67 // Overload Table 68 const bool OTable[] = { 69 #define GET_INTRINSIC_OVERLOAD_TABLE 70 #include "BlackfinGenIntrinsics.inc" 71 #undef GET_INTRINSIC_OVERLOAD_TABLE 72 }; 73 if (IntrID == 0) 74 return false; 75 else 76 return OTable[IntrID - Intrinsic::num_intrinsics]; 77 } 78 79 /// This defines the "getAttributes(ID id)" method. 80 #define GET_INTRINSIC_ATTRIBUTES 81 #include "BlackfinGenIntrinsics.inc" 82 #undef GET_INTRINSIC_ATTRIBUTES 83 84 static FunctionType *getType(LLVMContext &Context, unsigned id) { 85 Type *ResultTy = NULL; 86 std::vector<Type*> ArgTys; 87 bool IsVarArg = false; 88 89 #define GET_INTRINSIC_GENERATOR 90 #include "BlackfinGenIntrinsics.inc" 91 #undef GET_INTRINSIC_GENERATOR 92 93 return FunctionType::get(ResultTy, ArgTys, IsVarArg); 94 } 95 96 Function *BlackfinIntrinsicInfo::getDeclaration(Module *M, unsigned IntrID, 97 Type **Tys, 98 unsigned numTy) const { 99 assert(!isOverloaded(IntrID) && "Blackfin intrinsics are not overloaded"); 100 AttrListPtr AList = getAttributes((bfinIntrinsic::ID) IntrID); 101 return cast<Function>(M->getOrInsertFunction(getName(IntrID), 102 getType(M->getContext(), IntrID), 103 AList)); 104 } 105