X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FTargetLibraryInfo.cpp;h=ecb38198551d7890ceccab2e40fb68aae4b89f19;hb=f49ead70985c52e9155c9677e22c5d055d5ab485;hp=4bbf2005a9c7cb317b3f4a88dc499c34b5223f00;hpb=4faf2ba0c7ef9f28a5d4a6c096105ff8aca94279;p=oota-llvm.git diff --git a/lib/Target/TargetLibraryInfo.cpp b/lib/Target/TargetLibraryInfo.cpp index 4bbf2005a9c..ecb38198551 100644 --- a/lib/Target/TargetLibraryInfo.cpp +++ b/lib/Target/TargetLibraryInfo.cpp @@ -28,8 +28,12 @@ const char* TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] = "_IO_putc", "_ZdaPv", "_ZdaPvRKSt9nothrow_t", + "_ZdaPvj", + "_ZdaPvm", "_ZdlPv", "_ZdlPvRKSt9nothrow_t", + "_ZdlPvj", + "_ZdlPvm", "_Znaj", "_ZnajRKSt9nothrow_t", "_Znam", @@ -48,7 +52,7 @@ const char* TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] = "__isoc99_sscanf", "__memcpy_chk", "__sincospi_stret", - "__sincospi_stretf", + "__sincospif_stret", "__sinpi", "__sinpif", "__sqrt_finite", @@ -190,6 +194,9 @@ const char* TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] = "isdigit", "labs", "lchown", + "ldexp", + "ldexpf", + "ldexpl", "llabs", "log", "log10", @@ -345,7 +352,7 @@ const char* TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] = static bool hasSinCosPiStret(const Triple &T) { // Only Darwin variants have _stret versions of combined trig functions. - if (!T.isMacOSX() && T.getOS() != Triple::IOS) + if (!T.isOSDarwin()) return false; // The ABI is rather complicated on x86, so don't do anything special there. @@ -355,7 +362,7 @@ static bool hasSinCosPiStret(const Triple &T) { if (T.isMacOSX() && T.isMacOSXVersionLT(10, 9)) return false; - if (T.getOS() == Triple::IOS && T.isOSVersionLT(7, 0)) + if (T.isiOS() && T.isOSVersionLT(7, 0)) return false; return true; @@ -375,8 +382,17 @@ static void initialize(TargetLibraryInfo &TLI, const Triple &T, llvm_unreachable("TargetLibraryInfo function names must be sorted"); } #endif // !NDEBUG - - // memset_pattern16 is only available on iOS 3.0 and Mac OS/X 10.5 and later. + + // There are no library implementations of mempcy and memset for r600 and + // these can be difficult to lower in the backend. + if (T.getArch() == Triple::r600) { + TLI.setUnavailable(LibFunc::memcpy); + TLI.setUnavailable(LibFunc::memset); + TLI.setUnavailable(LibFunc::memset_pattern16); + return; + } + + // memset_pattern16 is only available on iOS 3.0 and Mac OS X 10.5 and later. if (T.isMacOSX()) { if (T.isMacOSXVersionLT(10, 5)) TLI.setUnavailable(LibFunc::memset_pattern16); @@ -393,7 +409,7 @@ static void initialize(TargetLibraryInfo &TLI, const Triple &T, TLI.setUnavailable(LibFunc::cospi); TLI.setUnavailable(LibFunc::cospif); TLI.setUnavailable(LibFunc::sincospi_stret); - TLI.setUnavailable(LibFunc::sincospi_stretf); + TLI.setUnavailable(LibFunc::sincospif_stret); } if (T.isMacOSX() && T.getArch() == Triple::x86 && @@ -407,37 +423,6 @@ static void initialize(TargetLibraryInfo &TLI, const Triple &T, TLI.setAvailableWithName(LibFunc::fputs, "fputs$UNIX2003"); } - // exp10 and exp10f are not available on OS X until 10.9 and iOS until 7.0 - // and their names are __exp10 and __exp10f. exp10l is not available on - // OS X or iOS. - if (T.isMacOSX()) { - TLI.setUnavailable(LibFunc::exp10l); - if (T.isMacOSXVersionLT(10, 9)) { - TLI.setUnavailable(LibFunc::exp10); - TLI.setUnavailable(LibFunc::exp10f); - } else { - TLI.setAvailableWithName(LibFunc::exp10, "__exp10"); - TLI.setAvailableWithName(LibFunc::exp10f, "__exp10f"); - } - } - - if (T.getOS() == Triple::IOS) { - TLI.setUnavailable(LibFunc::exp10l); - if (T.isOSVersionLT(7, 0)) { - TLI.setUnavailable(LibFunc::exp10); - TLI.setUnavailable(LibFunc::exp10f); - } else { - TLI.setAvailableWithName(LibFunc::exp10, "__exp10"); - TLI.setAvailableWithName(LibFunc::exp10f, "__exp10f"); - } - } - - if (T.getOS() == Triple::NetBSD) { - TLI.setUnavailable(LibFunc::exp10l); - TLI.setUnavailable(LibFunc::exp10); - TLI.setUnavailable(LibFunc::exp10f); - } - // iprintf and friends are only available on XCore and TCE. if (T.getArch() != Triple::xcore && T.getArch() != Triple::tce) { TLI.setUnavailable(LibFunc::iprintf); @@ -445,7 +430,7 @@ static void initialize(TargetLibraryInfo &TLI, const Triple &T, TLI.setUnavailable(LibFunc::fiprintf); } - if (T.getOS() == Triple::Win32) { + if (T.isOSWindows() && !T.isOSCygMing()) { // Win32 does not support long double TLI.setUnavailable(LibFunc::acosl); TLI.setUnavailable(LibFunc::asinl); @@ -463,6 +448,8 @@ static void initialize(TargetLibraryInfo &TLI, const Triple &T, TLI.setUnavailable(LibFunc::fminl); TLI.setUnavailable(LibFunc::fmodl); TLI.setUnavailable(LibFunc::frexpl); + TLI.setUnavailable(LibFunc::ldexpf); + TLI.setUnavailable(LibFunc::ldexpl); TLI.setUnavailable(LibFunc::logl); TLI.setUnavailable(LibFunc::modfl); TLI.setUnavailable(LibFunc::powl); @@ -485,9 +472,6 @@ static void initialize(TargetLibraryInfo &TLI, const Triple &T, TLI.setUnavailable(LibFunc::cbrt); TLI.setUnavailable(LibFunc::cbrtf); TLI.setUnavailable(LibFunc::cbrtl); - TLI.setUnavailable(LibFunc::exp10); - TLI.setUnavailable(LibFunc::exp10f); - TLI.setUnavailable(LibFunc::exp10l); TLI.setUnavailable(LibFunc::exp2); TLI.setUnavailable(LibFunc::exp2f); TLI.setUnavailable(LibFunc::exp2l); @@ -608,6 +592,43 @@ static void initialize(TargetLibraryInfo &TLI, const Triple &T, TLI.setUnavailable(LibFunc::llabs); } + switch (T.getOS()) { + case Triple::MacOSX: + // exp10 and exp10f are not available on OS X until 10.9 and iOS until 7.0 + // and their names are __exp10 and __exp10f. exp10l is not available on + // OS X or iOS. + TLI.setUnavailable(LibFunc::exp10l); + if (T.isMacOSXVersionLT(10, 9)) { + TLI.setUnavailable(LibFunc::exp10); + TLI.setUnavailable(LibFunc::exp10f); + } else { + TLI.setAvailableWithName(LibFunc::exp10, "__exp10"); + TLI.setAvailableWithName(LibFunc::exp10f, "__exp10f"); + } + break; + case Triple::IOS: + TLI.setUnavailable(LibFunc::exp10l); + if (T.isOSVersionLT(7, 0)) { + TLI.setUnavailable(LibFunc::exp10); + TLI.setUnavailable(LibFunc::exp10f); + } else { + TLI.setAvailableWithName(LibFunc::exp10, "__exp10"); + TLI.setAvailableWithName(LibFunc::exp10f, "__exp10f"); + } + break; + case Triple::Linux: + // exp10, exp10f, exp10l is available on Linux (GLIBC) but are extremely + // buggy prior to glibc version 2.18. Until this version is widely deployed + // or we have a reasonable detection strategy, we cannot use exp10 reliably + // on Linux. + // + // Fall through to disable all of them. + default: + TLI.setUnavailable(LibFunc::exp10); + TLI.setUnavailable(LibFunc::exp10f); + TLI.setUnavailable(LibFunc::exp10l); + } + // ffsl is available on at least Darwin, Mac OS X, iOS, FreeBSD, and // Linux (GLIBC): // http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/ffsl.3.html