1 //===- BlackfinIntrinsicInfo.cpp - Intrinsic Information --------*- C++ -*-===//
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 Blackfin implementation of TargetIntrinsicInfo.
12 //===----------------------------------------------------------------------===//
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"
25 namespace bfinIntrinsic
{
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
37 std::string
BlackfinIntrinsicInfo::getName(unsigned IntrID
, const 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
45 assert(!isOverloaded(IntrID
) && "Blackfin intrinsics are not overloaded");
46 if (IntrID
< Intrinsic::num_intrinsics
)
48 assert(IntrID
< bfinIntrinsic::num_bfin_intrinsics
&& "Invalid intrinsic ID");
50 std::string
Result(names
[IntrID
- Intrinsic::num_intrinsics
]);
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.'
60 #define GET_FUNCTION_RECOGNIZER
61 #include "BlackfinGenIntrinsics.inc"
62 #undef GET_FUNCTION_RECOGNIZER
66 bool BlackfinIntrinsicInfo::isOverloaded(unsigned IntrID
) const {
68 const bool OTable
[] = {
69 #define GET_INTRINSIC_OVERLOAD_TABLE
70 #include "BlackfinGenIntrinsics.inc"
71 #undef GET_INTRINSIC_OVERLOAD_TABLE
76 return OTable
[IntrID
- Intrinsic::num_intrinsics
];
79 /// This defines the "getAttributes(ID id)" method.
80 #define GET_INTRINSIC_ATTRIBUTES
81 #include "BlackfinGenIntrinsics.inc"
82 #undef GET_INTRINSIC_ATTRIBUTES
84 static const FunctionType
*getType(LLVMContext
&Context
, unsigned id
) {
85 const Type
*ResultTy
= NULL
;
86 std::vector
<const Type
*> ArgTys
;
87 bool IsVarArg
= false;
89 #define GET_INTRINSIC_GENERATOR
90 #include "BlackfinGenIntrinsics.inc"
91 #undef GET_INTRINSIC_GENERATOR
93 return FunctionType::get(ResultTy
, ArgTys
, IsVarArg
);
96 Function
*BlackfinIntrinsicInfo::getDeclaration(Module
*M
, unsigned IntrID
,
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
),