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 |