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