TargetLibraryInfo.h revision 683e47b1dd8672b0b026a45022cf91f4faf7df9b
1e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//===-- llvm/Target/TargetLibraryInfo.h - Library information ---*- C++ -*-===//
2e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//
3e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//                     The LLVM Compiler Infrastructure
4e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//
5e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// This file is distributed under the University of Illinois Open Source
6e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// License. See LICENSE.TXT for details.
7e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//
8e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//===----------------------------------------------------------------------===//
9e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#ifndef LLVM_TARGET_TARGETLIBRARYINFO_H
11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#define LLVM_TARGET_TARGETLIBRARYINFO_H
12e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
13e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "llvm/Pass.h"
14e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "llvm/ADT/DenseMap.h"
153600d497832c398ffafcba1935389125e15683a3Stephen Wilson
163600d497832c398ffafcba1935389125e15683a3Stephen Wilsonnamespace llvm {
173600d497832c398ffafcba1935389125e15683a3Stephen Wilson  class Triple;
18e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
19e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton  namespace LibFunc {
20e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    enum Func {
21e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton      /// int fiprintf(FILE *stream, const char *format, ...);
2248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton      fiprintf,
23e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
24e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton      /// int fputs(const char *s, FILE *stream);
2549ce8969d3154e1560106cfe530444c09410f217Greg Clayton      fputs,
263600d497832c398ffafcba1935389125e15683a3Stephen Wilson
27e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton      /// size_t fwrite(const void *ptr, size_t size, size_t nitems,
28e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton      /// FILE *stream);
29e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton      fwrite,
303600d497832c398ffafcba1935389125e15683a3Stephen Wilson
31e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton      /// int iprintf(const char *format, ...);
32e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton      iprintf,
33e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
34e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton      /// void *memcpy(void *s1, const void *s2, size_t n);
353600d497832c398ffafcba1935389125e15683a3Stephen Wilson      memcpy,
3648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton
3748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton      /// void *memmove(void *s1, const void *s2, size_t n);
383600d497832c398ffafcba1935389125e15683a3Stephen Wilson      memmove,
39b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton
403600d497832c398ffafcba1935389125e15683a3Stephen Wilson      /// void *memset(void *b, int c, size_t len);
41b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton      memset,
42b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton
43b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton      /// void memset_pattern16(void *b, const void *pattern16, size_t len);
44b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton      memset_pattern16,
45b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton
46b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton      /// int siprintf(char *str, const char *format, ...);
47b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton      siprintf,
48b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton
49b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton      /// double sqrt(double x);
50b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton      sqrt,
516c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton
526c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton      /// float sqrtf(float x);
536c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton      sqrtf,
546c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton
55b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton      /// long double sqrtl(long double x);
56b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton      sqrtl,
57b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton
586c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton      NumLibFuncs
59b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton    };
60b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton  }
61b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton
62b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton/// TargetLibraryInfo - This immutable pass captures information about what
63b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton/// library functions are available for the current target, and allows a
64b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton/// frontend to disable optimizations through -fno-builtin etc.
65b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Claytonclass TargetLibraryInfo : public ImmutablePass {
66b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton  unsigned char AvailableArray[(LibFunc::NumLibFuncs+3)/4];
67b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton  llvm::DenseMap<unsigned, std::string> CustomNames;
68b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton  static const char* StandardNames[LibFunc::NumLibFuncs];
69b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton
706c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton  enum AvailabilityState {
716c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton    StandardName = 3, // (memset to all ones)
726c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton    CustomName = 1,
736c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton    Unavailable = 0  // (memset to all zeros)
74b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton  };
75b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton  void setState(LibFunc::Func F, AvailabilityState State) {
76b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton    AvailableArray[F/4] &= ~(3 << 2*(F&3));
776c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton    AvailableArray[F/4] |= State << 2*(F&3);
78b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton  }
79b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton  AvailabilityState getState(LibFunc::Func F) const {
80b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton    return static_cast<AvailabilityState>((AvailableArray[F/4] >> 2*(F&3)) & 3);
81b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton  }
82b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton
83b1db658333cdebca31a128be95e926d80c3c7796Greg Claytonpublic:
84b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton  static char ID;
85b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton  TargetLibraryInfo();
86b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton  TargetLibraryInfo(const Triple &T);
873600d497832c398ffafcba1935389125e15683a3Stephen Wilson  explicit TargetLibraryInfo(const TargetLibraryInfo &TLI);
883600d497832c398ffafcba1935389125e15683a3Stephen Wilson
893600d497832c398ffafcba1935389125e15683a3Stephen Wilson  /// has - This function is used by optimizations that want to match on or form
900e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton  /// a given library function.
910e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton  bool has(LibFunc::Func F) const {
9248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    return getState(F) != Unavailable;
9348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton  }
940e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton
950e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton  StringRef getName(LibFunc::Func F) const {
960e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    AvailabilityState State = getState(F);
970e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    if (State == Unavailable)
9848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton      return StringRef();
990e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    if (State == StandardName)
1000e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton      return StandardNames[F];
1010e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    assert(State == CustomName);
1020e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    return CustomNames.find(F)->second;
10348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton  }
10448a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton
10548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton  /// setUnavailable - this can be used by whatever sets up TargetLibraryInfo to
10648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton  /// ban use of specific library functions.
1073600d497832c398ffafcba1935389125e15683a3Stephen Wilson  void setUnavailable(LibFunc::Func F) {
10848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    setState(F, Unavailable);
10948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton  }
11048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton
11148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton  void setAvailable(LibFunc::Func F) {
1123600d497832c398ffafcba1935389125e15683a3Stephen Wilson    setState(F, StandardName);
1133600d497832c398ffafcba1935389125e15683a3Stephen Wilson  }
1140e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton
1150e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton  void setAvailableWithName(LibFunc::Func F, StringRef Name) {
1160e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    if (StandardNames[F] != Name) {
1170e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton      setState(F, CustomName);
1180e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton      CustomNames[F] = Name;
1190e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton      assert(CustomNames.find(F) != CustomNames.end());
120e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    } else {
121e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton      setState(F, StandardName);
122e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    }
12348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton  }
1243600d497832c398ffafcba1935389125e15683a3Stephen Wilson
12548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton  /// disableAllFunctions - This disables all builtins, which is used for
12648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton  /// options like -fno-builtin.
12748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton  void disableAllFunctions();
1283600d497832c398ffafcba1935389125e15683a3Stephen Wilson};
12948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton
1300e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton} // end namespace llvm
13148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton
13248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton#endif
1333600d497832c398ffafcba1935389125e15683a3Stephen Wilson