Home | History | Annotate | Download | only in Utils
      1 //===- BuildLibCalls.cpp - Utility builder for libcalls -------------------===//
      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 some functions that will create standard C libcalls.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "llvm/Transforms/Utils/BuildLibCalls.h"
     15 #include "llvm/ADT/SmallString.h"
     16 #include "llvm/ADT/Statistic.h"
     17 #include "llvm/Analysis/TargetLibraryInfo.h"
     18 #include "llvm/IR/Constants.h"
     19 #include "llvm/IR/DataLayout.h"
     20 #include "llvm/IR/Function.h"
     21 #include "llvm/IR/IRBuilder.h"
     22 #include "llvm/IR/Intrinsics.h"
     23 #include "llvm/IR/LLVMContext.h"
     24 #include "llvm/IR/Module.h"
     25 #include "llvm/IR/Type.h"
     26 
     27 using namespace llvm;
     28 
     29 #define DEBUG_TYPE "build-libcalls"
     30 
     31 //- Infer Attributes ---------------------------------------------------------//
     32 
     33 STATISTIC(NumReadNone, "Number of functions inferred as readnone");
     34 STATISTIC(NumReadOnly, "Number of functions inferred as readonly");
     35 STATISTIC(NumArgMemOnly, "Number of functions inferred as argmemonly");
     36 STATISTIC(NumNoUnwind, "Number of functions inferred as nounwind");
     37 STATISTIC(NumNoCapture, "Number of arguments inferred as nocapture");
     38 STATISTIC(NumReadOnlyArg, "Number of arguments inferred as readonly");
     39 STATISTIC(NumNoAlias, "Number of function returns inferred as noalias");
     40 STATISTIC(NumNonNull, "Number of function returns inferred as nonnull returns");
     41 
     42 static bool setDoesNotAccessMemory(Function &F) {
     43   if (F.doesNotAccessMemory())
     44     return false;
     45   F.setDoesNotAccessMemory();
     46   ++NumReadNone;
     47   return true;
     48 }
     49 
     50 static bool setOnlyReadsMemory(Function &F) {
     51   if (F.onlyReadsMemory())
     52     return false;
     53   F.setOnlyReadsMemory();
     54   ++NumReadOnly;
     55   return true;
     56 }
     57 
     58 static bool setOnlyAccessesArgMemory(Function &F) {
     59   if (F.onlyAccessesArgMemory())
     60     return false;
     61   F.setOnlyAccessesArgMemory ();
     62   ++NumArgMemOnly;
     63   return true;
     64 }
     65 
     66 static bool setDoesNotThrow(Function &F) {
     67   if (F.doesNotThrow())
     68     return false;
     69   F.setDoesNotThrow();
     70   ++NumNoUnwind;
     71   return true;
     72 }
     73 
     74 static bool setDoesNotCapture(Function &F, unsigned n) {
     75   if (F.doesNotCapture(n))
     76     return false;
     77   F.setDoesNotCapture(n);
     78   ++NumNoCapture;
     79   return true;
     80 }
     81 
     82 static bool setOnlyReadsMemory(Function &F, unsigned n) {
     83   if (F.onlyReadsMemory(n))
     84     return false;
     85   F.setOnlyReadsMemory(n);
     86   ++NumReadOnlyArg;
     87   return true;
     88 }
     89 
     90 static bool setDoesNotAlias(Function &F, unsigned n) {
     91   if (F.doesNotAlias(n))
     92     return false;
     93   F.setDoesNotAlias(n);
     94   ++NumNoAlias;
     95   return true;
     96 }
     97 
     98 static bool setNonNull(Function &F, unsigned n) {
     99   assert((n != AttributeSet::ReturnIndex ||
    100           F.getReturnType()->isPointerTy()) &&
    101          "nonnull applies only to pointers");
    102   if (F.getAttributes().hasAttribute(n, Attribute::NonNull))
    103     return false;
    104   F.addAttribute(n, Attribute::NonNull);
    105   ++NumNonNull;
    106   return true;
    107 }
    108 
    109 bool llvm::inferLibFuncAttributes(Function &F, const TargetLibraryInfo &TLI) {
    110   LibFunc::Func TheLibFunc;
    111   if (!(TLI.getLibFunc(F, TheLibFunc) && TLI.has(TheLibFunc)))
    112     return false;
    113 
    114   bool Changed = false;
    115   switch (TheLibFunc) {
    116   case LibFunc::strlen:
    117     Changed |= setOnlyReadsMemory(F);
    118     Changed |= setDoesNotThrow(F);
    119     Changed |= setDoesNotCapture(F, 1);
    120     return Changed;
    121   case LibFunc::strchr:
    122   case LibFunc::strrchr:
    123     Changed |= setOnlyReadsMemory(F);
    124     Changed |= setDoesNotThrow(F);
    125     return Changed;
    126   case LibFunc::strtol:
    127   case LibFunc::strtod:
    128   case LibFunc::strtof:
    129   case LibFunc::strtoul:
    130   case LibFunc::strtoll:
    131   case LibFunc::strtold:
    132   case LibFunc::strtoull:
    133     Changed |= setDoesNotThrow(F);
    134     Changed |= setDoesNotCapture(F, 2);
    135     Changed |= setOnlyReadsMemory(F, 1);
    136     return Changed;
    137   case LibFunc::strcpy:
    138   case LibFunc::stpcpy:
    139   case LibFunc::strcat:
    140   case LibFunc::strncat:
    141   case LibFunc::strncpy:
    142   case LibFunc::stpncpy:
    143     Changed |= setDoesNotThrow(F);
    144     Changed |= setDoesNotCapture(F, 2);
    145     Changed |= setOnlyReadsMemory(F, 2);
    146     return Changed;
    147   case LibFunc::strxfrm:
    148     Changed |= setDoesNotThrow(F);
    149     Changed |= setDoesNotCapture(F, 1);
    150     Changed |= setDoesNotCapture(F, 2);
    151     Changed |= setOnlyReadsMemory(F, 2);
    152     return Changed;
    153   case LibFunc::strcmp:      // 0,1
    154   case LibFunc::strspn:      // 0,1
    155   case LibFunc::strncmp:     // 0,1
    156   case LibFunc::strcspn:     // 0,1
    157   case LibFunc::strcoll:     // 0,1
    158   case LibFunc::strcasecmp:  // 0,1
    159   case LibFunc::strncasecmp: //
    160     Changed |= setOnlyReadsMemory(F);
    161     Changed |= setDoesNotThrow(F);
    162     Changed |= setDoesNotCapture(F, 1);
    163     Changed |= setDoesNotCapture(F, 2);
    164     return Changed;
    165   case LibFunc::strstr:
    166   case LibFunc::strpbrk:
    167     Changed |= setOnlyReadsMemory(F);
    168     Changed |= setDoesNotThrow(F);
    169     Changed |= setDoesNotCapture(F, 2);
    170     return Changed;
    171   case LibFunc::strtok:
    172   case LibFunc::strtok_r:
    173     Changed |= setDoesNotThrow(F);
    174     Changed |= setDoesNotCapture(F, 2);
    175     Changed |= setOnlyReadsMemory(F, 2);
    176     return Changed;
    177   case LibFunc::scanf:
    178     Changed |= setDoesNotThrow(F);
    179     Changed |= setDoesNotCapture(F, 1);
    180     Changed |= setOnlyReadsMemory(F, 1);
    181     return Changed;
    182   case LibFunc::setbuf:
    183   case LibFunc::setvbuf:
    184     Changed |= setDoesNotThrow(F);
    185     Changed |= setDoesNotCapture(F, 1);
    186     return Changed;
    187   case LibFunc::strdup:
    188   case LibFunc::strndup:
    189     Changed |= setDoesNotThrow(F);
    190     Changed |= setDoesNotAlias(F, 0);
    191     Changed |= setDoesNotCapture(F, 1);
    192     Changed |= setOnlyReadsMemory(F, 1);
    193     return Changed;
    194   case LibFunc::stat:
    195   case LibFunc::statvfs:
    196     Changed |= setDoesNotThrow(F);
    197     Changed |= setDoesNotCapture(F, 1);
    198     Changed |= setDoesNotCapture(F, 2);
    199     Changed |= setOnlyReadsMemory(F, 1);
    200     return Changed;
    201   case LibFunc::sscanf:
    202     Changed |= setDoesNotThrow(F);
    203     Changed |= setDoesNotCapture(F, 1);
    204     Changed |= setDoesNotCapture(F, 2);
    205     Changed |= setOnlyReadsMemory(F, 1);
    206     Changed |= setOnlyReadsMemory(F, 2);
    207     return Changed;
    208   case LibFunc::sprintf:
    209     Changed |= setDoesNotThrow(F);
    210     Changed |= setDoesNotCapture(F, 1);
    211     Changed |= setDoesNotCapture(F, 2);
    212     Changed |= setOnlyReadsMemory(F, 2);
    213     return Changed;
    214   case LibFunc::snprintf:
    215     Changed |= setDoesNotThrow(F);
    216     Changed |= setDoesNotCapture(F, 1);
    217     Changed |= setDoesNotCapture(F, 3);
    218     Changed |= setOnlyReadsMemory(F, 3);
    219     return Changed;
    220   case LibFunc::setitimer:
    221     Changed |= setDoesNotThrow(F);
    222     Changed |= setDoesNotCapture(F, 2);
    223     Changed |= setDoesNotCapture(F, 3);
    224     Changed |= setOnlyReadsMemory(F, 2);
    225     return Changed;
    226   case LibFunc::system:
    227     // May throw; "system" is a valid pthread cancellation point.
    228     Changed |= setDoesNotCapture(F, 1);
    229     Changed |= setOnlyReadsMemory(F, 1);
    230     return Changed;
    231   case LibFunc::malloc:
    232     Changed |= setDoesNotThrow(F);
    233     Changed |= setDoesNotAlias(F, 0);
    234     return Changed;
    235   case LibFunc::memcmp:
    236     Changed |= setOnlyReadsMemory(F);
    237     Changed |= setDoesNotThrow(F);
    238     Changed |= setDoesNotCapture(F, 1);
    239     Changed |= setDoesNotCapture(F, 2);
    240     return Changed;
    241   case LibFunc::memchr:
    242   case LibFunc::memrchr:
    243     Changed |= setOnlyReadsMemory(F);
    244     Changed |= setDoesNotThrow(F);
    245     return Changed;
    246   case LibFunc::modf:
    247   case LibFunc::modff:
    248   case LibFunc::modfl:
    249     Changed |= setDoesNotThrow(F);
    250     Changed |= setDoesNotCapture(F, 2);
    251     return Changed;
    252   case LibFunc::memcpy:
    253   case LibFunc::memccpy:
    254   case LibFunc::memmove:
    255     Changed |= setDoesNotThrow(F);
    256     Changed |= setDoesNotCapture(F, 2);
    257     Changed |= setOnlyReadsMemory(F, 2);
    258     return Changed;
    259   case LibFunc::memcpy_chk:
    260     Changed |= setDoesNotThrow(F);
    261     return Changed;
    262   case LibFunc::memalign:
    263     Changed |= setDoesNotAlias(F, 0);
    264     return Changed;
    265   case LibFunc::mkdir:
    266     Changed |= setDoesNotThrow(F);
    267     Changed |= setDoesNotCapture(F, 1);
    268     Changed |= setOnlyReadsMemory(F, 1);
    269     return Changed;
    270   case LibFunc::mktime:
    271     Changed |= setDoesNotThrow(F);
    272     Changed |= setDoesNotCapture(F, 1);
    273     return Changed;
    274   case LibFunc::realloc:
    275     Changed |= setDoesNotThrow(F);
    276     Changed |= setDoesNotAlias(F, 0);
    277     Changed |= setDoesNotCapture(F, 1);
    278     return Changed;
    279   case LibFunc::read:
    280     // May throw; "read" is a valid pthread cancellation point.
    281     Changed |= setDoesNotCapture(F, 2);
    282     return Changed;
    283   case LibFunc::rewind:
    284     Changed |= setDoesNotThrow(F);
    285     Changed |= setDoesNotCapture(F, 1);
    286     return Changed;
    287   case LibFunc::rmdir:
    288   case LibFunc::remove:
    289   case LibFunc::realpath:
    290     Changed |= setDoesNotThrow(F);
    291     Changed |= setDoesNotCapture(F, 1);
    292     Changed |= setOnlyReadsMemory(F, 1);
    293     return Changed;
    294   case LibFunc::rename:
    295     Changed |= setDoesNotThrow(F);
    296     Changed |= setDoesNotCapture(F, 1);
    297     Changed |= setDoesNotCapture(F, 2);
    298     Changed |= setOnlyReadsMemory(F, 1);
    299     Changed |= setOnlyReadsMemory(F, 2);
    300     return Changed;
    301   case LibFunc::readlink:
    302     Changed |= setDoesNotThrow(F);
    303     Changed |= setDoesNotCapture(F, 1);
    304     Changed |= setDoesNotCapture(F, 2);
    305     Changed |= setOnlyReadsMemory(F, 1);
    306     return Changed;
    307   case LibFunc::write:
    308     // May throw; "write" is a valid pthread cancellation point.
    309     Changed |= setDoesNotCapture(F, 2);
    310     Changed |= setOnlyReadsMemory(F, 2);
    311     return Changed;
    312   case LibFunc::bcopy:
    313     Changed |= setDoesNotThrow(F);
    314     Changed |= setDoesNotCapture(F, 1);
    315     Changed |= setDoesNotCapture(F, 2);
    316     Changed |= setOnlyReadsMemory(F, 1);
    317     return Changed;
    318   case LibFunc::bcmp:
    319     Changed |= setDoesNotThrow(F);
    320     Changed |= setOnlyReadsMemory(F);
    321     Changed |= setDoesNotCapture(F, 1);
    322     Changed |= setDoesNotCapture(F, 2);
    323     return Changed;
    324   case LibFunc::bzero:
    325     Changed |= setDoesNotThrow(F);
    326     Changed |= setDoesNotCapture(F, 1);
    327     return Changed;
    328   case LibFunc::calloc:
    329     Changed |= setDoesNotThrow(F);
    330     Changed |= setDoesNotAlias(F, 0);
    331     return Changed;
    332   case LibFunc::chmod:
    333   case LibFunc::chown:
    334     Changed |= setDoesNotThrow(F);
    335     Changed |= setDoesNotCapture(F, 1);
    336     Changed |= setOnlyReadsMemory(F, 1);
    337     return Changed;
    338   case LibFunc::ctermid:
    339   case LibFunc::clearerr:
    340   case LibFunc::closedir:
    341     Changed |= setDoesNotThrow(F);
    342     Changed |= setDoesNotCapture(F, 1);
    343     return Changed;
    344   case LibFunc::atoi:
    345   case LibFunc::atol:
    346   case LibFunc::atof:
    347   case LibFunc::atoll:
    348     Changed |= setDoesNotThrow(F);
    349     Changed |= setOnlyReadsMemory(F);
    350     Changed |= setDoesNotCapture(F, 1);
    351     return Changed;
    352   case LibFunc::access:
    353     Changed |= setDoesNotThrow(F);
    354     Changed |= setDoesNotCapture(F, 1);
    355     Changed |= setOnlyReadsMemory(F, 1);
    356     return Changed;
    357   case LibFunc::fopen:
    358     Changed |= setDoesNotThrow(F);
    359     Changed |= setDoesNotAlias(F, 0);
    360     Changed |= setDoesNotCapture(F, 1);
    361     Changed |= setDoesNotCapture(F, 2);
    362     Changed |= setOnlyReadsMemory(F, 1);
    363     Changed |= setOnlyReadsMemory(F, 2);
    364     return Changed;
    365   case LibFunc::fdopen:
    366     Changed |= setDoesNotThrow(F);
    367     Changed |= setDoesNotAlias(F, 0);
    368     Changed |= setDoesNotCapture(F, 2);
    369     Changed |= setOnlyReadsMemory(F, 2);
    370     return Changed;
    371   case LibFunc::feof:
    372   case LibFunc::free:
    373   case LibFunc::fseek:
    374   case LibFunc::ftell:
    375   case LibFunc::fgetc:
    376   case LibFunc::fseeko:
    377   case LibFunc::ftello:
    378   case LibFunc::fileno:
    379   case LibFunc::fflush:
    380   case LibFunc::fclose:
    381   case LibFunc::fsetpos:
    382   case LibFunc::flockfile:
    383   case LibFunc::funlockfile:
    384   case LibFunc::ftrylockfile:
    385     Changed |= setDoesNotThrow(F);
    386     Changed |= setDoesNotCapture(F, 1);
    387     return Changed;
    388   case LibFunc::ferror:
    389     Changed |= setDoesNotThrow(F);
    390     Changed |= setDoesNotCapture(F, 1);
    391     Changed |= setOnlyReadsMemory(F);
    392     return Changed;
    393   case LibFunc::fputc:
    394   case LibFunc::fstat:
    395   case LibFunc::frexp:
    396   case LibFunc::frexpf:
    397   case LibFunc::frexpl:
    398   case LibFunc::fstatvfs:
    399     Changed |= setDoesNotThrow(F);
    400     Changed |= setDoesNotCapture(F, 2);
    401     return Changed;
    402   case LibFunc::fgets:
    403     Changed |= setDoesNotThrow(F);
    404     Changed |= setDoesNotCapture(F, 3);
    405     return Changed;
    406   case LibFunc::fread:
    407     Changed |= setDoesNotThrow(F);
    408     Changed |= setDoesNotCapture(F, 1);
    409     Changed |= setDoesNotCapture(F, 4);
    410     return Changed;
    411   case LibFunc::fwrite:
    412     Changed |= setDoesNotThrow(F);
    413     Changed |= setDoesNotCapture(F, 1);
    414     Changed |= setDoesNotCapture(F, 4);
    415     // FIXME: readonly #1?
    416     return Changed;
    417   case LibFunc::fputs:
    418     Changed |= setDoesNotThrow(F);
    419     Changed |= setDoesNotCapture(F, 1);
    420     Changed |= setDoesNotCapture(F, 2);
    421     Changed |= setOnlyReadsMemory(F, 1);
    422     return Changed;
    423   case LibFunc::fscanf:
    424   case LibFunc::fprintf:
    425     Changed |= setDoesNotThrow(F);
    426     Changed |= setDoesNotCapture(F, 1);
    427     Changed |= setDoesNotCapture(F, 2);
    428     Changed |= setOnlyReadsMemory(F, 2);
    429     return Changed;
    430   case LibFunc::fgetpos:
    431     Changed |= setDoesNotThrow(F);
    432     Changed |= setDoesNotCapture(F, 1);
    433     Changed |= setDoesNotCapture(F, 2);
    434     return Changed;
    435   case LibFunc::getc:
    436   case LibFunc::getlogin_r:
    437   case LibFunc::getc_unlocked:
    438     Changed |= setDoesNotThrow(F);
    439     Changed |= setDoesNotCapture(F, 1);
    440     return Changed;
    441   case LibFunc::getenv:
    442     Changed |= setDoesNotThrow(F);
    443     Changed |= setOnlyReadsMemory(F);
    444     Changed |= setDoesNotCapture(F, 1);
    445     return Changed;
    446   case LibFunc::gets:
    447   case LibFunc::getchar:
    448     Changed |= setDoesNotThrow(F);
    449     return Changed;
    450   case LibFunc::getitimer:
    451     Changed |= setDoesNotThrow(F);
    452     Changed |= setDoesNotCapture(F, 2);
    453     return Changed;
    454   case LibFunc::getpwnam:
    455     Changed |= setDoesNotThrow(F);
    456     Changed |= setDoesNotCapture(F, 1);
    457     Changed |= setOnlyReadsMemory(F, 1);
    458     return Changed;
    459   case LibFunc::ungetc:
    460     Changed |= setDoesNotThrow(F);
    461     Changed |= setDoesNotCapture(F, 2);
    462     return Changed;
    463   case LibFunc::uname:
    464     Changed |= setDoesNotThrow(F);
    465     Changed |= setDoesNotCapture(F, 1);
    466     return Changed;
    467   case LibFunc::unlink:
    468     Changed |= setDoesNotThrow(F);
    469     Changed |= setDoesNotCapture(F, 1);
    470     Changed |= setOnlyReadsMemory(F, 1);
    471     return Changed;
    472   case LibFunc::unsetenv:
    473     Changed |= setDoesNotThrow(F);
    474     Changed |= setDoesNotCapture(F, 1);
    475     Changed |= setOnlyReadsMemory(F, 1);
    476     return Changed;
    477   case LibFunc::utime:
    478   case LibFunc::utimes:
    479     Changed |= setDoesNotThrow(F);
    480     Changed |= setDoesNotCapture(F, 1);
    481     Changed |= setDoesNotCapture(F, 2);
    482     Changed |= setOnlyReadsMemory(F, 1);
    483     Changed |= setOnlyReadsMemory(F, 2);
    484     return Changed;
    485   case LibFunc::putc:
    486     Changed |= setDoesNotThrow(F);
    487     Changed |= setDoesNotCapture(F, 2);
    488     return Changed;
    489   case LibFunc::puts:
    490   case LibFunc::printf:
    491   case LibFunc::perror:
    492     Changed |= setDoesNotThrow(F);
    493     Changed |= setDoesNotCapture(F, 1);
    494     Changed |= setOnlyReadsMemory(F, 1);
    495     return Changed;
    496   case LibFunc::pread:
    497     // May throw; "pread" is a valid pthread cancellation point.
    498     Changed |= setDoesNotCapture(F, 2);
    499     return Changed;
    500   case LibFunc::pwrite:
    501     // May throw; "pwrite" is a valid pthread cancellation point.
    502     Changed |= setDoesNotCapture(F, 2);
    503     Changed |= setOnlyReadsMemory(F, 2);
    504     return Changed;
    505   case LibFunc::putchar:
    506     Changed |= setDoesNotThrow(F);
    507     return Changed;
    508   case LibFunc::popen:
    509     Changed |= setDoesNotThrow(F);
    510     Changed |= setDoesNotAlias(F, 0);
    511     Changed |= setDoesNotCapture(F, 1);
    512     Changed |= setDoesNotCapture(F, 2);
    513     Changed |= setOnlyReadsMemory(F, 1);
    514     Changed |= setOnlyReadsMemory(F, 2);
    515     return Changed;
    516   case LibFunc::pclose:
    517     Changed |= setDoesNotThrow(F);
    518     Changed |= setDoesNotCapture(F, 1);
    519     return Changed;
    520   case LibFunc::vscanf:
    521     Changed |= setDoesNotThrow(F);
    522     Changed |= setDoesNotCapture(F, 1);
    523     Changed |= setOnlyReadsMemory(F, 1);
    524     return Changed;
    525   case LibFunc::vsscanf:
    526     Changed |= setDoesNotThrow(F);
    527     Changed |= setDoesNotCapture(F, 1);
    528     Changed |= setDoesNotCapture(F, 2);
    529     Changed |= setOnlyReadsMemory(F, 1);
    530     Changed |= setOnlyReadsMemory(F, 2);
    531     return Changed;
    532   case LibFunc::vfscanf:
    533     Changed |= setDoesNotThrow(F);
    534     Changed |= setDoesNotCapture(F, 1);
    535     Changed |= setDoesNotCapture(F, 2);
    536     Changed |= setOnlyReadsMemory(F, 2);
    537     return Changed;
    538   case LibFunc::valloc:
    539     Changed |= setDoesNotThrow(F);
    540     Changed |= setDoesNotAlias(F, 0);
    541     return Changed;
    542   case LibFunc::vprintf:
    543     Changed |= setDoesNotThrow(F);
    544     Changed |= setDoesNotCapture(F, 1);
    545     Changed |= setOnlyReadsMemory(F, 1);
    546     return Changed;
    547   case LibFunc::vfprintf:
    548   case LibFunc::vsprintf:
    549     Changed |= setDoesNotThrow(F);
    550     Changed |= setDoesNotCapture(F, 1);
    551     Changed |= setDoesNotCapture(F, 2);
    552     Changed |= setOnlyReadsMemory(F, 2);
    553     return Changed;
    554   case LibFunc::vsnprintf:
    555     Changed |= setDoesNotThrow(F);
    556     Changed |= setDoesNotCapture(F, 1);
    557     Changed |= setDoesNotCapture(F, 3);
    558     Changed |= setOnlyReadsMemory(F, 3);
    559     return Changed;
    560   case LibFunc::open:
    561     // May throw; "open" is a valid pthread cancellation point.
    562     Changed |= setDoesNotCapture(F, 1);
    563     Changed |= setOnlyReadsMemory(F, 1);
    564     return Changed;
    565   case LibFunc::opendir:
    566     Changed |= setDoesNotThrow(F);
    567     Changed |= setDoesNotAlias(F, 0);
    568     Changed |= setDoesNotCapture(F, 1);
    569     Changed |= setOnlyReadsMemory(F, 1);
    570     return Changed;
    571   case LibFunc::tmpfile:
    572     Changed |= setDoesNotThrow(F);
    573     Changed |= setDoesNotAlias(F, 0);
    574     return Changed;
    575   case LibFunc::times:
    576     Changed |= setDoesNotThrow(F);
    577     Changed |= setDoesNotCapture(F, 1);
    578     return Changed;
    579   case LibFunc::htonl:
    580   case LibFunc::htons:
    581   case LibFunc::ntohl:
    582   case LibFunc::ntohs:
    583     Changed |= setDoesNotThrow(F);
    584     Changed |= setDoesNotAccessMemory(F);
    585     return Changed;
    586   case LibFunc::lstat:
    587     Changed |= setDoesNotThrow(F);
    588     Changed |= setDoesNotCapture(F, 1);
    589     Changed |= setDoesNotCapture(F, 2);
    590     Changed |= setOnlyReadsMemory(F, 1);
    591     return Changed;
    592   case LibFunc::lchown:
    593     Changed |= setDoesNotThrow(F);
    594     Changed |= setDoesNotCapture(F, 1);
    595     Changed |= setOnlyReadsMemory(F, 1);
    596     return Changed;
    597   case LibFunc::qsort:
    598     // May throw; places call through function pointer.
    599     Changed |= setDoesNotCapture(F, 4);
    600     return Changed;
    601   case LibFunc::dunder_strdup:
    602   case LibFunc::dunder_strndup:
    603     Changed |= setDoesNotThrow(F);
    604     Changed |= setDoesNotAlias(F, 0);
    605     Changed |= setDoesNotCapture(F, 1);
    606     Changed |= setOnlyReadsMemory(F, 1);
    607     return Changed;
    608   case LibFunc::dunder_strtok_r:
    609     Changed |= setDoesNotThrow(F);
    610     Changed |= setDoesNotCapture(F, 2);
    611     Changed |= setOnlyReadsMemory(F, 2);
    612     return Changed;
    613   case LibFunc::under_IO_getc:
    614     Changed |= setDoesNotThrow(F);
    615     Changed |= setDoesNotCapture(F, 1);
    616     return Changed;
    617   case LibFunc::under_IO_putc:
    618     Changed |= setDoesNotThrow(F);
    619     Changed |= setDoesNotCapture(F, 2);
    620     return Changed;
    621   case LibFunc::dunder_isoc99_scanf:
    622     Changed |= setDoesNotThrow(F);
    623     Changed |= setDoesNotCapture(F, 1);
    624     Changed |= setOnlyReadsMemory(F, 1);
    625     return Changed;
    626   case LibFunc::stat64:
    627   case LibFunc::lstat64:
    628   case LibFunc::statvfs64:
    629     Changed |= setDoesNotThrow(F);
    630     Changed |= setDoesNotCapture(F, 1);
    631     Changed |= setDoesNotCapture(F, 2);
    632     Changed |= setOnlyReadsMemory(F, 1);
    633     return Changed;
    634   case LibFunc::dunder_isoc99_sscanf:
    635     Changed |= setDoesNotThrow(F);
    636     Changed |= setDoesNotCapture(F, 1);
    637     Changed |= setDoesNotCapture(F, 2);
    638     Changed |= setOnlyReadsMemory(F, 1);
    639     Changed |= setOnlyReadsMemory(F, 2);
    640     return Changed;
    641   case LibFunc::fopen64:
    642     Changed |= setDoesNotThrow(F);
    643     Changed |= setDoesNotAlias(F, 0);
    644     Changed |= setDoesNotCapture(F, 1);
    645     Changed |= setDoesNotCapture(F, 2);
    646     Changed |= setOnlyReadsMemory(F, 1);
    647     Changed |= setOnlyReadsMemory(F, 2);
    648     return Changed;
    649   case LibFunc::fseeko64:
    650   case LibFunc::ftello64:
    651     Changed |= setDoesNotThrow(F);
    652     Changed |= setDoesNotCapture(F, 1);
    653     return Changed;
    654   case LibFunc::tmpfile64:
    655     Changed |= setDoesNotThrow(F);
    656     Changed |= setDoesNotAlias(F, 0);
    657     return Changed;
    658   case LibFunc::fstat64:
    659   case LibFunc::fstatvfs64:
    660     Changed |= setDoesNotThrow(F);
    661     Changed |= setDoesNotCapture(F, 2);
    662     return Changed;
    663   case LibFunc::open64:
    664     // May throw; "open" is a valid pthread cancellation point.
    665     Changed |= setDoesNotCapture(F, 1);
    666     Changed |= setOnlyReadsMemory(F, 1);
    667     return Changed;
    668   case LibFunc::gettimeofday:
    669     // Currently some platforms have the restrict keyword on the arguments to
    670     // gettimeofday. To be conservative, do not add noalias to gettimeofday's
    671     // arguments.
    672     Changed |= setDoesNotThrow(F);
    673     Changed |= setDoesNotCapture(F, 1);
    674     Changed |= setDoesNotCapture(F, 2);
    675     return Changed;
    676   case LibFunc::Znwj: // new(unsigned int)
    677   case LibFunc::Znwm: // new(unsigned long)
    678   case LibFunc::Znaj: // new[](unsigned int)
    679   case LibFunc::Znam: // new[](unsigned long)
    680   case LibFunc::msvc_new_int: // new(unsigned int)
    681   case LibFunc::msvc_new_longlong: // new(unsigned long long)
    682   case LibFunc::msvc_new_array_int: // new[](unsigned int)
    683   case LibFunc::msvc_new_array_longlong: // new[](unsigned long long)
    684     // Operator new always returns a nonnull noalias pointer
    685     Changed |= setNonNull(F, AttributeSet::ReturnIndex);
    686     Changed |= setDoesNotAlias(F, AttributeSet::ReturnIndex);
    687     return Changed;
    688   //TODO: add LibFunc entries for:
    689   //case LibFunc::memset_pattern4:
    690   //case LibFunc::memset_pattern8:
    691   case LibFunc::memset_pattern16:
    692     Changed |= setOnlyAccessesArgMemory(F);
    693     Changed |= setDoesNotCapture(F, 1);
    694     Changed |= setDoesNotCapture(F, 2);
    695     Changed |= setOnlyReadsMemory(F, 2);
    696     return Changed;
    697   // int __nvvm_reflect(const char *)
    698   case LibFunc::nvvm_reflect:
    699     Changed |= setDoesNotAccessMemory(F);
    700     Changed |= setDoesNotThrow(F);
    701     return Changed;
    702 
    703   default:
    704     // FIXME: It'd be really nice to cover all the library functions we're
    705     // aware of here.
    706     return false;
    707   }
    708 }
    709 
    710 //- Emit LibCalls ------------------------------------------------------------//
    711 
    712 Value *llvm::castToCStr(Value *V, IRBuilder<> &B) {
    713   unsigned AS = V->getType()->getPointerAddressSpace();
    714   return B.CreateBitCast(V, B.getInt8PtrTy(AS), "cstr");
    715 }
    716 
    717 Value *llvm::emitStrLen(Value *Ptr, IRBuilder<> &B, const DataLayout &DL,
    718                         const TargetLibraryInfo *TLI) {
    719   if (!TLI->has(LibFunc::strlen))
    720     return nullptr;
    721 
    722   Module *M = B.GetInsertBlock()->getModule();
    723   LLVMContext &Context = B.GetInsertBlock()->getContext();
    724   Constant *StrLen = M->getOrInsertFunction("strlen", DL.getIntPtrType(Context),
    725                                             B.getInt8PtrTy(), nullptr);
    726   inferLibFuncAttributes(*M->getFunction("strlen"), *TLI);
    727   CallInst *CI = B.CreateCall(StrLen, castToCStr(Ptr, B), "strlen");
    728   if (const Function *F = dyn_cast<Function>(StrLen->stripPointerCasts()))
    729     CI->setCallingConv(F->getCallingConv());
    730 
    731   return CI;
    732 }
    733 
    734 Value *llvm::emitStrChr(Value *Ptr, char C, IRBuilder<> &B,
    735                         const TargetLibraryInfo *TLI) {
    736   if (!TLI->has(LibFunc::strchr))
    737     return nullptr;
    738 
    739   Module *M = B.GetInsertBlock()->getModule();
    740   Type *I8Ptr = B.getInt8PtrTy();
    741   Type *I32Ty = B.getInt32Ty();
    742   Constant *StrChr =
    743       M->getOrInsertFunction("strchr", I8Ptr, I8Ptr, I32Ty, nullptr);
    744   inferLibFuncAttributes(*M->getFunction("strchr"), *TLI);
    745   CallInst *CI = B.CreateCall(
    746       StrChr, {castToCStr(Ptr, B), ConstantInt::get(I32Ty, C)}, "strchr");
    747   if (const Function *F = dyn_cast<Function>(StrChr->stripPointerCasts()))
    748     CI->setCallingConv(F->getCallingConv());
    749   return CI;
    750 }
    751 
    752 Value *llvm::emitStrNCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilder<> &B,
    753                          const DataLayout &DL, const TargetLibraryInfo *TLI) {
    754   if (!TLI->has(LibFunc::strncmp))
    755     return nullptr;
    756 
    757   Module *M = B.GetInsertBlock()->getModule();
    758   LLVMContext &Context = B.GetInsertBlock()->getContext();
    759   Value *StrNCmp = M->getOrInsertFunction("strncmp", B.getInt32Ty(),
    760                                           B.getInt8PtrTy(), B.getInt8PtrTy(),
    761                                           DL.getIntPtrType(Context), nullptr);
    762   inferLibFuncAttributes(*M->getFunction("strncmp"), *TLI);
    763   CallInst *CI = B.CreateCall(
    764       StrNCmp, {castToCStr(Ptr1, B), castToCStr(Ptr2, B), Len}, "strncmp");
    765 
    766   if (const Function *F = dyn_cast<Function>(StrNCmp->stripPointerCasts()))
    767     CI->setCallingConv(F->getCallingConv());
    768 
    769   return CI;
    770 }
    771 
    772 Value *llvm::emitStrCpy(Value *Dst, Value *Src, IRBuilder<> &B,
    773                         const TargetLibraryInfo *TLI, StringRef Name) {
    774   if (!TLI->has(LibFunc::strcpy))
    775     return nullptr;
    776 
    777   Module *M = B.GetInsertBlock()->getModule();
    778   Type *I8Ptr = B.getInt8PtrTy();
    779   Value *StrCpy = M->getOrInsertFunction(Name, I8Ptr, I8Ptr, I8Ptr, nullptr);
    780   inferLibFuncAttributes(*M->getFunction(Name), *TLI);
    781   CallInst *CI =
    782       B.CreateCall(StrCpy, {castToCStr(Dst, B), castToCStr(Src, B)}, Name);
    783   if (const Function *F = dyn_cast<Function>(StrCpy->stripPointerCasts()))
    784     CI->setCallingConv(F->getCallingConv());
    785   return CI;
    786 }
    787 
    788 Value *llvm::emitStrNCpy(Value *Dst, Value *Src, Value *Len, IRBuilder<> &B,
    789                          const TargetLibraryInfo *TLI, StringRef Name) {
    790   if (!TLI->has(LibFunc::strncpy))
    791     return nullptr;
    792 
    793   Module *M = B.GetInsertBlock()->getModule();
    794   Type *I8Ptr = B.getInt8PtrTy();
    795   Value *StrNCpy = M->getOrInsertFunction(Name, I8Ptr, I8Ptr, I8Ptr,
    796                                           Len->getType(), nullptr);
    797   inferLibFuncAttributes(*M->getFunction(Name), *TLI);
    798   CallInst *CI = B.CreateCall(
    799       StrNCpy, {castToCStr(Dst, B), castToCStr(Src, B), Len}, "strncpy");
    800   if (const Function *F = dyn_cast<Function>(StrNCpy->stripPointerCasts()))
    801     CI->setCallingConv(F->getCallingConv());
    802   return CI;
    803 }
    804 
    805 Value *llvm::emitMemCpyChk(Value *Dst, Value *Src, Value *Len, Value *ObjSize,
    806                            IRBuilder<> &B, const DataLayout &DL,
    807                            const TargetLibraryInfo *TLI) {
    808   if (!TLI->has(LibFunc::memcpy_chk))
    809     return nullptr;
    810 
    811   Module *M = B.GetInsertBlock()->getModule();
    812   AttributeSet AS;
    813   AS = AttributeSet::get(M->getContext(), AttributeSet::FunctionIndex,
    814                          Attribute::NoUnwind);
    815   LLVMContext &Context = B.GetInsertBlock()->getContext();
    816   Value *MemCpy = M->getOrInsertFunction(
    817       "__memcpy_chk", AttributeSet::get(M->getContext(), AS), B.getInt8PtrTy(),
    818       B.getInt8PtrTy(), B.getInt8PtrTy(), DL.getIntPtrType(Context),
    819       DL.getIntPtrType(Context), nullptr);
    820   Dst = castToCStr(Dst, B);
    821   Src = castToCStr(Src, B);
    822   CallInst *CI = B.CreateCall(MemCpy, {Dst, Src, Len, ObjSize});
    823   if (const Function *F = dyn_cast<Function>(MemCpy->stripPointerCasts()))
    824     CI->setCallingConv(F->getCallingConv());
    825   return CI;
    826 }
    827 
    828 Value *llvm::emitMemChr(Value *Ptr, Value *Val, Value *Len, IRBuilder<> &B,
    829                         const DataLayout &DL, const TargetLibraryInfo *TLI) {
    830   if (!TLI->has(LibFunc::memchr))
    831     return nullptr;
    832 
    833   Module *M = B.GetInsertBlock()->getModule();
    834   LLVMContext &Context = B.GetInsertBlock()->getContext();
    835   Value *MemChr = M->getOrInsertFunction("memchr", B.getInt8PtrTy(),
    836                                          B.getInt8PtrTy(), B.getInt32Ty(),
    837                                          DL.getIntPtrType(Context), nullptr);
    838   inferLibFuncAttributes(*M->getFunction("memchr"), *TLI);
    839   CallInst *CI = B.CreateCall(MemChr, {castToCStr(Ptr, B), Val, Len}, "memchr");
    840 
    841   if (const Function *F = dyn_cast<Function>(MemChr->stripPointerCasts()))
    842     CI->setCallingConv(F->getCallingConv());
    843 
    844   return CI;
    845 }
    846 
    847 Value *llvm::emitMemCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilder<> &B,
    848                         const DataLayout &DL, const TargetLibraryInfo *TLI) {
    849   if (!TLI->has(LibFunc::memcmp))
    850     return nullptr;
    851 
    852   Module *M = B.GetInsertBlock()->getModule();
    853   LLVMContext &Context = B.GetInsertBlock()->getContext();
    854   Value *MemCmp = M->getOrInsertFunction("memcmp", B.getInt32Ty(),
    855                                          B.getInt8PtrTy(), B.getInt8PtrTy(),
    856                                          DL.getIntPtrType(Context), nullptr);
    857   inferLibFuncAttributes(*M->getFunction("memcmp"), *TLI);
    858   CallInst *CI = B.CreateCall(
    859       MemCmp, {castToCStr(Ptr1, B), castToCStr(Ptr2, B), Len}, "memcmp");
    860 
    861   if (const Function *F = dyn_cast<Function>(MemCmp->stripPointerCasts()))
    862     CI->setCallingConv(F->getCallingConv());
    863 
    864   return CI;
    865 }
    866 
    867 /// Append a suffix to the function name according to the type of 'Op'.
    868 static void appendTypeSuffix(Value *Op, StringRef &Name,
    869                              SmallString<20> &NameBuffer) {
    870   if (!Op->getType()->isDoubleTy()) {
    871       NameBuffer += Name;
    872 
    873     if (Op->getType()->isFloatTy())
    874       NameBuffer += 'f';
    875     else
    876       NameBuffer += 'l';
    877 
    878     Name = NameBuffer;
    879   }
    880 }
    881 
    882 Value *llvm::emitUnaryFloatFnCall(Value *Op, StringRef Name, IRBuilder<> &B,
    883                                   const AttributeSet &Attrs) {
    884   SmallString<20> NameBuffer;
    885   appendTypeSuffix(Op, Name, NameBuffer);
    886 
    887   Module *M = B.GetInsertBlock()->getModule();
    888   Value *Callee = M->getOrInsertFunction(Name, Op->getType(),
    889                                          Op->getType(), nullptr);
    890   CallInst *CI = B.CreateCall(Callee, Op, Name);
    891   CI->setAttributes(Attrs);
    892   if (const Function *F = dyn_cast<Function>(Callee->stripPointerCasts()))
    893     CI->setCallingConv(F->getCallingConv());
    894 
    895   return CI;
    896 }
    897 
    898 Value *llvm::emitBinaryFloatFnCall(Value *Op1, Value *Op2, StringRef Name,
    899                                   IRBuilder<> &B, const AttributeSet &Attrs) {
    900   SmallString<20> NameBuffer;
    901   appendTypeSuffix(Op1, Name, NameBuffer);
    902 
    903   Module *M = B.GetInsertBlock()->getModule();
    904   Value *Callee = M->getOrInsertFunction(Name, Op1->getType(), Op1->getType(),
    905                                          Op2->getType(), nullptr);
    906   CallInst *CI = B.CreateCall(Callee, {Op1, Op2}, Name);
    907   CI->setAttributes(Attrs);
    908   if (const Function *F = dyn_cast<Function>(Callee->stripPointerCasts()))
    909     CI->setCallingConv(F->getCallingConv());
    910 
    911   return CI;
    912 }
    913 
    914 Value *llvm::emitPutChar(Value *Char, IRBuilder<> &B,
    915                          const TargetLibraryInfo *TLI) {
    916   if (!TLI->has(LibFunc::putchar))
    917     return nullptr;
    918 
    919   Module *M = B.GetInsertBlock()->getModule();
    920   Value *PutChar = M->getOrInsertFunction("putchar", B.getInt32Ty(),
    921                                           B.getInt32Ty(), nullptr);
    922   CallInst *CI = B.CreateCall(PutChar,
    923                               B.CreateIntCast(Char,
    924                               B.getInt32Ty(),
    925                               /*isSigned*/true,
    926                               "chari"),
    927                               "putchar");
    928 
    929   if (const Function *F = dyn_cast<Function>(PutChar->stripPointerCasts()))
    930     CI->setCallingConv(F->getCallingConv());
    931   return CI;
    932 }
    933 
    934 Value *llvm::emitPutS(Value *Str, IRBuilder<> &B,
    935                       const TargetLibraryInfo *TLI) {
    936   if (!TLI->has(LibFunc::puts))
    937     return nullptr;
    938 
    939   Module *M = B.GetInsertBlock()->getModule();
    940   Value *PutS =
    941       M->getOrInsertFunction("puts", B.getInt32Ty(), B.getInt8PtrTy(), nullptr);
    942   inferLibFuncAttributes(*M->getFunction("puts"), *TLI);
    943   CallInst *CI = B.CreateCall(PutS, castToCStr(Str, B), "puts");
    944   if (const Function *F = dyn_cast<Function>(PutS->stripPointerCasts()))
    945     CI->setCallingConv(F->getCallingConv());
    946   return CI;
    947 }
    948 
    949 Value *llvm::emitFPutC(Value *Char, Value *File, IRBuilder<> &B,
    950                        const TargetLibraryInfo *TLI) {
    951   if (!TLI->has(LibFunc::fputc))
    952     return nullptr;
    953 
    954   Module *M = B.GetInsertBlock()->getModule();
    955   Constant *F = M->getOrInsertFunction("fputc", B.getInt32Ty(), B.getInt32Ty(),
    956                                        File->getType(), nullptr);
    957   if (File->getType()->isPointerTy())
    958     inferLibFuncAttributes(*M->getFunction("fputc"), *TLI);
    959   Char = B.CreateIntCast(Char, B.getInt32Ty(), /*isSigned*/true,
    960                          "chari");
    961   CallInst *CI = B.CreateCall(F, {Char, File}, "fputc");
    962 
    963   if (const Function *Fn = dyn_cast<Function>(F->stripPointerCasts()))
    964     CI->setCallingConv(Fn->getCallingConv());
    965   return CI;
    966 }
    967 
    968 Value *llvm::emitFPutS(Value *Str, Value *File, IRBuilder<> &B,
    969                        const TargetLibraryInfo *TLI) {
    970   if (!TLI->has(LibFunc::fputs))
    971     return nullptr;
    972 
    973   Module *M = B.GetInsertBlock()->getModule();
    974   StringRef FPutsName = TLI->getName(LibFunc::fputs);
    975   Constant *F = M->getOrInsertFunction(
    976       FPutsName, B.getInt32Ty(), B.getInt8PtrTy(), File->getType(), nullptr);
    977   if (File->getType()->isPointerTy())
    978     inferLibFuncAttributes(*M->getFunction(FPutsName), *TLI);
    979   CallInst *CI = B.CreateCall(F, {castToCStr(Str, B), File}, "fputs");
    980 
    981   if (const Function *Fn = dyn_cast<Function>(F->stripPointerCasts()))
    982     CI->setCallingConv(Fn->getCallingConv());
    983   return CI;
    984 }
    985 
    986 Value *llvm::emitFWrite(Value *Ptr, Value *Size, Value *File, IRBuilder<> &B,
    987                         const DataLayout &DL, const TargetLibraryInfo *TLI) {
    988   if (!TLI->has(LibFunc::fwrite))
    989     return nullptr;
    990 
    991   Module *M = B.GetInsertBlock()->getModule();
    992   LLVMContext &Context = B.GetInsertBlock()->getContext();
    993   StringRef FWriteName = TLI->getName(LibFunc::fwrite);
    994   Constant *F = M->getOrInsertFunction(
    995       FWriteName, DL.getIntPtrType(Context), B.getInt8PtrTy(),
    996       DL.getIntPtrType(Context), DL.getIntPtrType(Context), File->getType(),
    997       nullptr);
    998   if (File->getType()->isPointerTy())
    999     inferLibFuncAttributes(*M->getFunction(FWriteName), *TLI);
   1000   CallInst *CI =
   1001       B.CreateCall(F, {castToCStr(Ptr, B), Size,
   1002                        ConstantInt::get(DL.getIntPtrType(Context), 1), File});
   1003 
   1004   if (const Function *Fn = dyn_cast<Function>(F->stripPointerCasts()))
   1005     CI->setCallingConv(Fn->getCallingConv());
   1006   return CI;
   1007 }
   1008