1 //===-- 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"
16 using namespace llvm;
17
18 // Register the default implementation.
19 INITIALIZE_PASS(TargetLibraryInfo, "targetlibinfo",
20 "Target Library Information", false, true)
21 char TargetLibraryInfo::ID = 0;
22
anchor()23 void TargetLibraryInfo::anchor() { }
24
25 const char* TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] =
26 {
27 "_ZdaPv",
28 "_ZdlPv",
29 "_Znaj",
30 "_ZnajRKSt9nothrow_t",
31 "_Znam",
32 "_ZnamRKSt9nothrow_t",
33 "_Znwj",
34 "_ZnwjRKSt9nothrow_t",
35 "_Znwm",
36 "_ZnwmRKSt9nothrow_t",
37 "__cxa_atexit",
38 "__cxa_guard_abort",
39 "__cxa_guard_acquire",
40 "__cxa_guard_release",
41 "__memcpy_chk",
42 "acos",
43 "acosf",
44 "acosh",
45 "acoshf",
46 "acoshl",
47 "acosl",
48 "asin",
49 "asinf",
50 "asinh",
51 "asinhf",
52 "asinhl",
53 "asinl",
54 "atan",
55 "atan2",
56 "atan2f",
57 "atan2l",
58 "atanf",
59 "atanh",
60 "atanhf",
61 "atanhl",
62 "atanl",
63 "calloc",
64 "cbrt",
65 "cbrtf",
66 "cbrtl",
67 "ceil",
68 "ceilf",
69 "ceill",
70 "copysign",
71 "copysignf",
72 "copysignl",
73 "cos",
74 "cosf",
75 "cosh",
76 "coshf",
77 "coshl",
78 "cosl",
79 "exp",
80 "exp10",
81 "exp10f",
82 "exp10l",
83 "exp2",
84 "exp2f",
85 "exp2l",
86 "expf",
87 "expl",
88 "expm1",
89 "expm1f",
90 "expm1l",
91 "fabs",
92 "fabsf",
93 "fabsl",
94 "fiprintf",
95 "floor",
96 "floorf",
97 "floorl",
98 "fmod",
99 "fmodf",
100 "fmodl",
101 "fputc",
102 "fputs",
103 "free",
104 "fwrite",
105 "iprintf",
106 "log",
107 "log10",
108 "log10f",
109 "log10l",
110 "log1p",
111 "log1pf",
112 "log1pl",
113 "log2",
114 "log2f",
115 "log2l",
116 "logb",
117 "logbf",
118 "logbl",
119 "logf",
120 "logl",
121 "malloc",
122 "memchr",
123 "memcmp",
124 "memcpy",
125 "memmove",
126 "memset",
127 "memset_pattern16",
128 "nearbyint",
129 "nearbyintf",
130 "nearbyintl",
131 "posix_memalign",
132 "pow",
133 "powf",
134 "powl",
135 "putchar",
136 "puts",
137 "realloc",
138 "reallocf",
139 "rint",
140 "rintf",
141 "rintl",
142 "round",
143 "roundf",
144 "roundl",
145 "sin",
146 "sinf",
147 "sinh",
148 "sinhf",
149 "sinhl",
150 "sinl",
151 "siprintf",
152 "sqrt",
153 "sqrtf",
154 "sqrtl",
155 "strcat",
156 "strchr",
157 "strcpy",
158 "strdup",
159 "strlen",
160 "strncat",
161 "strncmp",
162 "strncpy",
163 "strndup",
164 "strnlen",
165 "tan",
166 "tanf",
167 "tanh",
168 "tanhf",
169 "tanhl",
170 "tanl",
171 "trunc",
172 "truncf",
173 "truncl",
174 "valloc"
175 };
176
177 /// initialize - Initialize the set of available library functions based on the
178 /// specified target triple. This should be carefully written so that a missing
179 /// target triple gets a sane set of defaults.
initialize(TargetLibraryInfo & TLI,const Triple & T,const char ** StandardNames)180 static void initialize(TargetLibraryInfo &TLI, const Triple &T,
181 const char **StandardNames) {
182 initializeTargetLibraryInfoPass(*PassRegistry::getPassRegistry());
183
184 #ifndef NDEBUG
185 // Verify that the StandardNames array is in alphabetical order.
186 for (unsigned F = 1; F < LibFunc::NumLibFuncs; ++F) {
187 if (strcmp(StandardNames[F-1], StandardNames[F]) >= 0)
188 llvm_unreachable("TargetLibraryInfo function names must be sorted");
189 }
190 #endif // !NDEBUG
191
192 // memset_pattern16 is only available on iOS 3.0 and Mac OS/X 10.5 and later.
193 if (T.isMacOSX()) {
194 if (T.isMacOSXVersionLT(10, 5))
195 TLI.setUnavailable(LibFunc::memset_pattern16);
196 } else if (T.getOS() == Triple::IOS) {
197 if (T.isOSVersionLT(3, 0))
198 TLI.setUnavailable(LibFunc::memset_pattern16);
199 } else {
200 TLI.setUnavailable(LibFunc::memset_pattern16);
201 }
202
203 if (T.isMacOSX() && T.getArch() == Triple::x86 &&
204 !T.isMacOSXVersionLT(10, 7)) {
205 // x86-32 OSX has a scheme where fwrite and fputs (and some other functions
206 // we don't care about) have two versions; on recent OSX, the one we want
207 // has a $UNIX2003 suffix. The two implementations are identical except
208 // for the return value in some edge cases. However, we don't want to
209 // generate code that depends on the old symbols.
210 TLI.setAvailableWithName(LibFunc::fwrite, "fwrite$UNIX2003");
211 TLI.setAvailableWithName(LibFunc::fputs, "fputs$UNIX2003");
212 }
213
214 // iprintf and friends are only available on XCore and TCE.
215 if (T.getArch() != Triple::xcore && T.getArch() != Triple::tce) {
216 TLI.setUnavailable(LibFunc::iprintf);
217 TLI.setUnavailable(LibFunc::siprintf);
218 TLI.setUnavailable(LibFunc::fiprintf);
219 }
220
221 if (T.getOS() == Triple::Win32) {
222 // Win32 does not support long double
223 TLI.setUnavailable(LibFunc::acosl);
224 TLI.setUnavailable(LibFunc::asinl);
225 TLI.setUnavailable(LibFunc::atanl);
226 TLI.setUnavailable(LibFunc::atan2l);
227 TLI.setUnavailable(LibFunc::ceill);
228 TLI.setUnavailable(LibFunc::copysignl);
229 TLI.setUnavailable(LibFunc::cosl);
230 TLI.setUnavailable(LibFunc::coshl);
231 TLI.setUnavailable(LibFunc::expl);
232 TLI.setUnavailable(LibFunc::fabsf); // Win32 and Win64 both lack fabsf
233 TLI.setUnavailable(LibFunc::fabsl);
234 TLI.setUnavailable(LibFunc::floorl);
235 TLI.setUnavailable(LibFunc::fmodl);
236 TLI.setUnavailable(LibFunc::logl);
237 TLI.setUnavailable(LibFunc::powl);
238 TLI.setUnavailable(LibFunc::sinl);
239 TLI.setUnavailable(LibFunc::sinhl);
240 TLI.setUnavailable(LibFunc::sqrtl);
241 TLI.setUnavailable(LibFunc::tanl);
242 TLI.setUnavailable(LibFunc::tanhl);
243
244 // Win32 only has C89 math
245 TLI.setUnavailable(LibFunc::acosh);
246 TLI.setUnavailable(LibFunc::acoshf);
247 TLI.setUnavailable(LibFunc::acoshl);
248 TLI.setUnavailable(LibFunc::asinh);
249 TLI.setUnavailable(LibFunc::asinhf);
250 TLI.setUnavailable(LibFunc::asinhl);
251 TLI.setUnavailable(LibFunc::atanh);
252 TLI.setUnavailable(LibFunc::atanhf);
253 TLI.setUnavailable(LibFunc::atanhl);
254 TLI.setUnavailable(LibFunc::cbrt);
255 TLI.setUnavailable(LibFunc::cbrtf);
256 TLI.setUnavailable(LibFunc::cbrtl);
257 TLI.setUnavailable(LibFunc::exp10);
258 TLI.setUnavailable(LibFunc::exp10f);
259 TLI.setUnavailable(LibFunc::exp10l);
260 TLI.setUnavailable(LibFunc::exp2);
261 TLI.setUnavailable(LibFunc::exp2f);
262 TLI.setUnavailable(LibFunc::exp2l);
263 TLI.setUnavailable(LibFunc::expm1);
264 TLI.setUnavailable(LibFunc::expm1f);
265 TLI.setUnavailable(LibFunc::expm1l);
266 TLI.setUnavailable(LibFunc::log2);
267 TLI.setUnavailable(LibFunc::log2f);
268 TLI.setUnavailable(LibFunc::log2l);
269 TLI.setUnavailable(LibFunc::log1p);
270 TLI.setUnavailable(LibFunc::log1pf);
271 TLI.setUnavailable(LibFunc::log1pl);
272 TLI.setUnavailable(LibFunc::logb);
273 TLI.setUnavailable(LibFunc::logbf);
274 TLI.setUnavailable(LibFunc::logbl);
275 TLI.setUnavailable(LibFunc::nearbyint);
276 TLI.setUnavailable(LibFunc::nearbyintf);
277 TLI.setUnavailable(LibFunc::nearbyintl);
278 TLI.setUnavailable(LibFunc::rint);
279 TLI.setUnavailable(LibFunc::rintf);
280 TLI.setUnavailable(LibFunc::rintl);
281 TLI.setUnavailable(LibFunc::round);
282 TLI.setUnavailable(LibFunc::roundf);
283 TLI.setUnavailable(LibFunc::roundl);
284 TLI.setUnavailable(LibFunc::trunc);
285 TLI.setUnavailable(LibFunc::truncf);
286 TLI.setUnavailable(LibFunc::truncl);
287
288 // Win32 provides some C99 math with mangled names
289 TLI.setAvailableWithName(LibFunc::copysign, "_copysign");
290
291 if (T.getArch() == Triple::x86) {
292 // Win32 on x86 implements single-precision math functions as macros
293 TLI.setUnavailable(LibFunc::acosf);
294 TLI.setUnavailable(LibFunc::asinf);
295 TLI.setUnavailable(LibFunc::atanf);
296 TLI.setUnavailable(LibFunc::atan2f);
297 TLI.setUnavailable(LibFunc::ceilf);
298 TLI.setUnavailable(LibFunc::copysignf);
299 TLI.setUnavailable(LibFunc::cosf);
300 TLI.setUnavailable(LibFunc::coshf);
301 TLI.setUnavailable(LibFunc::expf);
302 TLI.setUnavailable(LibFunc::floorf);
303 TLI.setUnavailable(LibFunc::fmodf);
304 TLI.setUnavailable(LibFunc::logf);
305 TLI.setUnavailable(LibFunc::powf);
306 TLI.setUnavailable(LibFunc::sinf);
307 TLI.setUnavailable(LibFunc::sinhf);
308 TLI.setUnavailable(LibFunc::sqrtf);
309 TLI.setUnavailable(LibFunc::tanf);
310 TLI.setUnavailable(LibFunc::tanhf);
311 }
312 }
313 }
314
315
TargetLibraryInfo()316 TargetLibraryInfo::TargetLibraryInfo() : ImmutablePass(ID) {
317 // Default to everything being available.
318 memset(AvailableArray, -1, sizeof(AvailableArray));
319
320 initialize(*this, Triple(), StandardNames);
321 }
322
TargetLibraryInfo(const Triple & T)323 TargetLibraryInfo::TargetLibraryInfo(const Triple &T) : ImmutablePass(ID) {
324 // Default to everything being available.
325 memset(AvailableArray, -1, sizeof(AvailableArray));
326
327 initialize(*this, T, StandardNames);
328 }
329
TargetLibraryInfo(const TargetLibraryInfo & TLI)330 TargetLibraryInfo::TargetLibraryInfo(const TargetLibraryInfo &TLI)
331 : ImmutablePass(ID) {
332 memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray));
333 CustomNames = TLI.CustomNames;
334 }
335
getLibFunc(StringRef funcName,LibFunc::Func & F) const336 bool TargetLibraryInfo::getLibFunc(StringRef funcName,
337 LibFunc::Func &F) const {
338 const char **Start = &StandardNames[0];
339 const char **End = &StandardNames[LibFunc::NumLibFuncs];
340 const char **I = std::lower_bound(Start, End, funcName);
341 if (I != End && *I == funcName) {
342 F = (LibFunc::Func)(I - Start);
343 return true;
344 }
345 return false;
346 }
347
348 /// disableAllFunctions - This disables all builtins, which is used for options
349 /// like -fno-builtin.
disableAllFunctions()350 void TargetLibraryInfo::disableAllFunctions() {
351 memset(AvailableArray, 0, sizeof(AvailableArray));
352 }
353