TargetLibraryInfo.h revision 0841e63ede092283d824843a068df3f7b0b90dd8
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, 107683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier /// int fputs(const char *s, FILE *stream); 108683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier fputs, 109683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier /// size_t fwrite(const void *ptr, size_t size, size_t nitems, 110683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier /// FILE *stream); 111683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier fwrite, 112683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier /// int iprintf(const char *format, ...); 113683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier iprintf, 1148ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double log(double x); 1158ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier log, 1168ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// long double logl(long double x); 1178ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier logl, 1188ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float logf(float x); 1198ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier logf, 1208ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double log2(double x); 1218ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier log2, 1228ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double long double log2l(long double x); 1238ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier log2l, 1248ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float log2f(float x); 1258ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier log2f, 1268ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double log10(double x); 1278ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier log10, 1288ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// long double log10l(long double x); 1298ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier log10l, 1308ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float log10f(float x); 1318ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier log10f, 1328ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double log1p(double x); 1338ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier log1p, 1348ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// long double log1pl(long double x); 1358ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier log1pl, 1368ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float log1pf(float x); 1378ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier log1pf, 138683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier /// void *memcpy(void *s1, const void *s2, size_t n); 139398c0d8b7417dedbe244020ffb67abb54aaa1c59Chris Lattner memcpy, 140683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier /// void *memmove(void *s1, const void *s2, size_t n); 141149f5283f93ec85b96888c284f56099a72cc2731Chris Lattner memmove, 142683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier /// void *memset(void *b, int c, size_t len); 143683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier memset, 144ce99120084f549a523213064648662a704e8b789Chris Lattner /// void memset_pattern16(void *b, const void *pattern16, size_t len); 145ce99120084f549a523213064648662a704e8b789Chris Lattner memset_pattern16, 146243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// double nearbyint(double x); 147243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson nearbyint, 148243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// float nearbyintf(float x); 149243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson nearbyintf, 150243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// long double nearbyintl(long double x); 151243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson nearbyintl, 1528ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// double pow(double x, double y); 1538ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier pow, 1548ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// float powf(float x, float y); 1558ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier powf, 1568ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// long double powl(long double x, long double y); 1578ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier powl, 158243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// double rint(double x); 159243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson rint, 160243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// float rintf(float x); 161243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson rintf, 162d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff /// long double rintl(long double x); 163243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson rintl, 164d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff /// double round(double x); 165d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff round, 166d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff /// float roundf(float x); 167d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff roundf, 168d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff /// long double roundl(long double x); 169d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groff roundl, 17032b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// double sin(double x); 17132b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier sin, 17232b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// long double sinl(long double x); 17332b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier sinl, 17432b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// float sinf(float x); 17532b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier sinf, 17632b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// double sinh(double x); 17732b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier sinh, 17832b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// long double sinhl(long double x); 17932b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier sinhl, 18032b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// float sinhf(float x); 18132b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier sinhf, 182419454ad3720b8cf4613d9e790669c8beaccd1a4Richard Osborne /// int siprintf(char *str, const char *format, ...); 183419454ad3720b8cf4613d9e790669c8beaccd1a4Richard Osborne siprintf, 1843d925d24e8c54cde05228258c25cc21687cad922Chad Rosier /// double sqrt(double x); 1853d925d24e8c54cde05228258c25cc21687cad922Chad Rosier sqrt, 1868ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// long double sqrtl(long double x); 1878ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier sqrtl, 1883d925d24e8c54cde05228258c25cc21687cad922Chad Rosier /// float sqrtf(float x); 1893d925d24e8c54cde05228258c25cc21687cad922Chad Rosier sqrtf, 1900841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes /// char *strcat(char *s1, const char *s2); 1910841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes strcat, 1920841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes /// char *strcpy(char *s1, const char *s2); 1930841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes strcpy, 1940841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes /// size_t strlen(const char *s); 1950841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes strlen, 1960841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes /// char *strncat(char *s1, const char *s2, size_t n); 1970841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes strncat, 1980841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes /// char *strncpy(char *s1, const char *s2, size_t n); 1990841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes strncpy, 2000841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes /// size_t strnlen(const char *s, size_t maxlen); 2010841e63ede092283d824843a068df3f7b0b90dd8Nuno Lopes strnlen, 20232b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// double tan(double x); 20332b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier tan, 20432b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// long double tanl(long double x); 20532b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier tanl, 20632b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// float tanf(float x); 20732b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier tanf, 20832b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// double tanh(double x); 20932b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier tanh, 21032b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// long double tanhl(long double x); 21132b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier tanhl, 21232b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// float tanhf(float x); 21332b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier tanhf, 214243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// double trunc(double x); 215243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson trunc, 216243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// float truncf(float x); 217243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson truncf, 218243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson /// long double truncl(long double x); 219243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson truncl, 2206a7df9aae620801d97da72d718e9aff76eebac9bNick Lewycky /// int __cxa_atexit(void (*f)(void *), void *p, void *d); 2216a7df9aae620801d97da72d718e9aff76eebac9bNick Lewycky cxa_atexit, 2226a7df9aae620801d97da72d718e9aff76eebac9bNick Lewycky /// void __cxa_guard_abort(guard_t *guard); 2236a7df9aae620801d97da72d718e9aff76eebac9bNick Lewycky /// guard_t is int64_t in Itanium ABI or int32_t on ARM eabi. 2246a7df9aae620801d97da72d718e9aff76eebac9bNick Lewycky cxa_guard_abort, 2256a7df9aae620801d97da72d718e9aff76eebac9bNick Lewycky /// int __cxa_guard_acquire(guard_t *guard); 2266a7df9aae620801d97da72d718e9aff76eebac9bNick Lewycky cxa_guard_acquire, 2276a7df9aae620801d97da72d718e9aff76eebac9bNick Lewycky /// void __cxa_guard_release(guard_t *guard); 2286a7df9aae620801d97da72d718e9aff76eebac9bNick Lewycky cxa_guard_release, 2299d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman 230ce99120084f549a523213064648662a704e8b789Chris Lattner NumLibFuncs 231ce99120084f549a523213064648662a704e8b789Chris Lattner }; 232ce99120084f549a523213064648662a704e8b789Chris Lattner } 233ce99120084f549a523213064648662a704e8b789Chris Lattner 234ce99120084f549a523213064648662a704e8b789Chris Lattner/// TargetLibraryInfo - This immutable pass captures information about what 235ce99120084f549a523213064648662a704e8b789Chris Lattner/// library functions are available for the current target, and allows a 236ce99120084f549a523213064648662a704e8b789Chris Lattner/// frontend to disable optimizations through -fno-builtin etc. 237ce99120084f549a523213064648662a704e8b789Chris Lattnerclass TargetLibraryInfo : public ImmutablePass { 2382d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 2399d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman unsigned char AvailableArray[(LibFunc::NumLibFuncs+3)/4]; 2409d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman llvm::DenseMap<unsigned, std::string> CustomNames; 2419d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman static const char* StandardNames[LibFunc::NumLibFuncs]; 2429d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman 2439d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman enum AvailabilityState { 2449d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman StandardName = 3, // (memset to all ones) 2459d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman CustomName = 1, 2469d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman Unavailable = 0 // (memset to all zeros) 2479d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman }; 2489d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman void setState(LibFunc::Func F, AvailabilityState State) { 2499d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman AvailableArray[F/4] &= ~(3 << 2*(F&3)); 2509d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman AvailableArray[F/4] |= State << 2*(F&3); 2519d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman } 2529d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman AvailabilityState getState(LibFunc::Func F) const { 2539d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman return static_cast<AvailabilityState>((AvailableArray[F/4] >> 2*(F&3)) & 3); 2549d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman } 2559d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman 256ce99120084f549a523213064648662a704e8b789Chris Lattnerpublic: 257ce99120084f549a523213064648662a704e8b789Chris Lattner static char ID; 258ce99120084f549a523213064648662a704e8b789Chris Lattner TargetLibraryInfo(); 259ce99120084f549a523213064648662a704e8b789Chris Lattner TargetLibraryInfo(const Triple &T); 26040f5fbcc5c95bb96c43ce2d06d57ae9b7f852539Chris Lattner explicit TargetLibraryInfo(const TargetLibraryInfo &TLI); 261ce99120084f549a523213064648662a704e8b789Chris Lattner 262ce99120084f549a523213064648662a704e8b789Chris Lattner /// has - This function is used by optimizations that want to match on or form 263ce99120084f549a523213064648662a704e8b789Chris Lattner /// a given library function. 264ce99120084f549a523213064648662a704e8b789Chris Lattner bool has(LibFunc::Func F) const { 2659d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman return getState(F) != Unavailable; 2669d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman } 2679d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman 2689d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman StringRef getName(LibFunc::Func F) const { 2699d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman AvailabilityState State = getState(F); 2709d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman if (State == Unavailable) 2719d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman return StringRef(); 2729d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman if (State == StandardName) 2739d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman return StandardNames[F]; 2749d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman assert(State == CustomName); 2759d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman return CustomNames.find(F)->second; 276ce99120084f549a523213064648662a704e8b789Chris Lattner } 277ce99120084f549a523213064648662a704e8b789Chris Lattner 278ce99120084f549a523213064648662a704e8b789Chris Lattner /// setUnavailable - this can be used by whatever sets up TargetLibraryInfo to 279ce99120084f549a523213064648662a704e8b789Chris Lattner /// ban use of specific library functions. 280ce99120084f549a523213064648662a704e8b789Chris Lattner void setUnavailable(LibFunc::Func F) { 2819d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman setState(F, Unavailable); 282ce99120084f549a523213064648662a704e8b789Chris Lattner } 283ce99120084f549a523213064648662a704e8b789Chris Lattner 284ce99120084f549a523213064648662a704e8b789Chris Lattner void setAvailable(LibFunc::Func F) { 2859d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman setState(F, StandardName); 286ce99120084f549a523213064648662a704e8b789Chris Lattner } 2879d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman 2889d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman void setAvailableWithName(LibFunc::Func F, StringRef Name) { 2899d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman if (StandardNames[F] != Name) { 2909d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman setState(F, CustomName); 2919d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman CustomNames[F] = Name; 2929d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman assert(CustomNames.find(F) != CustomNames.end()); 2939d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman } else { 2949d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman setState(F, StandardName); 2959d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman } 2969d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman } 2979d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman 298188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner /// disableAllFunctions - This disables all builtins, which is used for 299188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner /// options like -fno-builtin. 300188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner void disableAllFunctions(); 301ce99120084f549a523213064648662a704e8b789Chris Lattner}; 302ce99120084f549a523213064648662a704e8b789Chris Lattner 303ce99120084f549a523213064648662a704e8b789Chris Lattner} // end namespace llvm 304ce99120084f549a523213064648662a704e8b789Chris Lattner 305ce99120084f549a523213064648662a704e8b789Chris Lattner#endif 306