0d3f7d8cfe943c3d76e7ad7c3a151ea0520d982d
[oota-llvm.git] / lib / Target / MBlaze / MBlazeIntrinsicInfo.cpp
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/IR/DerivedTypes.h"
16 #include "llvm/IR/Function.h"
17 #include "llvm/IR/Intrinsics.h"
18 #include "llvm/IR/Module.h"
19 #include "llvm/IR/Type.h"
20 #include "llvm/Support/ErrorHandling.h"
21 #include "llvm/Support/raw_ostream.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 (!StringRef(Name, Len).startswith("llvm."))
62     return 0; // All intrinsics start with 'llvm.'
63
64 #define GET_FUNCTION_RECOGNIZER
65 #include "MBlazeGenIntrinsics.inc"
66 #undef GET_FUNCTION_RECOGNIZER
67   return 0;
68 }
69
70 unsigned MBlazeIntrinsicInfo::
71 lookupGCCName(const char *Name) const {
72     return mblazeIntrinsic::getIntrinsicForGCCBuiltin("mblaze",Name);
73 }
74
75 bool MBlazeIntrinsicInfo::isOverloaded(unsigned IntrID) const {
76   if (IntrID == 0)
77     return false;
78
79   unsigned id = IntrID - Intrinsic::num_intrinsics + 1;
80 #define GET_INTRINSIC_OVERLOAD_TABLE
81 #include "MBlazeGenIntrinsics.inc"
82 #undef GET_INTRINSIC_OVERLOAD_TABLE
83 }
84
85 /// This defines the "getAttributes(LLVMContext &C, ID id)" method.
86 #define GET_INTRINSIC_ATTRIBUTES
87 #include "MBlazeGenIntrinsics.inc"
88 #undef GET_INTRINSIC_ATTRIBUTES
89
90 static FunctionType *getType(LLVMContext &Context, unsigned id) {
91   Type *ResultTy = NULL;
92   SmallVector<Type*, 8> ArgTys;
93   bool IsVarArg = false;
94
95 #define GET_INTRINSIC_GENERATOR
96 #include "MBlazeGenIntrinsics.inc"
97 #undef GET_INTRINSIC_GENERATOR
98
99   return FunctionType::get(ResultTy, ArgTys, IsVarArg);
100 }
101
102 Function *MBlazeIntrinsicInfo::getDeclaration(Module *M, unsigned IntrID,
103                                                 Type **Tys,
104                                                 unsigned numTy) const {
105   assert(!isOverloaded(IntrID) && "MBlaze intrinsics are not overloaded");
106   AttributeSet AList = getAttributes(M->getContext(),
107                                     (mblazeIntrinsic::ID) IntrID);
108   return cast<Function>(M->getOrInsertFunction(getName(IntrID),
109                                                getType(M->getContext(), IntrID),
110                                                AList));
111 }