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