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