TargetLibraryInfo.h revision 40f5fbcc5c95bb96c43ce2d06d57ae9b7f852539
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"
14ce99120084f549a523213064648662a704e8b789Chris Lattner
15ce99120084f549a523213064648662a704e8b789Chris Lattnernamespace llvm {
16ce99120084f549a523213064648662a704e8b789Chris Lattner  class Triple;
17ce99120084f549a523213064648662a704e8b789Chris Lattner
18ce99120084f549a523213064648662a704e8b789Chris Lattner  namespace LibFunc {
19ce99120084f549a523213064648662a704e8b789Chris Lattner    enum Func {
20398c0d8b7417dedbe244020ffb67abb54aaa1c59Chris Lattner      /// void *memset(void *b, int c, size_t len);
21398c0d8b7417dedbe244020ffb67abb54aaa1c59Chris Lattner      memset,
22398c0d8b7417dedbe244020ffb67abb54aaa1c59Chris Lattner
23398c0d8b7417dedbe244020ffb67abb54aaa1c59Chris Lattner      // void *memcpy(void *s1, const void *s2, size_t n);
24398c0d8b7417dedbe244020ffb67abb54aaa1c59Chris Lattner      memcpy,
25398c0d8b7417dedbe244020ffb67abb54aaa1c59Chris Lattner
26149f5283f93ec85b96888c284f56099a72cc2731Chris Lattner      // void *memmove(void *s1, const void *s2, size_t n);
27149f5283f93ec85b96888c284f56099a72cc2731Chris Lattner      memmove,
28149f5283f93ec85b96888c284f56099a72cc2731Chris Lattner
29ce99120084f549a523213064648662a704e8b789Chris Lattner      /// void memset_pattern16(void *b, const void *pattern16, size_t len);
30ce99120084f549a523213064648662a704e8b789Chris Lattner      memset_pattern16,
31ce99120084f549a523213064648662a704e8b789Chris Lattner
323649824bec09768cbdee7aa7cfbbcdd865373626Richard Osborne      /// int iprintf(const char *format, ...);
333649824bec09768cbdee7aa7cfbbcdd865373626Richard Osborne      iprintf,
343649824bec09768cbdee7aa7cfbbcdd865373626Richard Osborne
35419454ad3720b8cf4613d9e790669c8beaccd1a4Richard Osborne      /// int siprintf(char *str, const char *format, ...);
36419454ad3720b8cf4613d9e790669c8beaccd1a4Richard Osborne      siprintf,
37419454ad3720b8cf4613d9e790669c8beaccd1a4Richard Osborne
38022708f221e2a9ea1a42c07c7cd7817a8de881dcRichard Osborne      /// int fiprintf(FILE *stream, const char *format, ...);
39022708f221e2a9ea1a42c07c7cd7817a8de881dcRichard Osborne      fiprintf,
40022708f221e2a9ea1a42c07c7cd7817a8de881dcRichard Osborne
41ce99120084f549a523213064648662a704e8b789Chris Lattner      NumLibFuncs
42ce99120084f549a523213064648662a704e8b789Chris Lattner    };
43ce99120084f549a523213064648662a704e8b789Chris Lattner  }
44ce99120084f549a523213064648662a704e8b789Chris Lattner
45ce99120084f549a523213064648662a704e8b789Chris Lattner/// TargetLibraryInfo - This immutable pass captures information about what
46ce99120084f549a523213064648662a704e8b789Chris Lattner/// library functions are available for the current target, and allows a
47ce99120084f549a523213064648662a704e8b789Chris Lattner/// frontend to disable optimizations through -fno-builtin etc.
48ce99120084f549a523213064648662a704e8b789Chris Lattnerclass TargetLibraryInfo : public ImmutablePass {
49ce99120084f549a523213064648662a704e8b789Chris Lattner  unsigned char AvailableArray[(LibFunc::NumLibFuncs+7)/8];
50ce99120084f549a523213064648662a704e8b789Chris Lattnerpublic:
51ce99120084f549a523213064648662a704e8b789Chris Lattner  static char ID;
52ce99120084f549a523213064648662a704e8b789Chris Lattner  TargetLibraryInfo();
53ce99120084f549a523213064648662a704e8b789Chris Lattner  TargetLibraryInfo(const Triple &T);
5440f5fbcc5c95bb96c43ce2d06d57ae9b7f852539Chris Lattner  explicit TargetLibraryInfo(const TargetLibraryInfo &TLI);
55ce99120084f549a523213064648662a704e8b789Chris Lattner
56ce99120084f549a523213064648662a704e8b789Chris Lattner  /// has - This function is used by optimizations that want to match on or form
57ce99120084f549a523213064648662a704e8b789Chris Lattner  /// a given library function.
58ce99120084f549a523213064648662a704e8b789Chris Lattner  bool has(LibFunc::Func F) const {
59ce99120084f549a523213064648662a704e8b789Chris Lattner    return (AvailableArray[F/8] & (1 << (F&7))) != 0;
60ce99120084f549a523213064648662a704e8b789Chris Lattner  }
61ce99120084f549a523213064648662a704e8b789Chris Lattner
62ce99120084f549a523213064648662a704e8b789Chris Lattner  /// setUnavailable - this can be used by whatever sets up TargetLibraryInfo to
63ce99120084f549a523213064648662a704e8b789Chris Lattner  /// ban use of specific library functions.
64ce99120084f549a523213064648662a704e8b789Chris Lattner  void setUnavailable(LibFunc::Func F) {
65ce99120084f549a523213064648662a704e8b789Chris Lattner    AvailableArray[F/8] &= ~(1 << (F&7));
66ce99120084f549a523213064648662a704e8b789Chris Lattner  }
67ce99120084f549a523213064648662a704e8b789Chris Lattner
68ce99120084f549a523213064648662a704e8b789Chris Lattner  void setAvailable(LibFunc::Func F) {
69ce99120084f549a523213064648662a704e8b789Chris Lattner    AvailableArray[F/8] |= 1 << (F&7);
70ce99120084f549a523213064648662a704e8b789Chris Lattner  }
71188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner
72188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner  /// disableAllFunctions - This disables all builtins, which is used for
73188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner  /// options like -fno-builtin.
74188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner  void disableAllFunctions();
75ce99120084f549a523213064648662a704e8b789Chris Lattner};
76ce99120084f549a523213064648662a704e8b789Chris Lattner
77ce99120084f549a523213064648662a704e8b789Chris Lattner} // end namespace llvm
78ce99120084f549a523213064648662a704e8b789Chris Lattner
79ce99120084f549a523213064648662a704e8b789Chris Lattner#endif
80