1 //===-- MBlazeIntrinsicInfo.cpp - Intrinsic Information -------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file contains the MBlaze implementation of TargetIntrinsicInfo.
12 //===----------------------------------------------------------------------===//
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"
26 namespace mblazeIntrinsic {
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
36 #define GET_LLVM_INTRINSIC_FOR_GCC_BUILTIN
37 #include "MBlazeGenIntrinsics.inc"
38 #undef GET_LLVM_INTRINSIC_FOR_GCC_BUILTIN
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
49 assert(!isOverloaded(IntrID) && "MBlaze intrinsics are not overloaded");
50 if (IntrID < Intrinsic::num_intrinsics)
52 assert(IntrID < mblazeIntrinsic::num_mblaze_intrinsics &&
53 "Invalid intrinsic ID");
55 std::string Result(names[IntrID - Intrinsic::num_intrinsics]);
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.'
64 #define GET_FUNCTION_RECOGNIZER
65 #include "MBlazeGenIntrinsics.inc"
66 #undef GET_FUNCTION_RECOGNIZER
70 unsigned MBlazeIntrinsicInfo::
71 lookupGCCName(const char *Name) const {
72 return mblazeIntrinsic::getIntrinsicForGCCBuiltin("mblaze",Name);
75 bool MBlazeIntrinsicInfo::isOverloaded(unsigned IntrID) const {
79 unsigned id = IntrID - Intrinsic::num_intrinsics + 1;
80 #define GET_INTRINSIC_OVERLOAD_TABLE
81 #include "MBlazeGenIntrinsics.inc"
82 #undef GET_INTRINSIC_OVERLOAD_TABLE
85 /// This defines the "getAttributes(LLVMContext &C, ID id)" method.
86 #define GET_INTRINSIC_ATTRIBUTES
87 #include "MBlazeGenIntrinsics.inc"
88 #undef GET_INTRINSIC_ATTRIBUTES
90 static FunctionType *getType(LLVMContext &Context, unsigned id) {
91 Type *ResultTy = NULL;
92 SmallVector<Type*, 8> ArgTys;
93 bool IsVarArg = false;
95 #define GET_INTRINSIC_GENERATOR
96 #include "MBlazeGenIntrinsics.inc"
97 #undef GET_INTRINSIC_GENERATOR
99 return FunctionType::get(ResultTy, ArgTys, IsVarArg);
102 Function *MBlazeIntrinsicInfo::getDeclaration(Module *M, unsigned IntrID,
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),