Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line | 
|---|---|---|---|
| 14 | pmbaty | 1 | //===- BuildLibCalls.h - Utility builder for libcalls -----------*- C++ -*-===// | 
| 2 | // | ||
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
| 4 | // See https://llvm.org/LICENSE.txt for license information. | ||
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
| 6 | // | ||
| 7 | //===----------------------------------------------------------------------===// | ||
| 8 | // | ||
| 9 | // This file exposes an interface to build some C language libcalls for | ||
| 10 | // optimization passes that need to call the various functions. | ||
| 11 | // | ||
| 12 | //===----------------------------------------------------------------------===// | ||
| 13 | |||
| 14 | #ifndef LLVM_TRANSFORMS_UTILS_BUILDLIBCALLS_H | ||
| 15 | #define LLVM_TRANSFORMS_UTILS_BUILDLIBCALLS_H | ||
| 16 | |||
| 17 | #include "llvm/Analysis/TargetLibraryInfo.h" | ||
| 18 | |||
| 19 | namespace llvm { | ||
| 20 | class Value; | ||
| 21 | class DataLayout; | ||
| 22 | class IRBuilderBase; | ||
| 23 | |||
| 24 |   /// Analyze the name and prototype of the given function and set any | ||
| 25 |   /// applicable attributes. Note that this merely helps optimizations on an | ||
| 26 |   /// already existing function but does not consider mandatory attributes. | ||
| 27 |   /// | ||
| 28 |   /// If the library function is unavailable, this doesn't modify it. | ||
| 29 |   /// | ||
| 30 |   /// Returns true if any attributes were set and false otherwise. | ||
| 31 | bool inferNonMandatoryLibFuncAttrs(Module *M, StringRef Name, | ||
| 32 | const TargetLibraryInfo &TLI); | ||
| 33 | bool inferNonMandatoryLibFuncAttrs(Function &F, const TargetLibraryInfo &TLI); | ||
| 34 | |||
| 35 |   /// Calls getOrInsertFunction() and then makes sure to add mandatory | ||
| 36 |   /// argument attributes. | ||
| 37 | FunctionCallee getOrInsertLibFunc(Module *M, const TargetLibraryInfo &TLI, | ||
| 38 |                                     LibFunc TheLibFunc, FunctionType *T, | ||
| 39 | AttributeList AttributeList); | ||
| 40 | FunctionCallee getOrInsertLibFunc(Module *M, const TargetLibraryInfo &TLI, | ||
| 41 | LibFunc TheLibFunc, FunctionType *T); | ||
| 42 | template <typename... ArgsTy> | ||
| 43 | FunctionCallee getOrInsertLibFunc(Module *M, const TargetLibraryInfo &TLI, | ||
| 44 | LibFunc TheLibFunc, AttributeList AttributeList, | ||
| 45 | Type *RetTy, ArgsTy... Args) { | ||
| 46 | SmallVector<Type*, sizeof...(ArgsTy)> ArgTys{Args...}; | ||
| 47 | return getOrInsertLibFunc(M, TLI, TheLibFunc, | ||
| 48 | FunctionType::get(RetTy, ArgTys, false), | ||
| 49 | AttributeList); | ||
| 50 |   } | ||
| 51 |   /// Same as above, but without the attributes. | ||
| 52 | template <typename... ArgsTy> | ||
| 53 | FunctionCallee getOrInsertLibFunc(Module *M, const TargetLibraryInfo &TLI, | ||
| 54 | LibFunc TheLibFunc, Type *RetTy, ArgsTy... Args) { | ||
| 55 | return getOrInsertLibFunc(M, TLI, TheLibFunc, AttributeList{}, RetTy, | ||
| 56 | Args...); | ||
| 57 |   } | ||
| 58 |   // Avoid an incorrect ordering that'd otherwise compile incorrectly. | ||
| 59 | template <typename... ArgsTy> | ||
| 60 | FunctionCallee | ||
| 61 | getOrInsertLibFunc(Module *M, const TargetLibraryInfo &TLI, | ||
| 62 | LibFunc TheLibFunc, AttributeList AttributeList, | ||
| 63 | FunctionType *Invalid, ArgsTy... Args) = delete; | ||
| 64 | |||
| 65 |   /// Check whether the library function is available on target and also that | ||
| 66 |   /// it in the current Module is a Function with the right type. | ||
| 67 | bool isLibFuncEmittable(const Module *M, const TargetLibraryInfo *TLI, | ||
| 68 | LibFunc TheLibFunc); | ||
| 69 | bool isLibFuncEmittable(const Module *M, const TargetLibraryInfo *TLI, | ||
| 70 | StringRef Name); | ||
| 71 | |||
| 72 |   /// Check whether the overloaded floating point function | ||
| 73 |   /// corresponding to \a Ty is available. | ||
| 74 | bool hasFloatFn(const Module *M, const TargetLibraryInfo *TLI, Type *Ty, | ||
| 75 | LibFunc DoubleFn, LibFunc FloatFn, LibFunc LongDoubleFn); | ||
| 76 | |||
| 77 |   /// Get the name of the overloaded floating point function | ||
| 78 |   /// corresponding to \a Ty. Return the LibFunc in \a TheLibFunc. | ||
| 79 | StringRef getFloatFn(const Module *M, const TargetLibraryInfo *TLI, Type *Ty, | ||
| 80 | LibFunc DoubleFn, LibFunc FloatFn, LibFunc LongDoubleFn, | ||
| 81 | LibFunc &TheLibFunc); | ||
| 82 | |||
| 83 |   /// Return V if it is an i8*, otherwise cast it to i8*. | ||
| 84 | Value *castToCStr(Value *V, IRBuilderBase &B); | ||
| 85 | |||
| 86 |   /// Emit a call to the strlen function to the builder, for the specified | ||
| 87 |   /// pointer. Ptr is required to be some pointer type, and the return value has | ||
| 88 |   /// 'size_t' type. | ||
| 89 | Value *emitStrLen(Value *Ptr, IRBuilderBase &B, const DataLayout &DL, | ||
| 90 | const TargetLibraryInfo *TLI); | ||
| 91 | |||
| 92 |   /// Emit a call to the strdup function to the builder, for the specified | ||
| 93 |   /// pointer. Ptr is required to be some pointer type, and the return value has | ||
| 94 |   /// 'i8*' type. | ||
| 95 | Value *emitStrDup(Value *Ptr, IRBuilderBase &B, const TargetLibraryInfo *TLI); | ||
| 96 | |||
| 97 |   /// Emit a call to the strchr function to the builder, for the specified | ||
| 98 |   /// pointer and character. Ptr is required to be some pointer type, and the | ||
| 99 |   /// return value has 'i8*' type. | ||
| 100 | Value *emitStrChr(Value *Ptr, char C, IRBuilderBase &B, | ||
| 101 | const TargetLibraryInfo *TLI); | ||
| 102 | |||
| 103 |   /// Emit a call to the strncmp function to the builder. | ||
| 104 | Value *emitStrNCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilderBase &B, | ||
| 105 | const DataLayout &DL, const TargetLibraryInfo *TLI); | ||
| 106 | |||
| 107 |   /// Emit a call to the strcpy function to the builder, for the specified | ||
| 108 |   /// pointer arguments. | ||
| 109 | Value *emitStrCpy(Value *Dst, Value *Src, IRBuilderBase &B, | ||
| 110 | const TargetLibraryInfo *TLI); | ||
| 111 | |||
| 112 |   /// Emit a call to the stpcpy function to the builder, for the specified | ||
| 113 |   /// pointer arguments. | ||
| 114 | Value *emitStpCpy(Value *Dst, Value *Src, IRBuilderBase &B, | ||
| 115 | const TargetLibraryInfo *TLI); | ||
| 116 | |||
| 117 |   /// Emit a call to the strncpy function to the builder, for the specified | ||
| 118 |   /// pointer arguments and length. | ||
| 119 | Value *emitStrNCpy(Value *Dst, Value *Src, Value *Len, IRBuilderBase &B, | ||
| 120 | const TargetLibraryInfo *TLI); | ||
| 121 | |||
| 122 |   /// Emit a call to the stpncpy function to the builder, for the specified | ||
| 123 |   /// pointer arguments and length. | ||
| 124 | Value *emitStpNCpy(Value *Dst, Value *Src, Value *Len, IRBuilderBase &B, | ||
| 125 | const TargetLibraryInfo *TLI); | ||
| 126 | |||
| 127 |   /// Emit a call to the __memcpy_chk function to the builder. This expects that | ||
| 128 |   /// the Len and ObjSize have type 'size_t' and Dst/Src are pointers. | ||
| 129 | Value *emitMemCpyChk(Value *Dst, Value *Src, Value *Len, Value *ObjSize, | ||
| 130 | IRBuilderBase &B, const DataLayout &DL, | ||
| 131 | const TargetLibraryInfo *TLI); | ||
| 132 | |||
| 133 |   /// Emit a call to the mempcpy function. | ||
| 134 | Value *emitMemPCpy(Value *Dst, Value *Src, Value *Len, IRBuilderBase &B, | ||
| 135 | const DataLayout &DL, const TargetLibraryInfo *TLI); | ||
| 136 | |||
| 137 |   /// Emit a call to the memchr function. This assumes that Ptr is a pointer, | ||
| 138 |   /// Val is an 'int' value, and Len is an 'size_t' value. | ||
| 139 | Value *emitMemChr(Value *Ptr, Value *Val, Value *Len, IRBuilderBase &B, | ||
| 140 | const DataLayout &DL, const TargetLibraryInfo *TLI); | ||
| 141 | |||
| 142 |   /// Emit a call to the memrchr function, analogously to emitMemChr. | ||
| 143 | Value *emitMemRChr(Value *Ptr, Value *Val, Value *Len, IRBuilderBase &B, | ||
| 144 | const DataLayout &DL, const TargetLibraryInfo *TLI); | ||
| 145 | |||
| 146 |   /// Emit a call to the memcmp function. | ||
| 147 | Value *emitMemCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilderBase &B, | ||
| 148 | const DataLayout &DL, const TargetLibraryInfo *TLI); | ||
| 149 | |||
| 150 |   /// Emit a call to the bcmp function. | ||
| 151 | Value *emitBCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilderBase &B, | ||
| 152 | const DataLayout &DL, const TargetLibraryInfo *TLI); | ||
| 153 | |||
| 154 |   /// Emit a call to the memccpy function. | ||
| 155 | Value *emitMemCCpy(Value *Ptr1, Value *Ptr2, Value *Val, Value *Len, | ||
| 156 | IRBuilderBase &B, const TargetLibraryInfo *TLI); | ||
| 157 | |||
| 158 |   /// Emit a call to the snprintf function. | ||
| 159 | Value *emitSNPrintf(Value *Dest, Value *Size, Value *Fmt, | ||
| 160 | ArrayRef<Value *> Args, IRBuilderBase &B, | ||
| 161 | const TargetLibraryInfo *TLI); | ||
| 162 | |||
| 163 |   /// Emit a call to the sprintf function. | ||
| 164 | Value *emitSPrintf(Value *Dest, Value *Fmt, ArrayRef<Value *> VariadicArgs, | ||
| 165 | IRBuilderBase &B, const TargetLibraryInfo *TLI); | ||
| 166 | |||
| 167 |   /// Emit a call to the strcat function. | ||
| 168 | Value *emitStrCat(Value *Dest, Value *Src, IRBuilderBase &B, | ||
| 169 | const TargetLibraryInfo *TLI); | ||
| 170 | |||
| 171 |   /// Emit a call to the strlcpy function. | ||
| 172 | Value *emitStrLCpy(Value *Dest, Value *Src, Value *Size, IRBuilderBase &B, | ||
| 173 | const TargetLibraryInfo *TLI); | ||
| 174 | |||
| 175 |   /// Emit a call to the strlcat function. | ||
| 176 | Value *emitStrLCat(Value *Dest, Value *Src, Value *Size, IRBuilderBase &B, | ||
| 177 | const TargetLibraryInfo *TLI); | ||
| 178 | |||
| 179 |   /// Emit a call to the strncat function. | ||
| 180 | Value *emitStrNCat(Value *Dest, Value *Src, Value *Size, IRBuilderBase &B, | ||
| 181 | const TargetLibraryInfo *TLI); | ||
| 182 | |||
| 183 |   /// Emit a call to the vsnprintf function. | ||
| 184 | Value *emitVSNPrintf(Value *Dest, Value *Size, Value *Fmt, Value *VAList, | ||
| 185 | IRBuilderBase &B, const TargetLibraryInfo *TLI); | ||
| 186 | |||
| 187 |   /// Emit a call to the vsprintf function. | ||
| 188 | Value *emitVSPrintf(Value *Dest, Value *Fmt, Value *VAList, IRBuilderBase &B, | ||
| 189 | const TargetLibraryInfo *TLI); | ||
| 190 | |||
| 191 |   /// Emit a call to the unary function named 'Name' (e.g.  'floor'). This | ||
| 192 |   /// function is known to take a single of type matching 'Op' and returns one | ||
| 193 |   /// value with the same type. If 'Op' is a long double, 'l' is added as the | ||
| 194 |   /// suffix of name, if 'Op' is a float, we add a 'f' suffix. | ||
| 195 | Value *emitUnaryFloatFnCall(Value *Op, const TargetLibraryInfo *TLI, | ||
| 196 |                               StringRef Name, IRBuilderBase &B, | ||
| 197 | const AttributeList &Attrs); | ||
| 198 | |||
| 199 |   /// Emit a call to the unary function DoubleFn, FloatFn or LongDoubleFn, | ||
| 200 |   /// depending of the type of Op. | ||
| 201 | Value *emitUnaryFloatFnCall(Value *Op, const TargetLibraryInfo *TLI, | ||
| 202 | LibFunc DoubleFn, LibFunc FloatFn, | ||
| 203 |                               LibFunc LongDoubleFn, IRBuilderBase &B, | ||
| 204 | const AttributeList &Attrs); | ||
| 205 | |||
| 206 |   /// Emit a call to the binary function named 'Name' (e.g. 'fmin'). This | ||
| 207 |   /// function is known to take type matching 'Op1' and 'Op2' and return one | ||
| 208 |   /// value with the same type. If 'Op1/Op2' are long double, 'l' is added as | ||
| 209 |   /// the suffix of name, if 'Op1/Op2' are float, we add a 'f' suffix. | ||
| 210 | Value *emitBinaryFloatFnCall(Value *Op1, Value *Op2, | ||
| 211 | const TargetLibraryInfo *TLI, | ||
| 212 |                                StringRef Name, IRBuilderBase &B, | ||
| 213 | const AttributeList &Attrs); | ||
| 214 | |||
| 215 |   /// Emit a call to the binary function DoubleFn, FloatFn or LongDoubleFn, | ||
| 216 |   /// depending of the type of Op1. | ||
| 217 | Value *emitBinaryFloatFnCall(Value *Op1, Value *Op2, | ||
| 218 | const TargetLibraryInfo *TLI, LibFunc DoubleFn, | ||
| 219 | LibFunc FloatFn, LibFunc LongDoubleFn, | ||
| 220 | IRBuilderBase &B, const AttributeList &Attrs); | ||
| 221 | |||
| 222 |   /// Emit a call to the putchar function. This assumes that Char is an 'int'. | ||
| 223 | Value *emitPutChar(Value *Char, IRBuilderBase &B, | ||
| 224 | const TargetLibraryInfo *TLI); | ||
| 225 | |||
| 226 |   /// Emit a call to the puts function. This assumes that Str is some pointer. | ||
| 227 | Value *emitPutS(Value *Str, IRBuilderBase &B, const TargetLibraryInfo *TLI); | ||
| 228 | |||
| 229 |   /// Emit a call to the fputc function. This assumes that Char is an 'int', and | ||
| 230 |   /// File is a pointer to FILE. | ||
| 231 | Value *emitFPutC(Value *Char, Value *File, IRBuilderBase &B, | ||
| 232 | const TargetLibraryInfo *TLI); | ||
| 233 | |||
| 234 |   /// Emit a call to the fputs function. Str is required to be a pointer and | ||
| 235 |   /// File is a pointer to FILE. | ||
| 236 | Value *emitFPutS(Value *Str, Value *File, IRBuilderBase &B, | ||
| 237 | const TargetLibraryInfo *TLI); | ||
| 238 | |||
| 239 |   /// Emit a call to the fwrite function. This assumes that Ptr is a pointer, | ||
| 240 |   /// Size is an 'size_t', and File is a pointer to FILE. | ||
| 241 | Value *emitFWrite(Value *Ptr, Value *Size, Value *File, IRBuilderBase &B, | ||
| 242 | const DataLayout &DL, const TargetLibraryInfo *TLI); | ||
| 243 | |||
| 244 |   /// Emit a call to the malloc function. | ||
| 245 | Value *emitMalloc(Value *Num, IRBuilderBase &B, const DataLayout &DL, | ||
| 246 | const TargetLibraryInfo *TLI); | ||
| 247 | |||
| 248 |   /// Emit a call to the calloc function. | ||
| 249 | Value *emitCalloc(Value *Num, Value *Size, IRBuilderBase &B, | ||
| 250 | const TargetLibraryInfo &TLI); | ||
| 251 | } | ||
| 252 | |||
| 253 | #endif |