1//===-- TargetLibraryInfo.cpp - Runtime library 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 implements the TargetLibraryInfo class. 11// 12//===----------------------------------------------------------------------===// 13 14#include "llvm/Target/TargetLibraryInfo.h" 15#include "llvm/ADT/Triple.h" 16using namespace llvm; 17 18// Register the default implementation. 19INITIALIZE_PASS(TargetLibraryInfo, "targetlibinfo", 20 "Target Library Information", false, true) 21char TargetLibraryInfo::ID = 0; 22 23void TargetLibraryInfo::anchor() { } 24 25const char* TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] = 26 { 27 "_ZdaPv", 28 "_ZdlPv", 29 "_Znaj", 30 "_ZnajRKSt9nothrow_t", 31 "_Znam", 32 "_ZnamRKSt9nothrow_t", 33 "_Znwj", 34 "_ZnwjRKSt9nothrow_t", 35 "_Znwm", 36 "_ZnwmRKSt9nothrow_t", 37 "__cxa_atexit", 38 "__cxa_guard_abort", 39 "__cxa_guard_acquire", 40 "__cxa_guard_release", 41 "__memcpy_chk", 42 "acos", 43 "acosf", 44 "acosh", 45 "acoshf", 46 "acoshl", 47 "acosl", 48 "asin", 49 "asinf", 50 "asinh", 51 "asinhf", 52 "asinhl", 53 "asinl", 54 "atan", 55 "atan2", 56 "atan2f", 57 "atan2l", 58 "atanf", 59 "atanh", 60 "atanhf", 61 "atanhl", 62 "atanl", 63 "calloc", 64 "cbrt", 65 "cbrtf", 66 "cbrtl", 67 "ceil", 68 "ceilf", 69 "ceill", 70 "copysign", 71 "copysignf", 72 "copysignl", 73 "cos", 74 "cosf", 75 "cosh", 76 "coshf", 77 "coshl", 78 "cosl", 79 "exp", 80 "exp10", 81 "exp10f", 82 "exp10l", 83 "exp2", 84 "exp2f", 85 "exp2l", 86 "expf", 87 "expl", 88 "expm1", 89 "expm1f", 90 "expm1l", 91 "fabs", 92 "fabsf", 93 "fabsl", 94 "fiprintf", 95 "floor", 96 "floorf", 97 "floorl", 98 "fmod", 99 "fmodf", 100 "fmodl", 101 "fputc", 102 "fputs", 103 "free", 104 "fwrite", 105 "iprintf", 106 "log", 107 "log10", 108 "log10f", 109 "log10l", 110 "log1p", 111 "log1pf", 112 "log1pl", 113 "log2", 114 "log2f", 115 "log2l", 116 "logb", 117 "logbf", 118 "logbl", 119 "logf", 120 "logl", 121 "malloc", 122 "memchr", 123 "memcmp", 124 "memcpy", 125 "memmove", 126 "memset", 127 "memset_pattern16", 128 "nearbyint", 129 "nearbyintf", 130 "nearbyintl", 131 "posix_memalign", 132 "pow", 133 "powf", 134 "powl", 135 "putchar", 136 "puts", 137 "realloc", 138 "reallocf", 139 "rint", 140 "rintf", 141 "rintl", 142 "round", 143 "roundf", 144 "roundl", 145 "sin", 146 "sinf", 147 "sinh", 148 "sinhf", 149 "sinhl", 150 "sinl", 151 "siprintf", 152 "sqrt", 153 "sqrtf", 154 "sqrtl", 155 "strcat", 156 "strchr", 157 "strcpy", 158 "strdup", 159 "strlen", 160 "strncat", 161 "strncmp", 162 "strncpy", 163 "strndup", 164 "strnlen", 165 "tan", 166 "tanf", 167 "tanh", 168 "tanhf", 169 "tanhl", 170 "tanl", 171 "trunc", 172 "truncf", 173 "truncl", 174 "valloc" 175 }; 176 177/// initialize - Initialize the set of available library functions based on the 178/// specified target triple. This should be carefully written so that a missing 179/// target triple gets a sane set of defaults. 180static void initialize(TargetLibraryInfo &TLI, const Triple &T, 181 const char **StandardNames) { 182 initializeTargetLibraryInfoPass(*PassRegistry::getPassRegistry()); 183 184#ifndef NDEBUG 185 // Verify that the StandardNames array is in alphabetical order. 186 for (unsigned F = 1; F < LibFunc::NumLibFuncs; ++F) { 187 if (strcmp(StandardNames[F-1], StandardNames[F]) >= 0) 188 llvm_unreachable("TargetLibraryInfo function names must be sorted"); 189 } 190#endif // !NDEBUG 191 192 // memset_pattern16 is only available on iOS 3.0 and Mac OS/X 10.5 and later. 193 if (T.isMacOSX()) { 194 if (T.isMacOSXVersionLT(10, 5)) 195 TLI.setUnavailable(LibFunc::memset_pattern16); 196 } else if (T.getOS() == Triple::IOS) { 197 if (T.isOSVersionLT(3, 0)) 198 TLI.setUnavailable(LibFunc::memset_pattern16); 199 } else { 200 TLI.setUnavailable(LibFunc::memset_pattern16); 201 } 202 203 if (T.isMacOSX() && T.getArch() == Triple::x86 && 204 !T.isMacOSXVersionLT(10, 7)) { 205 // x86-32 OSX has a scheme where fwrite and fputs (and some other functions 206 // we don't care about) have two versions; on recent OSX, the one we want 207 // has a $UNIX2003 suffix. The two implementations are identical except 208 // for the return value in some edge cases. However, we don't want to 209 // generate code that depends on the old symbols. 210 TLI.setAvailableWithName(LibFunc::fwrite, "fwrite$UNIX2003"); 211 TLI.setAvailableWithName(LibFunc::fputs, "fputs$UNIX2003"); 212 } 213 214 // iprintf and friends are only available on XCore and TCE. 215 if (T.getArch() != Triple::xcore && T.getArch() != Triple::tce) { 216 TLI.setUnavailable(LibFunc::iprintf); 217 TLI.setUnavailable(LibFunc::siprintf); 218 TLI.setUnavailable(LibFunc::fiprintf); 219 } 220 221 if (T.getOS() == Triple::Win32) { 222 // Win32 does not support long double 223 TLI.setUnavailable(LibFunc::acosl); 224 TLI.setUnavailable(LibFunc::asinl); 225 TLI.setUnavailable(LibFunc::atanl); 226 TLI.setUnavailable(LibFunc::atan2l); 227 TLI.setUnavailable(LibFunc::ceill); 228 TLI.setUnavailable(LibFunc::copysignl); 229 TLI.setUnavailable(LibFunc::cosl); 230 TLI.setUnavailable(LibFunc::coshl); 231 TLI.setUnavailable(LibFunc::expl); 232 TLI.setUnavailable(LibFunc::fabsf); // Win32 and Win64 both lack fabsf 233 TLI.setUnavailable(LibFunc::fabsl); 234 TLI.setUnavailable(LibFunc::floorl); 235 TLI.setUnavailable(LibFunc::fmodl); 236 TLI.setUnavailable(LibFunc::logl); 237 TLI.setUnavailable(LibFunc::powl); 238 TLI.setUnavailable(LibFunc::sinl); 239 TLI.setUnavailable(LibFunc::sinhl); 240 TLI.setUnavailable(LibFunc::sqrtl); 241 TLI.setUnavailable(LibFunc::tanl); 242 TLI.setUnavailable(LibFunc::tanhl); 243 244 // Win32 only has C89 math 245 TLI.setUnavailable(LibFunc::acosh); 246 TLI.setUnavailable(LibFunc::acoshf); 247 TLI.setUnavailable(LibFunc::acoshl); 248 TLI.setUnavailable(LibFunc::asinh); 249 TLI.setUnavailable(LibFunc::asinhf); 250 TLI.setUnavailable(LibFunc::asinhl); 251 TLI.setUnavailable(LibFunc::atanh); 252 TLI.setUnavailable(LibFunc::atanhf); 253 TLI.setUnavailable(LibFunc::atanhl); 254 TLI.setUnavailable(LibFunc::cbrt); 255 TLI.setUnavailable(LibFunc::cbrtf); 256 TLI.setUnavailable(LibFunc::cbrtl); 257 TLI.setUnavailable(LibFunc::exp10); 258 TLI.setUnavailable(LibFunc::exp10f); 259 TLI.setUnavailable(LibFunc::exp10l); 260 TLI.setUnavailable(LibFunc::exp2); 261 TLI.setUnavailable(LibFunc::exp2f); 262 TLI.setUnavailable(LibFunc::exp2l); 263 TLI.setUnavailable(LibFunc::expm1); 264 TLI.setUnavailable(LibFunc::expm1f); 265 TLI.setUnavailable(LibFunc::expm1l); 266 TLI.setUnavailable(LibFunc::log2); 267 TLI.setUnavailable(LibFunc::log2f); 268 TLI.setUnavailable(LibFunc::log2l); 269 TLI.setUnavailable(LibFunc::log1p); 270 TLI.setUnavailable(LibFunc::log1pf); 271 TLI.setUnavailable(LibFunc::log1pl); 272 TLI.setUnavailable(LibFunc::logb); 273 TLI.setUnavailable(LibFunc::logbf); 274 TLI.setUnavailable(LibFunc::logbl); 275 TLI.setUnavailable(LibFunc::nearbyint); 276 TLI.setUnavailable(LibFunc::nearbyintf); 277 TLI.setUnavailable(LibFunc::nearbyintl); 278 TLI.setUnavailable(LibFunc::rint); 279 TLI.setUnavailable(LibFunc::rintf); 280 TLI.setUnavailable(LibFunc::rintl); 281 TLI.setUnavailable(LibFunc::round); 282 TLI.setUnavailable(LibFunc::roundf); 283 TLI.setUnavailable(LibFunc::roundl); 284 TLI.setUnavailable(LibFunc::trunc); 285 TLI.setUnavailable(LibFunc::truncf); 286 TLI.setUnavailable(LibFunc::truncl); 287 288 // Win32 provides some C99 math with mangled names 289 TLI.setAvailableWithName(LibFunc::copysign, "_copysign"); 290 291 if (T.getArch() == Triple::x86) { 292 // Win32 on x86 implements single-precision math functions as macros 293 TLI.setUnavailable(LibFunc::acosf); 294 TLI.setUnavailable(LibFunc::asinf); 295 TLI.setUnavailable(LibFunc::atanf); 296 TLI.setUnavailable(LibFunc::atan2f); 297 TLI.setUnavailable(LibFunc::ceilf); 298 TLI.setUnavailable(LibFunc::copysignf); 299 TLI.setUnavailable(LibFunc::cosf); 300 TLI.setUnavailable(LibFunc::coshf); 301 TLI.setUnavailable(LibFunc::expf); 302 TLI.setUnavailable(LibFunc::floorf); 303 TLI.setUnavailable(LibFunc::fmodf); 304 TLI.setUnavailable(LibFunc::logf); 305 TLI.setUnavailable(LibFunc::powf); 306 TLI.setUnavailable(LibFunc::sinf); 307 TLI.setUnavailable(LibFunc::sinhf); 308 TLI.setUnavailable(LibFunc::sqrtf); 309 TLI.setUnavailable(LibFunc::tanf); 310 TLI.setUnavailable(LibFunc::tanhf); 311 } 312 } 313} 314 315 316TargetLibraryInfo::TargetLibraryInfo() : ImmutablePass(ID) { 317 // Default to everything being available. 318 memset(AvailableArray, -1, sizeof(AvailableArray)); 319 320 initialize(*this, Triple(), StandardNames); 321} 322 323TargetLibraryInfo::TargetLibraryInfo(const Triple &T) : ImmutablePass(ID) { 324 // Default to everything being available. 325 memset(AvailableArray, -1, sizeof(AvailableArray)); 326 327 initialize(*this, T, StandardNames); 328} 329 330TargetLibraryInfo::TargetLibraryInfo(const TargetLibraryInfo &TLI) 331 : ImmutablePass(ID) { 332 memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray)); 333 CustomNames = TLI.CustomNames; 334} 335 336bool TargetLibraryInfo::getLibFunc(StringRef funcName, 337 LibFunc::Func &F) const { 338 const char **Start = &StandardNames[0]; 339 const char **End = &StandardNames[LibFunc::NumLibFuncs]; 340 const char **I = std::lower_bound(Start, End, funcName); 341 if (I != End && *I == funcName) { 342 F = (LibFunc::Func)(I - Start); 343 return true; 344 } 345 return false; 346} 347 348/// disableAllFunctions - This disables all builtins, which is used for options 349/// like -fno-builtin. 350void TargetLibraryInfo::disableAllFunctions() { 351 memset(AvailableArray, 0, sizeof(AvailableArray)); 352} 353