TargetLibraryInfo.h revision 6871d1eceba0455707de29708c36ae3c2778c160
1ce99120084f549a523213064648662a704e8b789Chris Lattner//===-- llvm/Target/TargetLibraryInfo.h - Library information ---*- C++ -*-===// 2ce99120084f549a523213064648662a704e8b789Chris Lattner// 3ce99120084f549a523213064648662a704e8b789Chris Lattner// The LLVM Compiler Infrastructure 4ce99120084f549a523213064648662a704e8b789Chris Lattner// 5ce99120084f549a523213064648662a704e8b789Chris Lattner// This file is distributed under the University of Illinois Open Source 6ce99120084f549a523213064648662a704e8b789Chris Lattner// License. See LICENSE.TXT for details. 7ce99120084f549a523213064648662a704e8b789Chris Lattner// 8ce99120084f549a523213064648662a704e8b789Chris Lattner//===----------------------------------------------------------------------===// 9ce99120084f549a523213064648662a704e8b789Chris Lattner 10ce99120084f549a523213064648662a704e8b789Chris Lattner#ifndef LLVM_TARGET_TARGETLIBRARYINFO_H 11ce99120084f549a523213064648662a704e8b789Chris Lattner#define LLVM_TARGET_TARGETLIBRARYINFO_H 12ce99120084f549a523213064648662a704e8b789Chris Lattner 13ce99120084f549a523213064648662a704e8b789Chris Lattner#include "llvm/Pass.h" 149d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman#include "llvm/ADT/DenseMap.h" 15ce99120084f549a523213064648662a704e8b789Chris Lattner 16ce99120084f549a523213064648662a704e8b789Chris Lattnernamespace llvm { 17ce99120084f549a523213064648662a704e8b789Chris Lattner class Triple; 18ce99120084f549a523213064648662a704e8b789Chris Lattner 19ce99120084f549a523213064648662a704e8b789Chris Lattner namespace LibFunc { 20ce99120084f549a523213064648662a704e8b789Chris Lattner enum Func { 21d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// int __cxa_atexit(void (*f)(void *), void *p, void *d); 22d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson cxa_atexit, 23d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// void __cxa_guard_abort(guard_t *guard); 24d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// guard_t is int64_t in Itanium ABI or int32_t on ARM eabi. 25d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson cxa_guard_abort, 26d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// int __cxa_guard_acquire(guard_t *guard); 27d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson cxa_guard_acquire, 28d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// void __cxa_guard_release(guard_t *guard); 29d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson cxa_guard_release, 30d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// void *__memcpy_chk(void *s1, const void *s2, size_t n, size_t s1size); 31d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson memcpy_chk, 328ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double acos(double x); 338ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier acos, 348ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float acosf(float x); 358ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier acosf, 366871d1eceba0455707de29708c36ae3c2778c160Chad Rosier /// double acosh(double x); 376871d1eceba0455707de29708c36ae3c2778c160Chad Rosier acosh, 386871d1eceba0455707de29708c36ae3c2778c160Chad Rosier /// float acoshf(float x); 396871d1eceba0455707de29708c36ae3c2778c160Chad Rosier acoshf, 406871d1eceba0455707de29708c36ae3c2778c160Chad Rosier /// long double acoshl(long double x); 416871d1eceba0455707de29708c36ae3c2778c160Chad Rosier acoshl, 42d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// long double acosl(long double x); 43d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson acosl, 448ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double asin(double x); 458ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier asin, 468ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float asinf(float x); 478ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier asinf, 486871d1eceba0455707de29708c36ae3c2778c160Chad Rosier /// double asinh(double x); 496871d1eceba0455707de29708c36ae3c2778c160Chad Rosier asinh, 506871d1eceba0455707de29708c36ae3c2778c160Chad Rosier /// float asinhf(float x); 516871d1eceba0455707de29708c36ae3c2778c160Chad Rosier asinhf, 526871d1eceba0455707de29708c36ae3c2778c160Chad Rosier /// long double asinhl(long double x); 536871d1eceba0455707de29708c36ae3c2778c160Chad Rosier asinhl, 54d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// long double asinl(long double x); 55d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson asinl, 568ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double atan(double x); 578ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier atan, 5832b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// double atan2(double y, double x); 5932b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier atan2, 6032b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// float atan2f(float y, float x); 6132b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier atan2f, 62d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// long double atan2l(long double y, long double x); 63d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson atan2l, 64d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// float atanf(float x); 65d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson atanf, 666871d1eceba0455707de29708c36ae3c2778c160Chad Rosier /// double atanh(double x); 676871d1eceba0455707de29708c36ae3c2778c160Chad Rosier atanh, 686871d1eceba0455707de29708c36ae3c2778c160Chad Rosier /// float atanhf(float x); 696871d1eceba0455707de29708c36ae3c2778c160Chad Rosier atanhf, 706871d1eceba0455707de29708c36ae3c2778c160Chad Rosier /// long double atanhl(long double x); 716871d1eceba0455707de29708c36ae3c2778c160Chad Rosier atanhl, 72d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// long double atanl(long double x); 73d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson atanl, 746871d1eceba0455707de29708c36ae3c2778c160Chad Rosier /// double cbrt(double x); 756871d1eceba0455707de29708c36ae3c2778c160Chad Rosier cbrt, 766871d1eceba0455707de29708c36ae3c2778c160Chad Rosier /// float cbrtf(float x); 776871d1eceba0455707de29708c36ae3c2778c160Chad Rosier cbrtf, 786871d1eceba0455707de29708c36ae3c2778c160Chad Rosier /// long double cbrtl(long double x); 796871d1eceba0455707de29708c36ae3c2778c160Chad Rosier cbrtl, 808ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double ceil(double x); 818ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier ceil, 828ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float ceilf(float x); 838ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier ceilf, 84d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// long double ceill(long double x); 85d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson ceill, 86243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// double copysign(double x, double y); 87243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson copysign, 88243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// float copysignf(float x, float y); 89243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson copysignf, 90243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// long double copysignl(long double x, long double y); 91243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson copysignl, 928ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double cos(double x); 938ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier cos, 948ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float cosf(float x); 958ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier cosf, 968ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double cosh(double x); 978ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier cosh, 988ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float coshf(float x); 998ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier coshf, 100d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// long double coshl(long double x); 101d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson coshl, 102d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// long double cosl(long double x); 103d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson cosl, 1048ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double exp(double x); 1058ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier exp, 1066871d1eceba0455707de29708c36ae3c2778c160Chad Rosier /// double exp10(double x); 1076871d1eceba0455707de29708c36ae3c2778c160Chad Rosier exp10, 1086871d1eceba0455707de29708c36ae3c2778c160Chad Rosier /// float exp10f(float x); 1096871d1eceba0455707de29708c36ae3c2778c160Chad Rosier exp10f, 1106871d1eceba0455707de29708c36ae3c2778c160Chad Rosier /// long double exp10l(long double x); 1116871d1eceba0455707de29708c36ae3c2778c160Chad Rosier exp10l, 1128ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double exp2(double x); 1138ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier exp2, 1148ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float exp2f(float x); 1158ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier exp2f, 116d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// long double exp2l(long double x); 117d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson exp2l, 118d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// float expf(float x); 119d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson expf, 120d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// long double expl(long double x); 121d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson expl, 1228ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double expm1(double x); 1238ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier expm1, 1248ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float expm1f(float x); 125d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff expm1f, 126d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// long double expm1l(long double x); 127d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson expm1l, 1288ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double fabs(double x); 1298ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier fabs, 1308ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float fabsf(float x); 1318ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier fabsf, 132d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// long double fabsl(long double x); 133d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson fabsl, 134d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// int fiprintf(FILE *stream, const char *format, ...); 135d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson fiprintf, 1368ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double floor(double x); 1378ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier floor, 1388ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float floorf(float x); 1398ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier floorf, 140d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// long double floorl(long double x); 141d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson floorl, 14232b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// double fmod(double x, double y); 14332b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier fmod, 14432b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// float fmodf(float x, float y); 14532b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier fmodf, 146d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// long double fmodl(long double x, long double y); 147d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson fmodl, 1488d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes /// int fputc(int c, FILE *stream); 1498d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes fputc, 150683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier /// int fputs(const char *s, FILE *stream); 151683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier fputs, 152683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier /// size_t fwrite(const void *ptr, size_t size, size_t nitems, 153683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier /// FILE *stream); 154683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier fwrite, 155683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier /// int iprintf(const char *format, ...); 156683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier iprintf, 1578ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double log(double x); 1588ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier log, 1598ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double log10(double x); 1608ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier log10, 1618ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float log10f(float x); 1628ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier log10f, 163d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// long double log10l(long double x); 164d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson log10l, 1658ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double log1p(double x); 1668ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier log1p, 1678ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float log1pf(float x); 1688ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier log1pf, 169d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// long double log1pl(long double x); 170d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson log1pl, 171d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// double log2(double x); 172d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson log2, 173d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// float log2f(float x); 174d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson log2f, 175d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// double long double log2l(long double x); 176d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson log2l, 1776871d1eceba0455707de29708c36ae3c2778c160Chad Rosier /// double logb(double x); 1786871d1eceba0455707de29708c36ae3c2778c160Chad Rosier logb, 1796871d1eceba0455707de29708c36ae3c2778c160Chad Rosier /// float logbf(float x); 1806871d1eceba0455707de29708c36ae3c2778c160Chad Rosier logbf, 1816871d1eceba0455707de29708c36ae3c2778c160Chad Rosier /// long double logbl(long double x); 1826871d1eceba0455707de29708c36ae3c2778c160Chad Rosier logbl, 183d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// float logf(float x); 184d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson logf, 185d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// long double logl(long double x); 186d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson logl, 1878d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes /// void *memchr(const void *s, int c, size_t n); 1888d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes memchr, 1898d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes /// int memcmp(const void *s1, const void *s2, size_t n); 1908d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes memcmp, 191683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier /// void *memcpy(void *s1, const void *s2, size_t n); 192398c0d8b7417dedbe244020ffb67abb54aaa1c59Chris Lattner memcpy, 193683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier /// void *memmove(void *s1, const void *s2, size_t n); 194149f5283f93ec85b96888c284f56099a72cc2731Chris Lattner memmove, 195683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier /// void *memset(void *b, int c, size_t len); 196683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier memset, 197ce99120084f549a523213064648662a704e8b789Chris Lattner /// void memset_pattern16(void *b, const void *pattern16, size_t len); 198ce99120084f549a523213064648662a704e8b789Chris Lattner memset_pattern16, 199243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// double nearbyint(double x); 200243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson nearbyint, 201243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// float nearbyintf(float x); 202243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson nearbyintf, 203243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// long double nearbyintl(long double x); 204243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson nearbyintl, 2058ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double pow(double x, double y); 2068ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier pow, 2078ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float powf(float x, float y); 2088ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier powf, 2098ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// long double powl(long double x, long double y); 2108ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier powl, 2118d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes /// int putchar(int c); 2128d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes putchar, 2138d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes /// int puts(const char *s); 2148d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes puts, 215243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// double rint(double x); 216243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson rint, 217243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// float rintf(float x); 218243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson rintf, 219d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff /// long double rintl(long double x); 220243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson rintl, 221d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff /// double round(double x); 222d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff round, 223d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff /// float roundf(float x); 224d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff roundf, 225d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff /// long double roundl(long double x); 226d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff roundl, 22732b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// double sin(double x); 22832b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier sin, 22932b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// float sinf(float x); 23032b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier sinf, 23132b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// double sinh(double x); 23232b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier sinh, 23332b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// float sinhf(float x); 23432b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier sinhf, 235d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// long double sinhl(long double x); 236d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson sinhl, 237d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// long double sinl(long double x); 238d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson sinl, 239419454ad3720b8cf4613d9e790669c8beaccd1a4Richard Osborne /// int siprintf(char *str, const char *format, ...); 240419454ad3720b8cf4613d9e790669c8beaccd1a4Richard Osborne siprintf, 2413d925d24e8c54cde05228258c25cc21687cad922Chad Rosier /// double sqrt(double x); 2423d925d24e8c54cde05228258c25cc21687cad922Chad Rosier sqrt, 2433d925d24e8c54cde05228258c25cc21687cad922Chad Rosier /// float sqrtf(float x); 2443d925d24e8c54cde05228258c25cc21687cad922Chad Rosier sqrtf, 245d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// long double sqrtl(long double x); 246d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson sqrtl, 2470841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes /// char *strcat(char *s1, const char *s2); 2480841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes strcat, 2498d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes /// char *strchr(const char *s, int c); 2508d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes strchr, 2510841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes /// char *strcpy(char *s1, const char *s2); 2520841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes strcpy, 2530841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes /// size_t strlen(const char *s); 2540841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes strlen, 2550841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes /// char *strncat(char *s1, const char *s2, size_t n); 2560841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes strncat, 2578d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes /// int strncmp(const char *s1, const char *s2, size_t n); 2588d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes strncmp, 2590841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes /// char *strncpy(char *s1, const char *s2, size_t n); 2600841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes strncpy, 2610841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes /// size_t strnlen(const char *s, size_t maxlen); 2620841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes strnlen, 26332b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// double tan(double x); 26432b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier tan, 26532b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// float tanf(float x); 26632b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier tanf, 26732b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// double tanh(double x); 26832b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier tanh, 26932b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// float tanhf(float x); 27032b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier tanhf, 271d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// long double tanhl(long double x); 272d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson tanhl, 273d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// long double tanl(long double x); 274d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson tanl, 275243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// double trunc(double x); 276243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson trunc, 277243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// float truncf(float x); 278243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson truncf, 279243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// long double truncl(long double x); 280243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson truncl, 2819d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman 282ce99120084f549a523213064648662a704e8b789Chris Lattner NumLibFuncs 283ce99120084f549a523213064648662a704e8b789Chris Lattner }; 284ce99120084f549a523213064648662a704e8b789Chris Lattner } 285ce99120084f549a523213064648662a704e8b789Chris Lattner 286ce99120084f549a523213064648662a704e8b789Chris Lattner/// TargetLibraryInfo - This immutable pass captures information about what 287ce99120084f549a523213064648662a704e8b789Chris Lattner/// library functions are available for the current target, and allows a 288ce99120084f549a523213064648662a704e8b789Chris Lattner/// frontend to disable optimizations through -fno-builtin etc. 289ce99120084f549a523213064648662a704e8b789Chris Lattnerclass TargetLibraryInfo : public ImmutablePass { 2902d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 2919d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman unsigned char AvailableArray[(LibFunc::NumLibFuncs+3)/4]; 2929d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman llvm::DenseMap<unsigned, std::string> CustomNames; 2939d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman static const char* StandardNames[LibFunc::NumLibFuncs]; 2949d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman 2959d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman enum AvailabilityState { 2969d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman StandardName = 3, // (memset to all ones) 2979d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman CustomName = 1, 2989d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman Unavailable = 0 // (memset to all zeros) 2999d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman }; 3009d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman void setState(LibFunc::Func F, AvailabilityState State) { 3019d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman AvailableArray[F/4] &= ~(3 << 2*(F&3)); 3029d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman AvailableArray[F/4] |= State << 2*(F&3); 3039d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman } 3049d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman AvailabilityState getState(LibFunc::Func F) const { 3059d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman return static_cast<AvailabilityState>((AvailableArray[F/4] >> 2*(F&3)) & 3); 3069d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman } 3079d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman 308ce99120084f549a523213064648662a704e8b789Chris Lattnerpublic: 309ce99120084f549a523213064648662a704e8b789Chris Lattner static char ID; 310ce99120084f549a523213064648662a704e8b789Chris Lattner TargetLibraryInfo(); 311ce99120084f549a523213064648662a704e8b789Chris Lattner TargetLibraryInfo(const Triple &T); 31240f5fbcc5c95bb96c43ce2d06d57ae9b7f852539Chris Lattner explicit TargetLibraryInfo(const TargetLibraryInfo &TLI); 313ce99120084f549a523213064648662a704e8b789Chris Lattner 314d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// getLibFunc - Search for a particular function name. If it is one of the 315d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// known library functions, return true and set F to the corresponding value. 316d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson bool getLibFunc(StringRef funcName, LibFunc::Func &F) const; 317d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson 318ce99120084f549a523213064648662a704e8b789Chris Lattner /// has - This function is used by optimizations that want to match on or form 319ce99120084f549a523213064648662a704e8b789Chris Lattner /// a given library function. 320ce99120084f549a523213064648662a704e8b789Chris Lattner bool has(LibFunc::Func F) const { 3219d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman return getState(F) != Unavailable; 3229d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman } 3239d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman 324982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson /// hasOptimizedCodeGen - Return true if the function is both available as 325982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson /// a builtin and a candidate for optimized code generation. 326982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson bool hasOptimizedCodeGen(LibFunc::Func F) const { 327982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson if (getState(F) == Unavailable) 328982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson return false; 329982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson switch (F) { 330982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson default: break; 331982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson case LibFunc::copysign: case LibFunc::copysignf: case LibFunc::copysignl: 332982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson case LibFunc::fabs: case LibFunc::fabsf: case LibFunc::fabsl: 333982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson case LibFunc::sin: case LibFunc::sinf: case LibFunc::sinl: 334982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson case LibFunc::cos: case LibFunc::cosf: case LibFunc::cosl: 335982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson case LibFunc::sqrt: case LibFunc::sqrtf: case LibFunc::sqrtl: 336982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson case LibFunc::floor: case LibFunc::floorf: case LibFunc::floorl: 337982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson case LibFunc::nearbyint: case LibFunc::nearbyintf: case LibFunc::nearbyintl: 338982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson case LibFunc::ceil: case LibFunc::ceilf: case LibFunc::ceill: 339982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson case LibFunc::rint: case LibFunc::rintf: case LibFunc::rintl: 340982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson case LibFunc::trunc: case LibFunc::truncf: case LibFunc::truncl: 341982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson case LibFunc::log2: case LibFunc::log2f: case LibFunc::log2l: 342982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson case LibFunc::exp2: case LibFunc::exp2f: case LibFunc::exp2l: 343982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson case LibFunc::memcmp: 344982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson return true; 345982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson } 346982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson return false; 347982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson } 348982dc84762fc0c2ca35e6947d648a690dd22343cBob Wilson 3499d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman StringRef getName(LibFunc::Func F) const { 3509d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman AvailabilityState State = getState(F); 3519d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman if (State == Unavailable) 3529d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman return StringRef(); 3539d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman if (State == StandardName) 3549d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman return StandardNames[F]; 3559d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman assert(State == CustomName); 3569d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman return CustomNames.find(F)->second; 357ce99120084f549a523213064648662a704e8b789Chris Lattner } 358ce99120084f549a523213064648662a704e8b789Chris Lattner 359ce99120084f549a523213064648662a704e8b789Chris Lattner /// setUnavailable - this can be used by whatever sets up TargetLibraryInfo to 360ce99120084f549a523213064648662a704e8b789Chris Lattner /// ban use of specific library functions. 361ce99120084f549a523213064648662a704e8b789Chris Lattner void setUnavailable(LibFunc::Func F) { 3629d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman setState(F, Unavailable); 363ce99120084f549a523213064648662a704e8b789Chris Lattner } 364ce99120084f549a523213064648662a704e8b789Chris Lattner 365ce99120084f549a523213064648662a704e8b789Chris Lattner void setAvailable(LibFunc::Func F) { 3669d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman setState(F, StandardName); 367ce99120084f549a523213064648662a704e8b789Chris Lattner } 3689d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman 3699d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman void setAvailableWithName(LibFunc::Func F, StringRef Name) { 3709d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman if (StandardNames[F] != Name) { 3719d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman setState(F, CustomName); 3729d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman CustomNames[F] = Name; 3739d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman assert(CustomNames.find(F) != CustomNames.end()); 3749d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman } else { 3759d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman setState(F, StandardName); 3769d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman } 3779d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman } 3789d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman 379188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner /// disableAllFunctions - This disables all builtins, which is used for 380188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner /// options like -fno-builtin. 381188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner void disableAllFunctions(); 382ce99120084f549a523213064648662a704e8b789Chris Lattner}; 383ce99120084f549a523213064648662a704e8b789Chris Lattner 384ce99120084f549a523213064648662a704e8b789Chris Lattner} // end namespace llvm 385ce99120084f549a523213064648662a704e8b789Chris Lattner 386ce99120084f549a523213064648662a704e8b789Chris Lattner#endif 387