TargetLibraryInfo.h revision 6a7df9aae620801d97da72d718e9aff76eebac9b
1//===-- llvm/Target/TargetLibraryInfo.h - Library information ---*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef LLVM_TARGET_TARGETLIBRARYINFO_H
11#define LLVM_TARGET_TARGETLIBRARYINFO_H
12
13#include "llvm/Pass.h"
14#include "llvm/ADT/DenseMap.h"
15
16namespace llvm {
17  class Triple;
18
19  namespace LibFunc {
20    enum Func {
21      /// double acos(double x);
22      acos,
23      /// long double acosl(long double x);
24      acosl,
25      /// float acosf(float x);
26      acosf,
27      /// double asin(double x);
28      asin,
29      /// long double asinl(long double x);
30      asinl,
31      /// float asinf(float x);
32      asinf,
33      /// double atan(double x);
34      atan,
35      /// long double atanl(long double x);
36      atanl,
37      /// float atanf(float x);
38      atanf,
39      /// double atan2(double y, double x);
40      atan2,
41      /// long double atan2l(long double y, long double x);
42      atan2l,
43      /// float atan2f(float y, float x);
44      atan2f,
45      /// double ceil(double x);
46      ceil,
47      /// long double ceill(long double x);
48      ceill,
49      /// float ceilf(float x);
50      ceilf,
51      /// double copysign(double x, double y);
52      copysign,
53      /// float copysignf(float x, float y);
54      copysignf,
55      /// long double copysignl(long double x, long double y);
56      copysignl,
57      /// double cos(double x);
58      cos,
59      /// long double cosl(long double x);
60      cosl,
61      /// float cosf(float x);
62      cosf,
63      /// double cosh(double x);
64      cosh,
65      /// long double coshl(long double x);
66      coshl,
67      /// float coshf(float x);
68      coshf,
69      /// double exp(double x);
70      exp,
71      /// long double expl(long double x);
72      expl,
73      /// float expf(float x);
74      expf,
75      /// double exp2(double x);
76      exp2,
77      /// long double exp2l(long double x);
78      exp2l,
79      /// float exp2f(float x);
80      exp2f,
81      /// double expm1(double x);
82      expm1,
83      /// long double expm1l(long double x);
84      expm1l,
85      /// float expm1f(float x);
86      expl1f,
87      /// double fabs(double x);
88      fabs,
89      /// long double fabsl(long double x);
90      fabsl,
91      /// float fabsf(float x);
92      fabsf,
93      /// double floor(double x);
94      floor,
95      /// long double floorl(long double x);
96      floorl,
97      /// float floorf(float x);
98      floorf,
99      /// int fiprintf(FILE *stream, const char *format, ...);
100      fiprintf,
101      /// double fmod(double x, double y);
102      fmod,
103      /// long double fmodl(long double x, long double y);
104      fmodl,
105      /// float fmodf(float x, float y);
106      fmodf,
107      /// int fputs(const char *s, FILE *stream);
108      fputs,
109      /// size_t fwrite(const void *ptr, size_t size, size_t nitems,
110      /// FILE *stream);
111      fwrite,
112      /// int iprintf(const char *format, ...);
113      iprintf,
114      /// double log(double x);
115      log,
116      /// long double logl(long double x);
117      logl,
118      /// float logf(float x);
119      logf,
120      /// double log2(double x);
121      log2,
122      /// double long double log2l(long double x);
123      log2l,
124      /// float log2f(float x);
125      log2f,
126      /// double log10(double x);
127      log10,
128      /// long double log10l(long double x);
129      log10l,
130      /// float log10f(float x);
131      log10f,
132      /// double log1p(double x);
133      log1p,
134      /// long double log1pl(long double x);
135      log1pl,
136      /// float log1pf(float x);
137      log1pf,
138      /// void *memcpy(void *s1, const void *s2, size_t n);
139      memcpy,
140      /// void *memmove(void *s1, const void *s2, size_t n);
141      memmove,
142      /// void *memset(void *b, int c, size_t len);
143      memset,
144      /// void memset_pattern16(void *b, const void *pattern16, size_t len);
145      memset_pattern16,
146      /// double nearbyint(double x);
147      nearbyint,
148      /// float nearbyintf(float x);
149      nearbyintf,
150      /// long double nearbyintl(long double x);
151      nearbyintl,
152      /// double pow(double x, double y);
153      pow,
154      /// float powf(float x, float y);
155      powf,
156      /// long double powl(long double x, long double y);
157      powl,
158      /// double rint(double x);
159      rint,
160      /// float rintf(float x);
161      rintf,
162      /// long dobule rintl(long double x);
163      rintl,
164      /// double sin(double x);
165      sin,
166      /// long double sinl(long double x);
167      sinl,
168      /// float sinf(float x);
169      sinf,
170      /// double sinh(double x);
171      sinh,
172      /// long double sinhl(long double x);
173      sinhl,
174      /// float sinhf(float x);
175      sinhf,
176      /// int siprintf(char *str, const char *format, ...);
177      siprintf,
178      /// double sqrt(double x);
179      sqrt,
180      /// long double sqrtl(long double x);
181      sqrtl,
182      /// float sqrtf(float x);
183      sqrtf,
184      /// double tan(double x);
185      tan,
186      /// long double tanl(long double x);
187      tanl,
188      /// float tanf(float x);
189      tanf,
190      /// double tanh(double x);
191      tanh,
192      /// long double tanhl(long double x);
193      tanhl,
194      /// float tanhf(float x);
195      tanhf,
196      /// double trunc(double x);
197      trunc,
198      /// float truncf(float x);
199      truncf,
200      /// long double truncl(long double x);
201      truncl,
202      /// int __cxa_atexit(void (*f)(void *), void *p, void *d);
203      cxa_atexit,
204      /// void __cxa_guard_abort(guard_t *guard);
205      /// guard_t is int64_t in Itanium ABI or int32_t on ARM eabi.
206      cxa_guard_abort,
207      /// int __cxa_guard_acquire(guard_t *guard);
208      cxa_guard_acquire,
209      /// void __cxa_guard_release(guard_t *guard);
210      cxa_guard_release,
211
212      NumLibFuncs
213    };
214  }
215
216/// TargetLibraryInfo - This immutable pass captures information about what
217/// library functions are available for the current target, and allows a
218/// frontend to disable optimizations through -fno-builtin etc.
219class TargetLibraryInfo : public ImmutablePass {
220  virtual void anchor();
221  unsigned char AvailableArray[(LibFunc::NumLibFuncs+3)/4];
222  llvm::DenseMap<unsigned, std::string> CustomNames;
223  static const char* StandardNames[LibFunc::NumLibFuncs];
224
225  enum AvailabilityState {
226    StandardName = 3, // (memset to all ones)
227    CustomName = 1,
228    Unavailable = 0  // (memset to all zeros)
229  };
230  void setState(LibFunc::Func F, AvailabilityState State) {
231    AvailableArray[F/4] &= ~(3 << 2*(F&3));
232    AvailableArray[F/4] |= State << 2*(F&3);
233  }
234  AvailabilityState getState(LibFunc::Func F) const {
235    return static_cast<AvailabilityState>((AvailableArray[F/4] >> 2*(F&3)) & 3);
236  }
237
238public:
239  static char ID;
240  TargetLibraryInfo();
241  TargetLibraryInfo(const Triple &T);
242  explicit TargetLibraryInfo(const TargetLibraryInfo &TLI);
243
244  /// has - This function is used by optimizations that want to match on or form
245  /// a given library function.
246  bool has(LibFunc::Func F) const {
247    return getState(F) != Unavailable;
248  }
249
250  StringRef getName(LibFunc::Func F) const {
251    AvailabilityState State = getState(F);
252    if (State == Unavailable)
253      return StringRef();
254    if (State == StandardName)
255      return StandardNames[F];
256    assert(State == CustomName);
257    return CustomNames.find(F)->second;
258  }
259
260  /// setUnavailable - this can be used by whatever sets up TargetLibraryInfo to
261  /// ban use of specific library functions.
262  void setUnavailable(LibFunc::Func F) {
263    setState(F, Unavailable);
264  }
265
266  void setAvailable(LibFunc::Func F) {
267    setState(F, StandardName);
268  }
269
270  void setAvailableWithName(LibFunc::Func F, StringRef Name) {
271    if (StandardNames[F] != Name) {
272      setState(F, CustomName);
273      CustomNames[F] = Name;
274      assert(CustomNames.find(F) != CustomNames.end());
275    } else {
276      setState(F, StandardName);
277    }
278  }
279
280  /// disableAllFunctions - This disables all builtins, which is used for
281  /// options like -fno-builtin.
282  void disableAllFunctions();
283};
284
285} // end namespace llvm
286
287#endif
288