Add platform specific version tags.

Some functions were added at different times on different platforms.
This should hopefully get most of them.

Bug: http://b/28178111
Change-Id: I85fdf92779a2f3277e9b537c6bfc7216790c607a
diff --git a/libc/include/link.h b/libc/include/link.h
index e6c5404..2d189f6 100644
--- a/libc/include/link.h
+++ b/libc/include/link.h
@@ -46,7 +46,11 @@
   ElfW(Half) dlpi_phnum;
 };
 
+#if defined(__arm__)
 int dl_iterate_phdr(int (*)(struct dl_phdr_info*, size_t, void*), void*) __INTRODUCED_IN(21);
+#else
+int dl_iterate_phdr(int (*)(struct dl_phdr_info*, size_t, void*), void*);
+#endif
 
 #ifdef __arm__
 typedef long unsigned int* _Unwind_Ptr;
diff --git a/libc/include/math.h b/libc/include/math.h
index 6d0db17..97539d7 100644
--- a/libc/include/math.h
+++ b/libc/include/math.h
@@ -127,6 +127,13 @@
 #endif
 #endif /* __BSD_VISIBLE */
 
+/* scalbln, scalbnf, and scalblnl were unavailable on x86 until API level 18 */
+#if defined(__i386__)
+#define __INTRODUCED_IN_X86 __INTRODUCED_IN
+#else
+#define __INTRODUCED_IN_X86(x)
+#endif
+
 /*
  * Most of these functions depend on the rounding mode and have the side
  * effect of raising floating-point exceptions, so they are not declared
@@ -237,7 +244,7 @@
 double	nearbyint(double);
 double	round(double);
 double	scalbln(double, long);
-double	scalbn(double, int);
+double scalbn(double, int) __INTRODUCED_IN_X86(18);
 double	tgamma(double);
 double	trunc(double);
 #endif
@@ -322,7 +329,7 @@
 float	remquof(float, float, int *);
 float	rintf(float);
 float	scalblnf(float, long);
-float	scalbnf(float, int);
+float scalbnf(float, int) __INTRODUCED_IN_X86(18);
 float	truncf(float);
 
 float	fdimf(float, float);
@@ -415,7 +422,7 @@
 long double rintl(long double) __INTRODUCED_IN(21);
 long double	roundl(long double);
 long double	scalblnl(long double, long);
-long double	scalbnl(long double, int);
+long double scalbnl(long double, int) __INTRODUCED_IN_X86(18);
 long double sinhl(long double) __INTRODUCED_IN(21);
 long double sinl(long double) __INTRODUCED_IN(21);
 long double sqrtl(long double) __INTRODUCED_IN(21);
diff --git a/libc/include/strings.h b/libc/include/strings.h
index 1200e77..ca9f658 100644
--- a/libc/include/strings.h
+++ b/libc/include/strings.h
@@ -54,7 +54,11 @@
 #define bzero(b, len) (void)(__builtin_memset((b), '\0', (len)))
 #endif
 
+#if defined(__i386__)
+int ffs(int) __INTRODUCED_IN(21);
+#else
 int ffs(int);
+#endif
 
 __END_DECLS
 
diff --git a/libc/include/sys/resource.h b/libc/include/sys/resource.h
index 74e903f..3187420 100644
--- a/libc/include/sys/resource.h
+++ b/libc/include/sys/resource.h
@@ -53,7 +53,8 @@
 
 extern int getrusage(int, struct rusage*);
 
-extern int prlimit(pid_t, int, const struct rlimit*, struct rlimit*) __INTRODUCED_IN(24);
+extern int prlimit(pid_t, int, const struct rlimit*, struct rlimit*) __INTRODUCED_IN_32(24)
+  __INTRODUCED_IN_64(21);
 extern int prlimit64(pid_t, int, const struct rlimit64*, struct rlimit64*) __INTRODUCED_IN(21);
 
 __END_DECLS