blob: 768facb56a6643fa21233686275a97fb90e845bc [file] [log] [blame]
Chris Lattnerce991202011-02-18 21:50:34 +00001//===-- TargetLibraryInfo.cpp - Runtime library information ----------------==//
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// This file implements the TargetLibraryInfo class.
11//
12//===----------------------------------------------------------------------===//
13
14#include "llvm/Target/TargetLibraryInfo.h"
15#include "llvm/ADT/Triple.h"
16using namespace llvm;
17
18// Register the default implementation.
19INITIALIZE_PASS(TargetLibraryInfo, "targetlibinfo",
20 "Target Library Information", false, true)
21char TargetLibraryInfo::ID = 0;
22
Eli Friedman9d434db2011-11-17 01:27:36 +000023const char* TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] =
24 {
Chad Rosier8ff41152011-11-30 19:19:00 +000025 "acos",
26 "acosl",
27 "acosf",
28 "asin",
29 "asinl",
30 "asinf",
31 "atan",
32 "atanl",
33 "atanf",
Chad Rosier32b6c592011-12-01 17:54:37 +000034 "atan2",
35 "atan2l",
36 "atan2f",
Chad Rosier8ff41152011-11-30 19:19:00 +000037 "ceil",
38 "ceill",
39 "ceilf",
Owen Anderson243eb9e2011-12-08 22:15:21 +000040 "copysign",
41 "copysignf",
42 "copysignl",
Chad Rosier8ff41152011-11-30 19:19:00 +000043 "cos",
44 "cosl",
45 "cosf",
46 "cosh",
47 "coshl",
48 "coshf",
49 "exp",
50 "expl",
51 "expf",
52 "exp2",
53 "exp2l",
54 "exp2f",
55 "expm1",
56 "expm1l",
57 "expl1f",
58 "fabs",
59 "fabsl",
60 "fabsf",
61 "floor",
62 "floorl",
63 "floorf",
Chad Rosier683e47b2011-11-30 01:51:49 +000064 "fiprintf",
Chad Rosier32b6c592011-12-01 17:54:37 +000065 "fmod",
66 "fmodl",
67 "fmodf",
Chad Rosier683e47b2011-11-30 01:51:49 +000068 "fputs",
69 "fwrite",
70 "iprintf",
Chad Rosier8ff41152011-11-30 19:19:00 +000071 "log",
72 "logl",
73 "logf",
74 "log2",
75 "log2l",
76 "log2f",
77 "log10",
78 "log10l",
79 "log10f",
80 "log1p",
81 "log1pl",
82 "log1pf",
Eli Friedman9d434db2011-11-17 01:27:36 +000083 "memcpy",
84 "memmove",
Chad Rosier683e47b2011-11-30 01:51:49 +000085 "memset",
Eli Friedman9d434db2011-11-17 01:27:36 +000086 "memset_pattern16",
Owen Anderson243eb9e2011-12-08 22:15:21 +000087 "nearbyint",
88 "nearbyintf",
89 "nearbyintl",
Chad Rosier8ff41152011-11-30 19:19:00 +000090 "pow",
91 "powf",
92 "powl",
Owen Anderson243eb9e2011-12-08 22:15:21 +000093 "rint",
94 "rintf",
95 "rintl",
Chad Rosier32b6c592011-12-01 17:54:37 +000096 "sin",
97 "sinl",
98 "sinf",
Chad Rosierfbd828d2011-12-01 18:26:19 +000099 "sinh",
100 "sinhl",
101 "sinhf",
102 "siprintf",
Chad Rosier3d925d22011-11-29 23:57:10 +0000103 "sqrt",
Chad Rosier8ff41152011-11-30 19:19:00 +0000104 "sqrtl",
Chad Rosier32b6c592011-12-01 17:54:37 +0000105 "sqrtf",
106 "tan",
107 "tanl",
108 "tanf",
109 "tanh",
110 "tanhl",
Owen Anderson243eb9e2011-12-08 22:15:21 +0000111 "tanhf",
112 "trunc",
113 "truncf",
114 "truncl"
Eli Friedman9d434db2011-11-17 01:27:36 +0000115 };
116
Chris Lattnerce991202011-02-18 21:50:34 +0000117/// initialize - Initialize the set of available library functions based on the
118/// specified target triple. This should be carefully written so that a missing
119/// target triple gets a sane set of defaults.
120static void initialize(TargetLibraryInfo &TLI, const Triple &T) {
121 initializeTargetLibraryInfoPass(*PassRegistry::getPassRegistry());
122
123
124 // memset_pattern16 is only available on iOS 3.0 and Mac OS/X 10.5 and later.
Daniel Dunbar558692f2011-04-20 00:14:25 +0000125 if (T.isMacOSX()) {
126 if (T.isMacOSXVersionLT(10, 5))
Daniel Dunbar13fb3b52011-04-19 20:44:08 +0000127 TLI.setUnavailable(LibFunc::memset_pattern16);
128 } else if (T.getOS() == Triple::IOS) {
129 if (T.isOSVersionLT(3, 0))
130 TLI.setUnavailable(LibFunc::memset_pattern16);
131 } else {
Chris Lattnerce991202011-02-18 21:50:34 +0000132 TLI.setUnavailable(LibFunc::memset_pattern16);
Daniel Dunbar13fb3b52011-04-19 20:44:08 +0000133 }
Richard Osborne36498242011-03-03 13:17:51 +0000134
Eli Friedman9d434db2011-11-17 01:27:36 +0000135 if (T.isMacOSX() && T.getArch() == Triple::x86 &&
136 !T.isMacOSXVersionLT(10, 7)) {
137 // x86-32 OSX has a scheme where fwrite and fputs (and some other functions
138 // we don't care about) have two versions; on recent OSX, the one we want
139 // has a $UNIX2003 suffix. The two implementations are identical except
140 // for the return value in some edge cases. However, we don't want to
141 // generate code that depends on the old symbols.
142 TLI.setAvailableWithName(LibFunc::fwrite, "fwrite$UNIX2003");
143 TLI.setAvailableWithName(LibFunc::fputs, "fputs$UNIX2003");
144 }
145
Duncan Sands9fe88972011-06-09 11:11:45 +0000146 // iprintf and friends are only available on XCore and TCE.
147 if (T.getArch() != Triple::xcore && T.getArch() != Triple::tce) {
Richard Osborne36498242011-03-03 13:17:51 +0000148 TLI.setUnavailable(LibFunc::iprintf);
Richard Osborne419454a2011-03-03 14:09:28 +0000149 TLI.setUnavailable(LibFunc::siprintf);
Richard Osborne022708f2011-03-03 14:20:22 +0000150 TLI.setUnavailable(LibFunc::fiprintf);
Richard Osborne419454a2011-03-03 14:09:28 +0000151 }
Chris Lattnerce991202011-02-18 21:50:34 +0000152}
153
154
155TargetLibraryInfo::TargetLibraryInfo() : ImmutablePass(ID) {
156 // Default to everything being available.
157 memset(AvailableArray, -1, sizeof(AvailableArray));
158
159 initialize(*this, Triple());
160}
161
162TargetLibraryInfo::TargetLibraryInfo(const Triple &T) : ImmutablePass(ID) {
163 // Default to everything being available.
164 memset(AvailableArray, -1, sizeof(AvailableArray));
165
166 initialize(*this, T);
167}
Chris Lattner188a7e02011-02-18 22:34:03 +0000168
Chris Lattner40f5fbc2011-05-21 20:09:13 +0000169TargetLibraryInfo::TargetLibraryInfo(const TargetLibraryInfo &TLI)
170 : ImmutablePass(ID) {
171 memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
Eli Friedman9d434db2011-11-17 01:27:36 +0000172 CustomNames = TLI.CustomNames;
Chris Lattner40f5fbc2011-05-21 20:09:13 +0000173}
174
175
Chris Lattner188a7e02011-02-18 22:34:03 +0000176/// disableAllFunctions - This disables all builtins, which is used for options
177/// like -fno-builtin.
178void TargetLibraryInfo::disableAllFunctions() {
179 memset(AvailableArray, 0, sizeof(AvailableArray));
180}