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