TargetLibraryInfo.h revision 3d925d24e8c54cde05228258c25cc21687cad922
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" 149d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman#include "llvm/ADT/DenseMap.h" 15ce99120084f549a523213064648662a704e8b789Chris Lattner 16ce99120084f549a523213064648662a704e8b789Chris Lattnernamespace llvm { 17ce99120084f549a523213064648662a704e8b789Chris Lattner class Triple; 18ce99120084f549a523213064648662a704e8b789Chris Lattner 19ce99120084f549a523213064648662a704e8b789Chris Lattner namespace LibFunc { 20ce99120084f549a523213064648662a704e8b789Chris Lattner enum Func { 21398c0d8b7417dedbe244020ffb67abb54aaa1c59Chris Lattner /// void *memset(void *b, int c, size_t len); 22398c0d8b7417dedbe244020ffb67abb54aaa1c59Chris Lattner memset, 23398c0d8b7417dedbe244020ffb67abb54aaa1c59Chris Lattner 24398c0d8b7417dedbe244020ffb67abb54aaa1c59Chris Lattner // void *memcpy(void *s1, const void *s2, size_t n); 25398c0d8b7417dedbe244020ffb67abb54aaa1c59Chris Lattner memcpy, 26398c0d8b7417dedbe244020ffb67abb54aaa1c59Chris Lattner 27149f5283f93ec85b96888c284f56099a72cc2731Chris Lattner // void *memmove(void *s1, const void *s2, size_t n); 28149f5283f93ec85b96888c284f56099a72cc2731Chris Lattner memmove, 29149f5283f93ec85b96888c284f56099a72cc2731Chris Lattner 30ce99120084f549a523213064648662a704e8b789Chris Lattner /// void memset_pattern16(void *b, const void *pattern16, size_t len); 31ce99120084f549a523213064648662a704e8b789Chris Lattner memset_pattern16, 32ce99120084f549a523213064648662a704e8b789Chris Lattner 333649824bec09768cbdee7aa7cfbbcdd865373626Richard Osborne /// int iprintf(const char *format, ...); 343649824bec09768cbdee7aa7cfbbcdd865373626Richard Osborne iprintf, 353649824bec09768cbdee7aa7cfbbcdd865373626Richard Osborne 36419454ad3720b8cf4613d9e790669c8beaccd1a4Richard Osborne /// int siprintf(char *str, const char *format, ...); 37419454ad3720b8cf4613d9e790669c8beaccd1a4Richard Osborne siprintf, 383d925d24e8c54cde05228258c25cc21687cad922Chad Rosier 393d925d24e8c54cde05228258c25cc21687cad922Chad Rosier /// double sqrt(double x); 403d925d24e8c54cde05228258c25cc21687cad922Chad Rosier sqrt, 413d925d24e8c54cde05228258c25cc21687cad922Chad Rosier 423d925d24e8c54cde05228258c25cc21687cad922Chad Rosier /// long double sqrtl(long double x); 433d925d24e8c54cde05228258c25cc21687cad922Chad Rosier sqrtl, 443d925d24e8c54cde05228258c25cc21687cad922Chad Rosier 453d925d24e8c54cde05228258c25cc21687cad922Chad Rosier /// float sqrtf(float x); 463d925d24e8c54cde05228258c25cc21687cad922Chad Rosier sqrtf, 47419454ad3720b8cf4613d9e790669c8beaccd1a4Richard Osborne 48022708f221e2a9ea1a42c07c7cd7817a8de881dcRichard Osborne /// int fiprintf(FILE *stream, const char *format, ...); 49022708f221e2a9ea1a42c07c7cd7817a8de881dcRichard Osborne fiprintf, 509d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman 519d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman // size_t fwrite(const void *ptr, size_t size, size_t nitems, 529d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman // FILE *stream); 539d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman fwrite, 549d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman 559d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman // int fputs(const char *s, FILE *stream); 569d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman fputs, 579d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman 58ce99120084f549a523213064648662a704e8b789Chris Lattner NumLibFuncs 59ce99120084f549a523213064648662a704e8b789Chris Lattner }; 60ce99120084f549a523213064648662a704e8b789Chris Lattner } 61ce99120084f549a523213064648662a704e8b789Chris Lattner 62ce99120084f549a523213064648662a704e8b789Chris Lattner/// TargetLibraryInfo - This immutable pass captures information about what 63ce99120084f549a523213064648662a704e8b789Chris Lattner/// library functions are available for the current target, and allows a 64ce99120084f549a523213064648662a704e8b789Chris Lattner/// frontend to disable optimizations through -fno-builtin etc. 65ce99120084f549a523213064648662a704e8b789Chris Lattnerclass TargetLibraryInfo : public ImmutablePass { 669d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman unsigned char AvailableArray[(LibFunc::NumLibFuncs+3)/4]; 679d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman llvm::DenseMap<unsigned, std::string> CustomNames; 689d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman static const char* StandardNames[LibFunc::NumLibFuncs]; 699d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman 709d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman enum AvailabilityState { 719d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman StandardName = 3, // (memset to all ones) 729d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman CustomName = 1, 739d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman Unavailable = 0 // (memset to all zeros) 749d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman }; 759d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman void setState(LibFunc::Func F, AvailabilityState State) { 769d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman AvailableArray[F/4] &= ~(3 << 2*(F&3)); 779d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman AvailableArray[F/4] |= State << 2*(F&3); 789d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman } 799d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman AvailabilityState getState(LibFunc::Func F) const { 809d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman return static_cast<AvailabilityState>((AvailableArray[F/4] >> 2*(F&3)) & 3); 819d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman } 829d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman 83ce99120084f549a523213064648662a704e8b789Chris Lattnerpublic: 84ce99120084f549a523213064648662a704e8b789Chris Lattner static char ID; 85ce99120084f549a523213064648662a704e8b789Chris Lattner TargetLibraryInfo(); 86ce99120084f549a523213064648662a704e8b789Chris Lattner TargetLibraryInfo(const Triple &T); 8740f5fbcc5c95bb96c43ce2d06d57ae9b7f852539Chris Lattner explicit TargetLibraryInfo(const TargetLibraryInfo &TLI); 88ce99120084f549a523213064648662a704e8b789Chris Lattner 89ce99120084f549a523213064648662a704e8b789Chris Lattner /// has - This function is used by optimizations that want to match on or form 90ce99120084f549a523213064648662a704e8b789Chris Lattner /// a given library function. 91ce99120084f549a523213064648662a704e8b789Chris Lattner bool has(LibFunc::Func F) const { 929d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman return getState(F) != Unavailable; 939d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman } 949d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman 959d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman StringRef getName(LibFunc::Func F) const { 969d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman AvailabilityState State = getState(F); 979d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman if (State == Unavailable) 989d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman return StringRef(); 999d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman if (State == StandardName) 1009d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman return StandardNames[F]; 1019d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman assert(State == CustomName); 1029d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman return CustomNames.find(F)->second; 103ce99120084f549a523213064648662a704e8b789Chris Lattner } 104ce99120084f549a523213064648662a704e8b789Chris Lattner 105ce99120084f549a523213064648662a704e8b789Chris Lattner /// setUnavailable - this can be used by whatever sets up TargetLibraryInfo to 106ce99120084f549a523213064648662a704e8b789Chris Lattner /// ban use of specific library functions. 107ce99120084f549a523213064648662a704e8b789Chris Lattner void setUnavailable(LibFunc::Func F) { 1089d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman setState(F, Unavailable); 109ce99120084f549a523213064648662a704e8b789Chris Lattner } 110ce99120084f549a523213064648662a704e8b789Chris Lattner 111ce99120084f549a523213064648662a704e8b789Chris Lattner void setAvailable(LibFunc::Func F) { 1129d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman setState(F, StandardName); 113ce99120084f549a523213064648662a704e8b789Chris Lattner } 1149d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman 1159d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman void setAvailableWithName(LibFunc::Func F, StringRef Name) { 1169d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman if (StandardNames[F] != Name) { 1179d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman setState(F, CustomName); 1189d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman CustomNames[F] = Name; 1199d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman assert(CustomNames.find(F) != CustomNames.end()); 1209d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman } else { 1219d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman setState(F, StandardName); 1229d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman } 1239d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman } 1249d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman 125188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner /// disableAllFunctions - This disables all builtins, which is used for 126188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner /// options like -fno-builtin. 127188a7e00e784f78d6b5b250a64ac5c374f0fd3f0Chris Lattner void disableAllFunctions(); 128ce99120084f549a523213064648662a704e8b789Chris Lattner}; 129ce99120084f549a523213064648662a704e8b789Chris Lattner 130ce99120084f549a523213064648662a704e8b789Chris Lattner} // end namespace llvm 131ce99120084f549a523213064648662a704e8b789Chris Lattner 132ce99120084f549a523213064648662a704e8b789Chris Lattner#endif 133