TargetLibraryInfo.cpp revision 51004dff923259c90591621e7151408ad94e0eb8
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 "acos", 28 "acosl", 29 "acosf", 30 "asin", 31 "asinl", 32 "asinf", 33 "atan", 34 "atanl", 35 "atanf", 36 "atan2", 37 "atan2l", 38 "atan2f", 39 "ceil", 40 "ceill", 41 "ceilf", 42 "copysign", 43 "copysignf", 44 "copysignl", 45 "cos", 46 "cosl", 47 "cosf", 48 "cosh", 49 "coshl", 50 "coshf", 51 "exp", 52 "expl", 53 "expf", 54 "exp2", 55 "exp2l", 56 "exp2f", 57 "expm1", 58 "expm1l", 59 "expm1f", 60 "fabs", 61 "fabsl", 62 "fabsf", 63 "floor", 64 "floorl", 65 "floorf", 66 "fiprintf", 67 "fmod", 68 "fmodl", 69 "fmodf", 70 "fputc", 71 "fputs", 72 "fwrite", 73 "iprintf", 74 "log", 75 "logl", 76 "logf", 77 "log2", 78 "log2l", 79 "log2f", 80 "log10", 81 "log10l", 82 "log10f", 83 "log1p", 84 "log1pl", 85 "log1pf", 86 "memchr", 87 "memcmp", 88 "memcpy", 89 "memmove", 90 "memset", 91 "memset_pattern16", 92 "nearbyint", 93 "nearbyintf", 94 "nearbyintl", 95 "pow", 96 "powf", 97 "powl", 98 "putchar", 99 "puts", 100 "rint", 101 "rintf", 102 "rintl", 103 "round", 104 "roundf", 105 "roundl", 106 "sin", 107 "sinl", 108 "sinf", 109 "sinh", 110 "sinhl", 111 "sinhf", 112 "siprintf", 113 "sqrt", 114 "sqrtl", 115 "sqrtf", 116 "strcat", 117 "strchr", 118 "strcpy", 119 "strlen", 120 "strncat", 121 "strncmp", 122 "strncpy", 123 "strnlen", 124 "tan", 125 "tanl", 126 "tanf", 127 "tanh", 128 "tanhl", 129 "tanhf", 130 "trunc", 131 "truncf", 132 "truncl", 133 "__cxa_atexit", 134 "__cxa_guard_abort", 135 "__cxa_guard_acquire", 136 "__cxa_guard_release", 137 "__memcpy_chk" 138 }; 139 140/// initialize - Initialize the set of available library functions based on the 141/// specified target triple. This should be carefully written so that a missing 142/// target triple gets a sane set of defaults. 143static void initialize(TargetLibraryInfo &TLI, const Triple &T) { 144 initializeTargetLibraryInfoPass(*PassRegistry::getPassRegistry()); 145 146 147 // memset_pattern16 is only available on iOS 3.0 and Mac OS/X 10.5 and later. 148 if (T.isMacOSX()) { 149 if (T.isMacOSXVersionLT(10, 5)) 150 TLI.setUnavailable(LibFunc::memset_pattern16); 151 } else if (T.getOS() == Triple::IOS) { 152 if (T.isOSVersionLT(3, 0)) 153 TLI.setUnavailable(LibFunc::memset_pattern16); 154 } else { 155 TLI.setUnavailable(LibFunc::memset_pattern16); 156 } 157 158 if (T.isMacOSX() && T.getArch() == Triple::x86 && 159 !T.isMacOSXVersionLT(10, 7)) { 160 // x86-32 OSX has a scheme where fwrite and fputs (and some other functions 161 // we don't care about) have two versions; on recent OSX, the one we want 162 // has a $UNIX2003 suffix. The two implementations are identical except 163 // for the return value in some edge cases. However, we don't want to 164 // generate code that depends on the old symbols. 165 TLI.setAvailableWithName(LibFunc::fwrite, "fwrite$UNIX2003"); 166 TLI.setAvailableWithName(LibFunc::fputs, "fputs$UNIX2003"); 167 } 168 169 // iprintf and friends are only available on XCore and TCE. 170 if (T.getArch() != Triple::xcore && T.getArch() != Triple::tce) { 171 TLI.setUnavailable(LibFunc::iprintf); 172 TLI.setUnavailable(LibFunc::siprintf); 173 TLI.setUnavailable(LibFunc::fiprintf); 174 } 175 176 if (T.getOS() == Triple::Win32) { 177 // Win32 does not support long double 178 TLI.setUnavailable(LibFunc::acosl); 179 TLI.setUnavailable(LibFunc::asinl); 180 TLI.setUnavailable(LibFunc::atanl); 181 TLI.setUnavailable(LibFunc::atan2l); 182 TLI.setUnavailable(LibFunc::ceill); 183 TLI.setUnavailable(LibFunc::copysignl); 184 TLI.setUnavailable(LibFunc::cosl); 185 TLI.setUnavailable(LibFunc::coshl); 186 TLI.setUnavailable(LibFunc::expl); 187 TLI.setUnavailable(LibFunc::fabsf); // Win32 and Win64 both lack fabsf 188 TLI.setUnavailable(LibFunc::fabsl); 189 TLI.setUnavailable(LibFunc::floorl); 190 TLI.setUnavailable(LibFunc::fmodl); 191 TLI.setUnavailable(LibFunc::logl); 192 TLI.setUnavailable(LibFunc::powl); 193 TLI.setUnavailable(LibFunc::sinl); 194 TLI.setUnavailable(LibFunc::sinhl); 195 TLI.setUnavailable(LibFunc::sqrtl); 196 TLI.setUnavailable(LibFunc::tanl); 197 TLI.setUnavailable(LibFunc::tanhl); 198 199 // Win32 only has C89 math 200 TLI.setUnavailable(LibFunc::exp2); 201 TLI.setUnavailable(LibFunc::exp2f); 202 TLI.setUnavailable(LibFunc::exp2l); 203 TLI.setUnavailable(LibFunc::expm1); 204 TLI.setUnavailable(LibFunc::expm1f); 205 TLI.setUnavailable(LibFunc::expm1l); 206 TLI.setUnavailable(LibFunc::log2); 207 TLI.setUnavailable(LibFunc::log2f); 208 TLI.setUnavailable(LibFunc::log2l); 209 TLI.setUnavailable(LibFunc::log1p); 210 TLI.setUnavailable(LibFunc::log1pf); 211 TLI.setUnavailable(LibFunc::log1pl); 212 TLI.setUnavailable(LibFunc::nearbyint); 213 TLI.setUnavailable(LibFunc::nearbyintf); 214 TLI.setUnavailable(LibFunc::nearbyintl); 215 TLI.setUnavailable(LibFunc::rint); 216 TLI.setUnavailable(LibFunc::rintf); 217 TLI.setUnavailable(LibFunc::rintl); 218 TLI.setUnavailable(LibFunc::round); 219 TLI.setUnavailable(LibFunc::roundf); 220 TLI.setUnavailable(LibFunc::roundl); 221 TLI.setUnavailable(LibFunc::trunc); 222 TLI.setUnavailable(LibFunc::truncf); 223 TLI.setUnavailable(LibFunc::truncl); 224 225 // Win32 provides some C99 math with mangled names 226 TLI.setAvailableWithName(LibFunc::copysign, "_copysign"); 227 228 if (T.getArch() == Triple::x86) { 229 // Win32 on x86 implements single-precision math functions as macros 230 TLI.setUnavailable(LibFunc::acosf); 231 TLI.setUnavailable(LibFunc::asinf); 232 TLI.setUnavailable(LibFunc::atanf); 233 TLI.setUnavailable(LibFunc::atan2f); 234 TLI.setUnavailable(LibFunc::ceilf); 235 TLI.setUnavailable(LibFunc::copysignf); 236 TLI.setUnavailable(LibFunc::cosf); 237 TLI.setUnavailable(LibFunc::coshf); 238 TLI.setUnavailable(LibFunc::expf); 239 TLI.setUnavailable(LibFunc::floorf); 240 TLI.setUnavailable(LibFunc::fmodf); 241 TLI.setUnavailable(LibFunc::logf); 242 TLI.setUnavailable(LibFunc::powf); 243 TLI.setUnavailable(LibFunc::sinf); 244 TLI.setUnavailable(LibFunc::sinhf); 245 TLI.setUnavailable(LibFunc::sqrtf); 246 TLI.setUnavailable(LibFunc::tanf); 247 TLI.setUnavailable(LibFunc::tanhf); 248 } 249 } 250} 251 252 253TargetLibraryInfo::TargetLibraryInfo() : ImmutablePass(ID) { 254 // Default to everything being available. 255 memset(AvailableArray, -1, sizeof(AvailableArray)); 256 257 initialize(*this, Triple()); 258} 259 260TargetLibraryInfo::TargetLibraryInfo(const Triple &T) : ImmutablePass(ID) { 261 // Default to everything being available. 262 memset(AvailableArray, -1, sizeof(AvailableArray)); 263 264 initialize(*this, T); 265} 266 267TargetLibraryInfo::TargetLibraryInfo(const TargetLibraryInfo &TLI) 268 : ImmutablePass(ID) { 269 memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray)); 270 CustomNames = TLI.CustomNames; 271} 272 273 274/// disableAllFunctions - This disables all builtins, which is used for options 275/// like -fno-builtin. 276void TargetLibraryInfo::disableAllFunctions() { 277 memset(AvailableArray, 0, sizeof(AvailableArray)); 278} 279