[PATCH v2] Add more functions to the TLI.

Bill Wendling wendling at apple.com
Wed Feb 27 11:01:09 PST 2013


This patch looks fairly mechanical to me and okay as far as I can see. I know that Nadav's been looking at this from a performance standpoint. So I'll let him comment on it. But otherwise it LGTM.

-bw

On Feb 25, 2013, at 1:57 PM, Hal Finkel <hfinkel at anl.gov> wrote:

> ----- Original Message -----
>> From: "Meador Inge" <meadori at codesourcery.com>
>> To: llvm-commits at cs.uiuc.edu
>> Sent: Monday, February 25, 2013 3:39:40 PM
>> Subject: Re: [PATCH v2] Add more functions to the TLI.
>> 
>> Ping.
> 
> FWIW, I have no further suggestions for this patch. I am not sufficiently familiar, however, with the motivating refactoring, and so I don't feel qualified to approve.
> 
> -Hal
> 
>> 
>> On 02/21/2013 12:37 PM, Meador Inge wrote:
>>> This patch adds many more functions to the target library
>>> information.
>>> All of the functions being added were discovered while doing the
>>> migration
>>> of the simplify-libcalls attribute annotation functionality to the
>>> functionattrs pass.  As a part of that work the attribute
>>> annotation logic
>>> will query TLI to determine if a function should be annotated or
>>> not.
>>> 
>>> OK?
>>> 
>>> Signed-off-by: Meador Inge <meadori at codesourcery.com>
>>> ---
>>> Changes since v1:
>>> 
>>>   * After a discussion with Hal Finkel I decided to not explicitly
>>>   enumerate
>>>     the \01 prefixed functions in the TLI.  Now I just strip \01
>>>     prefix in
>>>     'getLibFunc' so that it works for all prefixed functions.
>>> 
>>> include/llvm/Target/TargetLibraryInfo.h | 253
>>> ++++++++++++++++++++++++++++++++
>>> lib/Target/TargetLibraryInfo.cpp        | 221
>>> ++++++++++++++++++++++++++--
>>> 2 files changed, 465 insertions(+), 9 deletions(-)
>>> 
>>> diff --git a/include/llvm/Target/TargetLibraryInfo.h
>>> b/include/llvm/Target/TargetLibraryInfo.h
>>> index ceeba4f..5f01c8d 100644
>>> --- a/include/llvm/Target/TargetLibraryInfo.h
>>> +++ b/include/llvm/Target/TargetLibraryInfo.h
>>> @@ -18,6 +18,10 @@ namespace llvm {
>>> 
>>>   namespace LibFunc {
>>>     enum Func {
>>> +      /// int _IO_getc(_IO_FILE * __fp);
>>> +      under_IO_getc,
>>> +      /// int _IO_putc(int __c, _IO_FILE * __fp);
>>> +      under_IO_putc,
>>>       /// void operator delete[](void*);
>>>       ZdaPv,
>>>       /// void operator delete(void*);
>>> @@ -47,10 +51,22 @@ namespace llvm {
>>>       cxa_guard_acquire,
>>>       /// void __cxa_guard_release(guard_t *guard);
>>>       cxa_guard_release,
>>> +      /// int __isoc99_scanf (const char *format, ...)
>>> +      dunder_isoc99_scanf,
>>> +      /// int __isoc99_sscanf(const char *s, const char *format,
>>> ...)
>>> +      dunder_isoc99_sscanf,
>>>       /// void *__memcpy_chk(void *s1, const void *s2, size_t n,
>>>       size_t s1size);
>>>       memcpy_chk,
>>> +      /// char * __strdup(const char *s);
>>> +      dunder_strdup,
>>> +      /// char *__strndup(const char *s, size_t n);
>>> +      dunder_strndup,
>>> +      /// char * __strtok_r(char *s, const char *delim, char
>>> **save_ptr);
>>> +      dunder_strtok_r,
>>>       /// int abs(int j);
>>>       abs,
>>> +      /// int access(const char *path, int amode);
>>> +      access,
>>>       /// double acos(double x);
>>>       acos,
>>>       /// float acosf(float x);
>>> @@ -93,6 +109,20 @@ namespace llvm {
>>>       atanhl,
>>>       /// long double atanl(long double x);
>>>       atanl,
>>> +      /// double atof(const char *str);
>>> +      atof,
>>> +      /// int atoi(const char *str);
>>> +      atoi,
>>> +      /// long atol(const char *str);
>>> +      atol,
>>> +      /// long long atoll(const char *nptr);
>>> +      atoll,
>>> +      /// int bcmp(const void *s1, const void *s2, size_t n);
>>> +      bcmp,
>>> +      /// void bcopy(const void *s1, void *s2, size_t n);
>>> +      bcopy,
>>> +      /// void bzero(void *s, size_t n);
>>> +      bzero,
>>>       /// void *calloc(size_t count, size_t size);
>>>       calloc,
>>>       /// double cbrt(double x);
>>> @@ -107,6 +137,14 @@ namespace llvm {
>>>       ceilf,
>>>       /// long double ceill(long double x);
>>>       ceill,
>>> +      /// int chmod(const char *path, mode_t mode);
>>> +      chmod,
>>> +      /// int chown(const char *path, uid_t owner, gid_t group);
>>> +      chown,
>>> +      /// void clearerr(FILE *stream);
>>> +      clearerr,
>>> +      /// int closedir(DIR *dirp);
>>> +      closedir,
>>>       /// double copysign(double x, double y);
>>>       copysign,
>>>       /// float copysignf(float x, float y);
>>> @@ -125,6 +163,8 @@ namespace llvm {
>>>       coshl,
>>>       /// long double cosl(long double x);
>>>       cosl,
>>> +      /// char *ctermid(char *s);
>>> +      ctermid,
>>>       /// double exp(double x);
>>>       exp,
>>>       /// double exp10(double x);
>>> @@ -155,14 +195,34 @@ namespace llvm {
>>>       fabsf,
>>>       /// long double fabsl(long double x);
>>>       fabsl,
>>> +      /// int fclose(FILE *stream);
>>> +      fclose,
>>> +      /// FILE *fdopen(int fildes, const char *mode);
>>> +      fdopen,
>>> +      /// int feof(FILE *stream);
>>> +      feof,
>>> +      /// int ferror(FILE *stream);
>>> +      ferror,
>>> +      /// int fflush(FILE *stream);
>>> +      fflush,
>>>       /// int ffs(int i);
>>>       ffs,
>>>       /// int ffsl(long int i);
>>>       ffsl,
>>>       /// int ffsll(long long int i);
>>>       ffsll,
>>> +      /// int fgetc(FILE *stream);
>>> +      fgetc,
>>> +      /// int fgetpos(FILE *stream, fpos_t *pos);
>>> +      fgetpos,
>>> +      /// char *fgets(char *s, int n, FILE *stream);
>>> +      fgets,
>>> +      /// int fileno(FILE *stream);
>>> +      fileno,
>>>       /// int fiprintf(FILE *stream, const char *format, ...);
>>>       fiprintf,
>>> +      /// void flockfile(FILE *file);
>>> +      flockfile,
>>>       /// double floor(double x);
>>>       floor,
>>>       /// float floorf(float x);
>>> @@ -175,17 +235,77 @@ namespace llvm {
>>>       fmodf,
>>>       /// long double fmodl(long double x, long double y);
>>>       fmodl,
>>> +      /// FILE *fopen(const char *filename, const char *mode);
>>> +      fopen,
>>> +      /// FILE *fopen64(const char *filename, const char
>>> *opentype)
>>> +      fopen64,
>>>       /// int fprintf(FILE *stream, const char *format, ...);
>>>       fprintf,
>>>       /// int fputc(int c, FILE *stream);
>>>       fputc,
>>>       /// int fputs(const char *s, FILE *stream);
>>>       fputs,
>>> +      /// size_t fread(void *ptr, size_t size, size_t nitems, FILE
>>> *stream);
>>> +      fread,
>>>       /// void free(void *ptr);
>>>       free,
>>> +      /// double frexp(double num, int *exp);
>>> +      frexp,
>>> +      /// float frexpf(float num, int *exp);
>>> +      frexpf,
>>> +      /// long double frexpl(long double num, int *exp);
>>> +      frexpl,
>>> +      /// int fscanf(FILE *stream, const char *format, ... );
>>> +      fscanf,
>>> +      /// int fseek(FILE *stream, long offset, int whence);
>>> +      fseek,
>>> +      /// int fseeko(FILE *stream, off_t offset, int whence);
>>> +      fseeko,
>>> +      /// int fseeko64(FILE *stream, off64_t offset, int whence)
>>> +      fseeko64,
>>> +      /// int fsetpos(FILE *stream, const fpos_t *pos);
>>> +      fsetpos,
>>> +      /// int fstat(int fildes, struct stat *buf);
>>> +      fstat,
>>> +      /// int fstat64(int filedes, struct stat64 *buf)
>>> +      fstat64,
>>> +      /// int fstatvfs(int fildes, struct statvfs *buf);
>>> +      fstatvfs,
>>> +      /// int fstatvfs64(int fildes, struct statvfs64 *buf);
>>> +      fstatvfs64,
>>> +      /// long ftell(FILE *stream);
>>> +      ftell,
>>> +      /// off_t ftello(FILE *stream);
>>> +      ftello,
>>> +      /// off64_t ftello64(FILE *stream)
>>> +      ftello64,
>>> +      /// int ftrylockfile(FILE *file);
>>> +      ftrylockfile,
>>> +      /// void funlockfile(FILE *file);
>>> +      funlockfile,
>>>       /// size_t fwrite(const void *ptr, size_t size, size_t
>>>       nitems,
>>>       /// FILE *stream);
>>>       fwrite,
>>> +      /// int getc(FILE *stream);
>>> +      getc,
>>> +      /// int getc_unlocked(FILE *stream);
>>> +      getc_unlocked,
>>> +      /// int getchar(void);
>>> +      getchar,
>>> +      /// char *getenv(const char *name);
>>> +      getenv,
>>> +      /// int getitimer(int which, struct itimerval *value);
>>> +      getitimer,
>>> +      /// int getlogin_r(char *name, size_t namesize);
>>> +      getlogin_r,
>>> +      /// struct passwd *getpwnam(const char *name);
>>> +      getpwnam,
>>> +      /// char *gets(char *s);
>>> +      gets,
>>> +      /// uint32_t htonl(uint32_t hostlong);
>>> +      htonl,
>>> +      /// uint16_t htons(uint16_t hostshort);
>>> +      htons,
>>>       /// int iprintf(const char *format, ...);
>>>       iprintf,
>>>       /// int isascii(int c);
>>> @@ -194,6 +314,8 @@ namespace llvm {
>>>       isdigit,
>>>       /// long int labs(long int j);
>>>       labs,
>>> +      /// int lchown(const char *path, uid_t owner, gid_t group);
>>> +      lchown,
>>>       /// long long int llabs(long long int j);
>>>       llabs,
>>>       /// double log(double x);
>>> @@ -226,8 +348,16 @@ namespace llvm {
>>>       logf,
>>>       /// long double logl(long double x);
>>>       logl,
>>> +      /// int lstat(const char *path, struct stat *buf);
>>> +      lstat,
>>> +      /// int lstat64(const char *path, struct stat64 *buf);
>>> +      lstat64,
>>>       /// void *malloc(size_t size);
>>>       malloc,
>>> +      /// void *memalign(size_t boundary, size_t size);
>>> +      memalign,
>>> +      /// void *memccpy(void *s1, const void *s2, int c, size_t
>>> n);
>>> +      memccpy,
>>>       /// void *memchr(const void *s, int c, size_t n);
>>>       memchr,
>>>       /// int memcmp(const void *s1, const void *s2, size_t n);
>>> @@ -236,16 +366,44 @@ namespace llvm {
>>>       memcpy,
>>>       /// void *memmove(void *s1, const void *s2, size_t n);
>>>       memmove,
>>> +      // void *memrchr(const void *s, int c, size_t n);
>>> +      memrchr,
>>>       /// void *memset(void *b, int c, size_t len);
>>>       memset,
>>>       /// void memset_pattern16(void *b, const void *pattern16,
>>>       size_t len);
>>>       memset_pattern16,
>>> +      /// int mkdir(const char *path, mode_t mode);
>>> +      mkdir,
>>> +      /// time_t mktime(struct tm *timeptr);
>>> +      mktime,
>>> +      /// double modf(double x, double *iptr);
>>> +      modf,
>>> +      /// float modff(float, float *iptr);
>>> +      modff,
>>> +      /// long double modfl(long double value, long double *iptr);
>>> +      modfl,
>>>       /// double nearbyint(double x);
>>>       nearbyint,
>>>       /// float nearbyintf(float x);
>>>       nearbyintf,
>>>       /// long double nearbyintl(long double x);
>>>       nearbyintl,
>>> +      /// uint32_t ntohl(uint32_t netlong);
>>> +      ntohl,
>>> +      /// uint16_t ntohs(uint16_t netshort);
>>> +      ntohs,
>>> +      /// int open(const char *path, int oflag, ... );
>>> +      open,
>>> +      /// int open64(const char *filename, int flags[, mode_t
>>> mode])
>>> +      open64,
>>> +      /// DIR *opendir(const char *dirname);
>>> +      opendir,
>>> +      /// int pclose(FILE *stream);
>>> +      pclose,
>>> +      /// void perror(const char *s);
>>> +      perror,
>>> +      /// FILE *popen(const char *command, const char *mode);
>>> +      popen,
>>>       /// int posix_memalign(void **memptr, size_t alignment,
>>>       size_t size);
>>>       posix_memalign,
>>>       /// double pow(double x, double y);
>>> @@ -254,28 +412,61 @@ namespace llvm {
>>>       powf,
>>>       /// long double powl(long double x, long double y);
>>>       powl,
>>> +      /// ssize_t pread(int fildes, void *buf, size_t nbyte, off_t
>>> offset);
>>> +      pread,
>>>       /// int printf(const char *format, ...);
>>>       printf,
>>> +      /// int putc(int c, FILE *stream);
>>> +      putc,
>>>       /// int putchar(int c);
>>>       putchar,
>>>       /// int puts(const char *s);
>>>       puts,
>>> +      /// ssize_t pwrite(int fildes, const void *buf, size_t
>>> nbyte,
>>> +      ///                off_t offset);
>>> +      pwrite,
>>> +      /// void qsort(void *base, size_t nel, size_t width,
>>> +      ///            int (*compar)(const void *, const void *));
>>> +      qsort,
>>> +      /// ssize_t read(int fildes, void *buf, size_t nbyte);
>>> +      read,
>>> +      /// ssize_t readlink(const char *path, char *buf, size_t
>>> bufsize);
>>> +      readlink,
>>>       /// void *realloc(void *ptr, size_t size);
>>>       realloc,
>>>       /// void *reallocf(void *ptr, size_t size);
>>>       reallocf,
>>> +      /// char *realpath(const char *file_name, char
>>> *resolved_name);
>>> +      realpath,
>>> +      /// int remove(const char *path);
>>> +      remove,
>>> +      /// int rename(const char *old, const char *new);
>>> +      rename,
>>> +      /// void rewind(FILE *stream);
>>> +      rewind,
>>>       /// double rint(double x);
>>>       rint,
>>>       /// float rintf(float x);
>>>       rintf,
>>>       /// long double rintl(long double x);
>>>       rintl,
>>> +      /// int rmdir(const char *path);
>>> +      rmdir,
>>>       /// double round(double x);
>>>       round,
>>>       /// float roundf(float x);
>>>       roundf,
>>>       /// long double roundl(long double x);
>>>       roundl,
>>> +      /// int scanf(const char *restrict format, ... );
>>> +      scanf,
>>> +      /// void setbuf(FILE *stream, char *buf);
>>> +      setbuf,
>>> +      /// int setitimer(int which, const struct itimerval *value,
>>> +      ///               struct itimerval *ovalue);
>>> +      setitimer,
>>> +      /// int setvbuf(FILE *stream, char *buf, int type, size_t
>>> size);
>>> +      setvbuf,
>>>       /// double sin(double x);
>>>       sin,
>>>       /// float sinf(float x);
>>> @@ -290,6 +481,8 @@ namespace llvm {
>>>       sinl,
>>>       /// int siprintf(char *str, const char *format, ...);
>>>       siprintf,
>>> +      /// int snprintf(char *s, size_t n, const char *format,
>>> ...);
>>> +      snprintf,
>>>       /// int sprintf(char *str, const char *format, ...);
>>>       sprintf,
>>>       /// double sqrt(double x);
>>> @@ -298,14 +491,30 @@ namespace llvm {
>>>       sqrtf,
>>>       /// long double sqrtl(long double x);
>>>       sqrtl,
>>> +      /// int sscanf(const char *s, const char *format, ... );
>>> +      sscanf,
>>> +      /// int stat(const char *path, struct stat *buf);
>>> +      stat,
>>> +      /// int stat64(const char *path, struct stat64 *buf);
>>> +      stat64,
>>> +      /// int statvfs(const char *path, struct statvfs *buf);
>>> +      statvfs,
>>> +      /// int statvfs64(const char *path, struct statvfs64 *buf)
>>> +      statvfs64,
>>>       /// char *stpcpy(char *s1, const char *s2);
>>>       stpcpy,
>>> +      /// char *stpncpy(char *s1, const char *s2, size_t n);
>>> +      stpncpy,
>>> +      /// int strcasecmp(const char *s1, const char *s2);
>>> +      strcasecmp,
>>>       /// char *strcat(char *s1, const char *s2);
>>>       strcat,
>>>       /// char *strchr(const char *s, int c);
>>>       strchr,
>>>       /// int strcmp(const char *s1, const char *s2);
>>>       strcmp,
>>> +      /// int strcoll(const char *s1, const char *s2);
>>> +      strcoll,
>>>       /// char *strcpy(char *s1, const char *s2);
>>>       strcpy,
>>>       /// size_t strcspn(const char *s1, const char *s2);
>>> @@ -314,6 +523,8 @@ namespace llvm {
>>>       strdup,
>>>       /// size_t strlen(const char *s);
>>>       strlen,
>>> +      /// int strncasecmp(const char *s1, const char *s2, size_t
>>> n);
>>> +      strncasecmp,
>>>       /// char *strncat(char *s1, const char *s2, size_t n);
>>>       strncat,
>>>       /// int strncmp(const char *s1, const char *s2, size_t n);
>>> @@ -336,6 +547,10 @@ namespace llvm {
>>>       strtod,
>>>       /// float strtof(const char *nptr, char **endptr);
>>>       strtof,
>>> +      // char *strtok(char *s1, const char *s2);
>>> +      strtok,
>>> +      // char *strtok_r(char *s, const char *sep, char **lasts);
>>> +      strtok_r,
>>>       /// long int strtol(const char *nptr, char **endptr, int
>>>       base);
>>>       strtol,
>>>       /// long double strtold(const char *nptr, char **endptr);
>>> @@ -347,6 +562,10 @@ namespace llvm {
>>>       /// unsigned long long int strtoull(const char *nptr, char
>>>       **endptr,
>>>       ///                                 int base);
>>>       strtoull,
>>> +      /// size_t strxfrm(char *s1, const char *s2, size_t n);
>>> +      strxfrm,
>>> +      /// int system(const char *command);
>>> +      system,
>>>       /// double tan(double x);
>>>       tan,
>>>       /// float tanf(float x);
>>> @@ -359,6 +578,12 @@ namespace llvm {
>>>       tanhl,
>>>       /// long double tanl(long double x);
>>>       tanl,
>>> +      /// clock_t times(struct tms *buffer);
>>> +      times,
>>> +      /// FILE *tmpfile(void);
>>> +      tmpfile,
>>> +      /// FILE *tmpfile64(void)
>>> +      tmpfile64,
>>>       /// int toascii(int c);
>>>       toascii,
>>>       /// double trunc(double x);
>>> @@ -367,8 +592,36 @@ namespace llvm {
>>>       truncf,
>>>       /// long double truncl(long double x);
>>>       truncl,
>>> +      /// int uname(struct utsname *name);
>>> +      uname,
>>> +      /// int ungetc(int c, FILE *stream);
>>> +      ungetc,
>>> +      /// int unlink(const char *path);
>>> +      unlink,
>>> +      /// int unsetenv(const char *name);
>>> +      unsetenv,
>>> +      /// int utime(const char *path, const struct utimbuf
>>> *times);
>>> +      utime,
>>> +      /// int utimes(const char *path, const struct timeval
>>> times[2]);
>>> +      utimes,
>>>       /// void *valloc(size_t size);
>>>       valloc,
>>> +      /// int vfprintf(FILE *stream, const char *format, va_list
>>> ap);
>>> +      vfprintf,
>>> +      /// int vfscanf(FILE *stream, const char *format, va_list
>>> arg);
>>> +      vfscanf,
>>> +      /// int vprintf(const char *restrict format, va_list ap);
>>> +      vprintf,
>>> +      /// int vscanf(const char *format, va_list arg);
>>> +      vscanf,
>>> +      /// int vsnprintf(char *s, size_t n, const char *format,
>>> va_list ap);
>>> +      vsnprintf,
>>> +      /// int vsprintf(char *s, const char *format, va_list ap);
>>> +      vsprintf,
>>> +      /// int vsscanf(const char *s, const char *format, va_list
>>> arg);
>>> +      vsscanf,
>>> +      /// ssize_t write(int fildes, const void *buf, size_t
>>> nbyte);
>>> +      write,
>>> 
>>>       NumLibFuncs
>>>     };
>>> diff --git a/lib/Target/TargetLibraryInfo.cpp
>>> b/lib/Target/TargetLibraryInfo.cpp
>>> index 3a9ace4..e5fdce2 100644
>>> --- a/lib/Target/TargetLibraryInfo.cpp
>>> +++ b/lib/Target/TargetLibraryInfo.cpp
>>> @@ -24,6 +24,8 @@ void TargetLibraryInfo::anchor() { }
>>> 
>>> const char* TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs]
>>> =
>>>   {
>>> +    "_IO_getc",
>>> +    "_IO_putc",
>>>     "_ZdaPv",
>>>     "_ZdlPv",
>>>     "_Znaj",
>>> @@ -38,8 +40,14 @@ const char*
>>> TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] =
>>>     "__cxa_guard_abort",
>>>     "__cxa_guard_acquire",
>>>     "__cxa_guard_release",
>>> +    "__isoc99_scanf",
>>> +    "__isoc99_sscanf",
>>>     "__memcpy_chk",
>>> +    "__strdup",
>>> +    "__strndup",
>>> +    "__strtok_r",
>>>     "abs",
>>> +    "access",
>>>     "acos",
>>>     "acosf",
>>>     "acosh",
>>> @@ -61,6 +69,13 @@ const char*
>>> TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] =
>>>     "atanhf",
>>>     "atanhl",
>>>     "atanl",
>>> +    "atof",
>>> +    "atoi",
>>> +    "atol",
>>> +    "atoll",
>>> +    "bcmp",
>>> +    "bcopy",
>>> +    "bzero",
>>>     "calloc",
>>>     "cbrt",
>>>     "cbrtf",
>>> @@ -68,6 +83,10 @@ const char*
>>> TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] =
>>>     "ceil",
>>>     "ceilf",
>>>     "ceill",
>>> +    "chmod",
>>> +    "chown",
>>> +    "clearerr",
>>> +    "closedir",
>>>     "copysign",
>>>     "copysignf",
>>>     "copysignl",
>>> @@ -77,6 +96,7 @@ const char*
>>> TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] =
>>>     "coshf",
>>>     "coshl",
>>>     "cosl",
>>> +    "ctermid",
>>>     "exp",
>>>     "exp10",
>>>     "exp10f",
>>> @@ -92,25 +112,66 @@ const char*
>>> TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] =
>>>     "fabs",
>>>     "fabsf",
>>>     "fabsl",
>>> +    "fclose",
>>> +    "fdopen",
>>> +    "feof",
>>> +    "ferror",
>>> +    "fflush",
>>>     "ffs",
>>>     "ffsl",
>>>     "ffsll",
>>> +    "fgetc",
>>> +    "fgetpos",
>>> +    "fgets",
>>> +    "fileno",
>>>     "fiprintf",
>>> +    "flockfile",
>>>     "floor",
>>>     "floorf",
>>>     "floorl",
>>>     "fmod",
>>>     "fmodf",
>>>     "fmodl",
>>> +    "fopen",
>>> +    "fopen64",
>>>     "fprintf",
>>>     "fputc",
>>>     "fputs",
>>> +    "fread",
>>>     "free",
>>> +    "frexp",
>>> +    "frexpf",
>>> +    "frexpl",
>>> +    "fscanf",
>>> +    "fseek",
>>> +    "fseeko",
>>> +    "fseeko64",
>>> +    "fsetpos",
>>> +    "fstat",
>>> +    "fstat64",
>>> +    "fstatvfs",
>>> +    "fstatvfs64",
>>> +    "ftell",
>>> +    "ftello",
>>> +    "ftello64",
>>> +    "ftrylockfile",
>>> +    "funlockfile",
>>>     "fwrite",
>>> +    "getc",
>>> +    "getc_unlocked",
>>> +    "getchar",
>>> +    "getenv",
>>> +    "getitimer",
>>> +    "getlogin_r",
>>> +    "getpwnam",
>>> +    "gets",
>>> +    "htonl",
>>> +    "htons",
>>>     "iprintf",
>>>     "isascii",
>>>     "isdigit",
>>>     "labs",
>>> +    "lchown",
>>>     "llabs",
>>>     "log",
>>>     "log10",
>>> @@ -127,31 +188,64 @@ const char*
>>> TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] =
>>>     "logbl",
>>>     "logf",
>>>     "logl",
>>> +    "lstat",
>>> +    "lstat64",
>>>     "malloc",
>>> +    "memalign",
>>> +    "memccpy",
>>>     "memchr",
>>>     "memcmp",
>>>     "memcpy",
>>>     "memmove",
>>> +    "memrchr",
>>>     "memset",
>>>     "memset_pattern16",
>>> +    "mkdir",
>>> +    "mktime",
>>> +    "modf",
>>> +    "modff",
>>> +    "modfl",
>>>     "nearbyint",
>>>     "nearbyintf",
>>>     "nearbyintl",
>>> +    "ntohl",
>>> +    "ntohs",
>>> +    "open",
>>> +    "open64",
>>> +    "opendir",
>>> +    "pclose",
>>> +    "perror",
>>> +    "popen",
>>>     "posix_memalign",
>>>     "pow",
>>>     "powf",
>>>     "powl",
>>> +    "pread",
>>>     "printf",
>>> +    "putc",
>>>     "putchar",
>>>     "puts",
>>> +    "pwrite",
>>> +    "qsort",
>>> +    "read",
>>> +    "readlink",
>>>     "realloc",
>>>     "reallocf",
>>> +    "realpath",
>>> +    "remove",
>>> +    "rename",
>>> +    "rewind",
>>>     "rint",
>>>     "rintf",
>>>     "rintl",
>>> +    "rmdir",
>>>     "round",
>>>     "roundf",
>>>     "roundl",
>>> +    "scanf",
>>> +    "setbuf",
>>> +    "setitimer",
>>> +    "setvbuf",
>>>     "sin",
>>>     "sinf",
>>>     "sinh",
>>> @@ -159,18 +253,28 @@ const char*
>>> TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] =
>>>     "sinhl",
>>>     "sinl",
>>>     "siprintf",
>>> +    "snprintf",
>>>     "sprintf",
>>>     "sqrt",
>>>     "sqrtf",
>>>     "sqrtl",
>>> +    "sscanf",
>>> +    "stat",
>>> +    "stat64",
>>> +    "statvfs",
>>> +    "statvfs64",
>>>     "stpcpy",
>>> +    "stpncpy",
>>> +    "strcasecmp",
>>>     "strcat",
>>>     "strchr",
>>>     "strcmp",
>>> +    "strcoll",
>>>     "strcpy",
>>>     "strcspn",
>>>     "strdup",
>>>     "strlen",
>>> +    "strncasecmp",
>>>     "strncat",
>>>     "strncmp",
>>>     "strncpy",
>>> @@ -182,22 +286,43 @@ const char*
>>> TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] =
>>>     "strstr",
>>>     "strtod",
>>>     "strtof",
>>> +    "strtok",
>>> +    "strtok_r",
>>>     "strtol",
>>>     "strtold",
>>>     "strtoll",
>>>     "strtoul",
>>>     "strtoull",
>>> +    "strxfrm",
>>> +    "system",
>>>     "tan",
>>>     "tanf",
>>>     "tanh",
>>>     "tanhf",
>>>     "tanhl",
>>>     "tanl",
>>> +    "times",
>>> +    "tmpfile",
>>> +    "tmpfile64",
>>>     "toascii",
>>>     "trunc",
>>>     "truncf",
>>>     "truncl",
>>> -    "valloc"
>>> +    "uname",
>>> +    "ungetc",
>>> +    "unlink",
>>> +    "unsetenv",
>>> +    "utime",
>>> +    "utimes",
>>> +    "valloc",
>>> +    "vfprintf",
>>> +    "vfscanf",
>>> +    "vprintf",
>>> +    "vscanf",
>>> +    "vsnprintf",
>>> +    "vsprintf",
>>> +    "vsscanf",
>>> +    "write"
>>>   };
>>> 
>>> /// initialize - Initialize the set of available library functions
>>> based on the
>>> @@ -259,7 +384,9 @@ static void initialize(TargetLibraryInfo &TLI,
>>> const Triple &T,
>>>     TLI.setUnavailable(LibFunc::fabsl);
>>>     TLI.setUnavailable(LibFunc::floorl);
>>>     TLI.setUnavailable(LibFunc::fmodl);
>>> +    TLI.setUnavailable(LibFunc::frexpl);
>>>     TLI.setUnavailable(LibFunc::logl);
>>> +    TLI.setUnavailable(LibFunc::modfl);
>>>     TLI.setUnavailable(LibFunc::powl);
>>>     TLI.setUnavailable(LibFunc::sinl);
>>>     TLI.setUnavailable(LibFunc::sinhl);
>>> @@ -336,16 +463,67 @@ static void initialize(TargetLibraryInfo
>>> &TLI, const Triple &T,
>>>       TLI.setUnavailable(LibFunc::tanhf);
>>>     }
>>> 
>>> -    // Win32 does *not* provide stpcpy.  It is provided on POSIX
>>> systems:
>>> -    //
>>> http://pubs.opengroup.org/onlinepubs/9699919799/functions/stpcpy.html
>>> -    TLI.setUnavailable(LibFunc::stpcpy);
>>> -
>>> -    // Win32 does *not* provide ffs.  It is provided on POSIX
>>> systems:
>>> -    //
>>> http://pubs.opengroup.org/onlinepubs/009695399/functions/ffs.html
>>> +    // Win32 does *not* provide provide these functions, but they
>>> are
>>> +    // generally available on POSIX-compliant systems:
>>> +    TLI.setUnavailable(LibFunc::access);
>>> +    TLI.setUnavailable(LibFunc::bcmp);
>>> +    TLI.setUnavailable(LibFunc::bcopy);
>>> +    TLI.setUnavailable(LibFunc::bzero);
>>> +    TLI.setUnavailable(LibFunc::chmod);
>>> +    TLI.setUnavailable(LibFunc::chown);
>>> +    TLI.setUnavailable(LibFunc::closedir);
>>> +    TLI.setUnavailable(LibFunc::ctermid);
>>> +    TLI.setUnavailable(LibFunc::fdopen);
>>>     TLI.setUnavailable(LibFunc::ffs);
>>> +    TLI.setUnavailable(LibFunc::fileno);
>>> +    TLI.setUnavailable(LibFunc::flockfile);
>>> +    TLI.setUnavailable(LibFunc::fseeko);
>>> +    TLI.setUnavailable(LibFunc::fstat);
>>> +    TLI.setUnavailable(LibFunc::fstatvfs);
>>> +    TLI.setUnavailable(LibFunc::ftello);
>>> +    TLI.setUnavailable(LibFunc::ftrylockfile);
>>> +    TLI.setUnavailable(LibFunc::funlockfile);
>>> +    TLI.setUnavailable(LibFunc::getc_unlocked);
>>> +    TLI.setUnavailable(LibFunc::getitimer);
>>> +    TLI.setUnavailable(LibFunc::getlogin_r);
>>> +    TLI.setUnavailable(LibFunc::getpwnam);
>>> +    TLI.setUnavailable(LibFunc::htonl);
>>> +    TLI.setUnavailable(LibFunc::htons);
>>> +    TLI.setUnavailable(LibFunc::lchown);
>>> +    TLI.setUnavailable(LibFunc::lstat);
>>> +    TLI.setUnavailable(LibFunc::memccpy);
>>> +    TLI.setUnavailable(LibFunc::mkdir);
>>> +    TLI.setUnavailable(LibFunc::ntohl);
>>> +    TLI.setUnavailable(LibFunc::ntohs);
>>> +    TLI.setUnavailable(LibFunc::open);
>>> +    TLI.setUnavailable(LibFunc::opendir);
>>> +    TLI.setUnavailable(LibFunc::pclose);
>>> +    TLI.setUnavailable(LibFunc::popen);
>>> +    TLI.setUnavailable(LibFunc::pread);
>>> +    TLI.setUnavailable(LibFunc::pwrite);
>>> +    TLI.setUnavailable(LibFunc::read);
>>> +    TLI.setUnavailable(LibFunc::readlink);
>>> +    TLI.setUnavailable(LibFunc::realpath);
>>> +    TLI.setUnavailable(LibFunc::rmdir);
>>> +    TLI.setUnavailable(LibFunc::setitimer);
>>> +    TLI.setUnavailable(LibFunc::stat);
>>> +    TLI.setUnavailable(LibFunc::statvfs);
>>> +    TLI.setUnavailable(LibFunc::stpcpy);
>>> +    TLI.setUnavailable(LibFunc::stpncpy);
>>> +    TLI.setUnavailable(LibFunc::strcasecmp);
>>> +    TLI.setUnavailable(LibFunc::strncasecmp);
>>> +    TLI.setUnavailable(LibFunc::times);
>>> +    TLI.setUnavailable(LibFunc::uname);
>>> +    TLI.setUnavailable(LibFunc::unlink);
>>> +    TLI.setUnavailable(LibFunc::unsetenv);
>>> +    TLI.setUnavailable(LibFunc::utime);
>>> +    TLI.setUnavailable(LibFunc::utimes);
>>> +    TLI.setUnavailable(LibFunc::write);
>>> 
>>> -    // Win32 does *not* provide llabs.  It is defined in ISO/IEC
>>> 9899:1999,
>>> -    // but Visual C++ does not support it.
>>> +    // Win32 does *not* provide provide these functions, but they
>>> are
>>> +    // specified by C99:
>>> +    TLI.setUnavailable(LibFunc::atoll);
>>> +    TLI.setUnavailable(LibFunc::frexpf);
>>>     TLI.setUnavailable(LibFunc::llabs);
>>>   }
>>> 
>>> @@ -375,6 +553,27 @@ static void initialize(TargetLibraryInfo &TLI,
>>> const Triple &T,
>>>   default:
>>>     TLI.setUnavailable(LibFunc::ffsll);
>>>   }
>>> +
>>> +  // The following functions are available on at least Linux:
>>> +  if (T.getOS() != Triple::Linux) {
>>> +    TLI.setUnavailable(LibFunc::dunder_strdup);
>>> +    TLI.setUnavailable(LibFunc::dunder_strtok_r);
>>> +    TLI.setUnavailable(LibFunc::dunder_isoc99_scanf);
>>> +    TLI.setUnavailable(LibFunc::dunder_isoc99_sscanf);
>>> +    TLI.setUnavailable(LibFunc::under_IO_getc);
>>> +    TLI.setUnavailable(LibFunc::under_IO_putc);
>>> +    TLI.setUnavailable(LibFunc::memalign);
>>> +    TLI.setUnavailable(LibFunc::fopen64);
>>> +    TLI.setUnavailable(LibFunc::fseeko64);
>>> +    TLI.setUnavailable(LibFunc::fstat64);
>>> +    TLI.setUnavailable(LibFunc::fstatvfs64);
>>> +    TLI.setUnavailable(LibFunc::ftello64);
>>> +    TLI.setUnavailable(LibFunc::lstat64);
>>> +    TLI.setUnavailable(LibFunc::open64);
>>> +    TLI.setUnavailable(LibFunc::stat64);
>>> +    TLI.setUnavailable(LibFunc::statvfs64);
>>> +    TLI.setUnavailable(LibFunc::tmpfile64);
>>> +  }
>>> }
>>> 
>>> 
>>> @@ -402,6 +601,10 @@ bool TargetLibraryInfo::getLibFunc(StringRef
>>> funcName,
>>>                                    LibFunc::Func &F) const {
>>>   const char **Start = &StandardNames[0];
>>>   const char **End = &StandardNames[LibFunc::NumLibFuncs];
>>> +  // Check for \01 prefix that is used to mangle __asm
>>> declarations and
>>> +  // strip it if present.
>>> +  if (!funcName.empty() && funcName.front() == '\01')
>>> +    funcName = funcName.substr(1);
>>>   const char **I = std::lower_bound(Start, End, funcName);
>>>   if (I != End && *I == funcName) {
>>>     F = (LibFunc::Func)(I - Start);
>>> 
>> 
>> 
>> --
>> Meador Inge
>> CodeSourcery / Mentor Embedded
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list