TargetLibraryInfo.h revision 8d32463a9fa2aba9de552350a5019099edf0b90d
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 { 218ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double acos(double x); 228ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier acos, 238ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// long double acosl(long double x); 248ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier acosl, 258ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float acosf(float x); 268ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier acosf, 278ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double asin(double x); 288ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier asin, 298ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// long double asinl(long double x); 308ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier asinl, 318ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float asinf(float x); 328ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier asinf, 338ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double atan(double x); 348ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier atan, 358ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// long double atanl(long double x); 368ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier atanl, 378ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float atanf(float x); 388ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier atanf, 3932b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// double atan2(double y, double x); 4032b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier atan2, 4132b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// long double atan2l(long double y, long double x); 4232b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier atan2l, 4332b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// float atan2f(float y, float x); 4432b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier atan2f, 458ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double ceil(double x); 468ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier ceil, 478ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// long double ceill(long double x); 488ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier ceill, 498ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float ceilf(float x); 508ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier ceilf, 51243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// double copysign(double x, double y); 52243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson copysign, 53243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// float copysignf(float x, float y); 54243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson copysignf, 55243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// long double copysignl(long double x, long double y); 56243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson copysignl, 578ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double cos(double x); 588ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier cos, 598ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// long double cosl(long double x); 608ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier cosl, 618ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float cosf(float x); 628ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier cosf, 638ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double cosh(double x); 648ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier cosh, 658ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// long double coshl(long double x); 668ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier coshl, 678ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float coshf(float x); 688ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier coshf, 698ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double exp(double x); 708ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier exp, 718ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// long double expl(long double x); 728ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier expl, 738ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float expf(float x); 748ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier expf, 758ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double exp2(double x); 768ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier exp2, 778ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// long double exp2l(long double x); 788ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier exp2l, 798ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float exp2f(float x); 808ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier exp2f, 818ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double expm1(double x); 828ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier expm1, 838ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// long double expm1l(long double x); 848ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier expm1l, 858ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float expm1f(float x); 86d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff expm1f, 878ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double fabs(double x); 888ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier fabs, 898ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// long double fabsl(long double x); 908ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier fabsl, 918ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float fabsf(float x); 928ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier fabsf, 938ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double floor(double x); 948ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier floor, 958ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// long double floorl(long double x); 968ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier floorl, 978ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float floorf(float x); 988ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier floorf, 99683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier /// int fiprintf(FILE *stream, const char *format, ...); 100683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier fiprintf, 10132b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// double fmod(double x, double y); 10232b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier fmod, 10332b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// long double fmodl(long double x, long double y); 10432b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier fmodl, 10532b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// float fmodf(float x, float y); 10632b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier fmodf, 1078d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes /// int fputc(int c, FILE *stream); 1088d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes fputc, 109683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier /// int fputs(const char *s, FILE *stream); 110683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier fputs, 111683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier /// size_t fwrite(const void *ptr, size_t size, size_t nitems, 112683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier /// FILE *stream); 113683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier fwrite, 114683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier /// int iprintf(const char *format, ...); 115683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier iprintf, 1168ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double log(double x); 1178ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier log, 1188ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// long double logl(long double x); 1198ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier logl, 1208ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float logf(float x); 1218ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier logf, 1228ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double log2(double x); 1238ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier log2, 1248ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double long double log2l(long double x); 1258ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier log2l, 1268ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float log2f(float x); 1278ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier log2f, 1288ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double log10(double x); 1298ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier log10, 1308ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// long double log10l(long double x); 1318ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier log10l, 1328ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float log10f(float x); 1338ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier log10f, 1348ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double log1p(double x); 1358ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier log1p, 1368ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// long double log1pl(long double x); 1378ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier log1pl, 1388ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float log1pf(float x); 1398ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier log1pf, 1408d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes /// void *memchr(const void *s, int c, size_t n); 1418d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes memchr, 1428d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes /// int memcmp(const void *s1, const void *s2, size_t n); 1438d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes memcmp, 144683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier /// void *memcpy(void *s1, const void *s2, size_t n); 145398c0d8b7417dedbe244020ffb67abb54aaa1c59Chris Lattner memcpy, 146683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier /// void *memmove(void *s1, const void *s2, size_t n); 147149f5283f93ec85b96888c284f56099a72cc2731Chris Lattner memmove, 148683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier /// void *memset(void *b, int c, size_t len); 149683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier memset, 150ce99120084f549a523213064648662a704e8b789Chris Lattner /// void memset_pattern16(void *b, const void *pattern16, size_t len); 151ce99120084f549a523213064648662a704e8b789Chris Lattner memset_pattern16, 152243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// double nearbyint(double x); 153243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson nearbyint, 154243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// float nearbyintf(float x); 155243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson nearbyintf, 156243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// long double nearbyintl(long double x); 157243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson nearbyintl, 1588ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double pow(double x, double y); 1598ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier pow, 1608ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float powf(float x, float y); 1618ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier powf, 1628ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// long double powl(long double x, long double y); 1638ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier powl, 1648d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes /// int putchar(int c); 1658d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes putchar, 1668d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes /// int puts(const char *s); 1678d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes puts, 168243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// double rint(double x); 169243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson rint, 170243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// float rintf(float x); 171243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson rintf, 172d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff /// long double rintl(long double x); 173243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson rintl, 174d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff /// double round(double x); 175d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff round, 176d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff /// float roundf(float x); 177d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff roundf, 178d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff /// long double roundl(long double x); 179d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff roundl, 18032b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// double sin(double x); 18132b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier sin, 18232b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// long double sinl(long double x); 18332b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier sinl, 18432b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// float sinf(float x); 18532b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier sinf, 18632b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// double sinh(double x); 18732b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier sinh, 18832b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// long double sinhl(long double x); 18932b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier sinhl, 19032b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// float sinhf(float x); 19132b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier sinhf, 192419454ad3720b8cf4613d9e790669c8beaccd1a4Richard Osborne /// int siprintf(char *str, const char *format, ...); 193419454ad3720b8cf4613d9e790669c8beaccd1a4Richard Osborne siprintf, 1943d925d24e8c54cde05228258c25cc21687cad922Chad Rosier /// double sqrt(double x); 1953d925d24e8c54cde05228258c25cc21687cad922Chad Rosier sqrt, 1968ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// long double sqrtl(long double x); 1978ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier sqrtl, 1983d925d24e8c54cde05228258c25cc21687cad922Chad Rosier /// float sqrtf(float x); 1993d925d24e8c54cde05228258c25cc21687cad922Chad Rosier sqrtf, 2000841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes /// char *strcat(char *s1, const char *s2); 2010841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes strcat, 2028d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes /// char *strchr(const char *s, int c); 2038d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes strchr, 2040841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes /// char *strcpy(char *s1, const char *s2); 2050841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes strcpy, 2060841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes /// size_t strlen(const char *s); 2070841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes strlen, 2080841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes /// char *strncat(char *s1, const char *s2, size_t n); 2090841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes strncat, 2108d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes /// int strncmp(const char *s1, const char *s2, size_t n); 2118d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes strncmp, 2120841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes /// char *strncpy(char *s1, const char *s2, size_t n); 2130841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes strncpy, 2140841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes /// size_t strnlen(const char *s, size_t maxlen); 2150841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes strnlen, 21632b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// double tan(double x); 21732b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier tan, 21832b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// long double tanl(long double x); 21932b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier tanl, 22032b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// float tanf(float x); 22132b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier tanf, 22232b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// double tanh(double x); 22332b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier tanh, 22432b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// long double tanhl(long double x); 22532b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier tanhl, 22632b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// float tanhf(float x); 22732b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier tanhf, 228243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// double trunc(double x); 229243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson trunc, 230243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// float truncf(float x); 231243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson truncf, 232243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// long double truncl(long double x); 233243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson truncl, 2346a7df9aae620801d97da72d718e9aff76eebac9bNick Lewycky /// int __cxa_atexit(void (*f)(void *), void *p, void *d); 2356a7df9aae620801d97da72d718e9aff76eebac9bNick Lewycky cxa_atexit, 2366a7df9aae620801d97da72d718e9aff76eebac9bNick Lewycky /// void __cxa_guard_abort(guard_t *guard); 2376a7df9aae620801d97da72d718e9aff76eebac9bNick Lewycky /// guard_t is int64_t in Itanium ABI or int32_t on ARM eabi. 2386a7df9aae620801d97da72d718e9aff76eebac9bNick Lewycky cxa_guard_abort, 2396a7df9aae620801d97da72d718e9aff76eebac9bNick Lewycky /// int __cxa_guard_acquire(guard_t *guard); 2406a7df9aae620801d97da72d718e9aff76eebac9bNick Lewycky cxa_guard_acquire, 2416a7df9aae620801d97da72d718e9aff76eebac9bNick Lewycky /// void __cxa_guard_release(guard_t *guard); 2426a7df9aae620801d97da72d718e9aff76eebac9bNick Lewycky cxa_guard_release, 2439d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman 244ce99120084f549a523213064648662a704e8b789Chris Lattner NumLibFuncs 245ce99120084f549a523213064648662a704e8b789Chris Lattner }; 246ce99120084f549a523213064648662a704e8b789Chris Lattner } 247ce99120084f549a523213064648662a704e8b789Chris Lattner 248ce99120084f549a523213064648662a704e8b789Chris Lattner/// TargetLibraryInfo - This immutable pass captures information about what 249ce99120084f549a523213064648662a704e8b789Chris Lattner/// library functions are available for the current target, and allows a 250ce99120084f549a523213064648662a704e8b789Chris Lattner/// frontend to disable optimizations through -fno-builtin etc. 251ce99120084f549a523213064648662a704e8b789Chris Lattnerclass TargetLibraryInfo : public ImmutablePass { 2522d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 2539d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman unsigned char AvailableArray[(LibFunc::NumLibFuncs+3)/4]; 2549d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman llvm::DenseMap<unsigned, std::string> CustomNames; 2559d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman static const char* StandardNames[LibFunc::NumLibFuncs]; 2569d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman 2579d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman enum AvailabilityState { 2589d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman StandardName = 3, // (memset to all ones) 2599d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman CustomName = 1, 2609d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman Unavailable = 0 // (memset to all zeros) 2619d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman }; 2629d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman void setState(LibFunc::Func F, AvailabilityState State) { 2639d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman AvailableArray[F/4] &= ~(3 << 2*(F&3)); 2649d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman AvailableArray[F/4] |= State << 2*(F&3); 2659d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman } 2669d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman AvailabilityState getState(LibFunc::Func F) const { 2679d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman return static_cast<AvailabilityState>((AvailableArray[F/4] >> 2*(F&3)) & 3); 2689d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman } 2699d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman 270ce99120084f549a523213064648662a704e8b789Chris Lattnerpublic: 271ce99120084f549a523213064648662a704e8b789Chris Lattner static char ID; 272ce99120084f549a523213064648662a704e8b789Chris Lattner TargetLibraryInfo(); 273ce99120084f549a523213064648662a704e8b789Chris Lattner TargetLibraryInfo(const Triple &T); 27440f5fbcc5c95bb96c43ce2d06d57ae9b7f852539Chris Lattner explicit TargetLibraryInfo(const TargetLibraryInfo &TLI); 275ce99120084f549a523213064648662a704e8b789Chris Lattner 276ce99120084f549a523213064648662a704e8b789Chris Lattner /// has - This function is used by optimizations that want to match on or form 277ce99120084f549a523213064648662a704e8b789Chris Lattner /// a given library function. 278ce99120084f549a523213064648662a704e8b789Chris Lattner bool has(LibFunc::Func F) const { 2799d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman return getState(F) != Unavailable; 2809d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman } 2819d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman 2829d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman StringRef getName(LibFunc::Func F) const { 2839d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman AvailabilityState State = getState(F); 2849d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman if (State == Unavailable) 2859d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman return StringRef(); 2869d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman if (State == StandardName) 2879d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman return StandardNames[F]; 2889d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman assert(State == CustomName); 2899d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman return CustomNames.find(F)->second; 290ce99120084f549a523213064648662a704e8b789Chris Lattner } 291ce99120084f549a523213064648662a704e8b789Chris Lattner 292ce99120084f549a523213064648662a704e8b789Chris Lattner /// setUnavailable - this can be used by whatever sets up TargetLibraryInfo to 293ce99120084f549a523213064648662a704e8b789Chris Lattner /// ban use of specific library functions. 294ce99120084f549a523213064648662a704e8b789Chris Lattner void setUnavailable(LibFunc::Func F) { 2959d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman setState(F, Unavailable); 296ce99120084f549a523213064648662a704e8b789Chris Lattner } 297ce99120084f549a523213064648662a704e8b789Chris Lattner 298ce99120084f549a523213064648662a704e8b789Chris Lattner void setAvailable(LibFunc::Func F) { 2999d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman setState(F, StandardName); 300ce99120084f549a523213064648662a704e8b789Chris Lattner } 3019d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman 3029d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman void setAvailableWithName(LibFunc::Func F, StringRef Name) { 3039d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman if (StandardNames[F] != Name) { 3049d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman setState(F, CustomName); 3059d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman CustomNames[F] = Name; 3069d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman assert(CustomNames.find(F) != CustomNames.end()); 3079d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman } else { 3089d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman setState(F, StandardName); 3099d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman } 3109d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman } 3119d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman 312188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner /// disableAllFunctions - This disables all builtins, which is used for 313188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner /// options like -fno-builtin. 314188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner void disableAllFunctions(); 315ce99120084f549a523213064648662a704e8b789Chris Lattner}; 316ce99120084f549a523213064648662a704e8b789Chris Lattner 317ce99120084f549a523213064648662a704e8b789Chris Lattner} // end namespace llvm 318ce99120084f549a523213064648662a704e8b789Chris Lattner 319ce99120084f549a523213064648662a704e8b789Chris Lattner#endif 320