7770a11ac0dbfc0285ddb3f0c9b609cc63578b08
[oota-llvm.git] / include / llvm / Target / TargetLibraryInfo.h
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
16 namespace llvm {
17   class Triple;
18
19   namespace LibFunc {
20     enum Func {
21       /// void *memset(void *b, int c, size_t len);
22       memset,
23       
24       // void *memcpy(void *s1, const void *s2, size_t n);
25       memcpy,
26       
27       // void *memmove(void *s1, const void *s2, size_t n);
28       memmove,
29       
30       /// void memset_pattern16(void *b, const void *pattern16, size_t len);
31       memset_pattern16,
32       
33       /// int iprintf(const char *format, ...);
34       iprintf,
35       
36       /// int siprintf(char *str, const char *format, ...);
37       siprintf,
38       
39       /// int fiprintf(FILE *stream, const char *format, ...);
40       fiprintf,
41
42       // size_t fwrite(const void *ptr, size_t size, size_t nitems,
43       //               FILE *stream);
44       fwrite,
45
46       // int fputs(const char *s, FILE *stream);
47       fputs,
48
49       NumLibFuncs
50     };
51   }
52
53 /// TargetLibraryInfo - This immutable pass captures information about what
54 /// library functions are available for the current target, and allows a
55 /// frontend to disable optimizations through -fno-builtin etc.
56 class TargetLibraryInfo : public ImmutablePass {
57   unsigned char AvailableArray[(LibFunc::NumLibFuncs+3)/4];
58   llvm::DenseMap<unsigned, std::string> CustomNames;
59   static const char* StandardNames[LibFunc::NumLibFuncs];
60
61   enum AvailabilityState {
62     StandardName = 3, // (memset to all ones)
63     CustomName = 1,
64     Unavailable = 0  // (memset to all zeros)
65   };
66   void setState(LibFunc::Func F, AvailabilityState State) {
67     AvailableArray[F/4] &= ~(3 << 2*(F&3));
68     AvailableArray[F/4] |= State << 2*(F&3);
69   }
70   AvailabilityState getState(LibFunc::Func F) const {
71     return static_cast<AvailabilityState>((AvailableArray[F/4] >> 2*(F&3)) & 3);
72   }
73
74 public:
75   static char ID;
76   TargetLibraryInfo();
77   TargetLibraryInfo(const Triple &T);
78   explicit TargetLibraryInfo(const TargetLibraryInfo &TLI);
79   
80   /// has - This function is used by optimizations that want to match on or form
81   /// a given library function.
82   bool has(LibFunc::Func F) const {
83     return getState(F) != Unavailable;
84   }
85
86   StringRef getName(LibFunc::Func F) const {
87     AvailabilityState State = getState(F);
88     if (State == Unavailable)
89       return StringRef();
90     if (State == StandardName)
91       return StandardNames[F];
92     assert(State == CustomName);
93     return CustomNames.find(F)->second;
94   }
95
96   /// setUnavailable - this can be used by whatever sets up TargetLibraryInfo to
97   /// ban use of specific library functions.
98   void setUnavailable(LibFunc::Func F) {
99     setState(F, Unavailable);
100   }
101
102   void setAvailable(LibFunc::Func F) {
103     setState(F, StandardName);
104   }
105
106   void setAvailableWithName(LibFunc::Func F, StringRef Name) {
107     if (StandardNames[F] != Name) {
108       setState(F, CustomName);
109       CustomNames[F] = Name;
110       assert(CustomNames.find(F) != CustomNames.end());
111     } else {
112       setState(F, StandardName);
113     }
114   }
115
116   /// disableAllFunctions - This disables all builtins, which is used for
117   /// options like -fno-builtin.
118   void disableAllFunctions();
119 };
120
121 } // end namespace llvm
122
123 #endif