Home | History | Annotate | Download | only in Analysis
      1 //===- LibCallSemantics.cpp - Describe library semantics ------------------===//
      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 interfaces that can be used to describe language
     11 // specific runtime library interfaces (e.g. libc, libm, etc) to LLVM
     12 // optimizers.
     13 //
     14 //===----------------------------------------------------------------------===//
     15 
     16 #include "llvm/Analysis/LibCallSemantics.h"
     17 #include "llvm/ADT/StringMap.h"
     18 #include "llvm/Function.h"
     19 using namespace llvm;
     20 
     21 /// getMap - This impl pointer in ~LibCallInfo is actually a StringMap.  This
     22 /// helper does the cast.
     23 static StringMap<const LibCallFunctionInfo*> *getMap(void *Ptr) {
     24   return static_cast<StringMap<const LibCallFunctionInfo*> *>(Ptr);
     25 }
     26 
     27 LibCallInfo::~LibCallInfo() {
     28   delete getMap(Impl);
     29 }
     30 
     31 const LibCallLocationInfo &LibCallInfo::getLocationInfo(unsigned LocID) const {
     32   // Get location info on the first call.
     33   if (NumLocations == 0)
     34     NumLocations = getLocationInfo(Locations);
     35 
     36   assert(LocID < NumLocations && "Invalid location ID!");
     37   return Locations[LocID];
     38 }
     39 
     40 
     41 /// getFunctionInfo - Return the LibCallFunctionInfo object corresponding to
     42 /// the specified function if we have it.  If not, return null.
     43 const LibCallFunctionInfo *
     44 LibCallInfo::getFunctionInfo(const Function *F) const {
     45   StringMap<const LibCallFunctionInfo*> *Map = getMap(Impl);
     46 
     47   /// If this is the first time we are querying for this info, lazily construct
     48   /// the StringMap to index it.
     49   if (Map == 0) {
     50     Impl = Map = new StringMap<const LibCallFunctionInfo*>();
     51 
     52     const LibCallFunctionInfo *Array = getFunctionInfoArray();
     53     if (Array == 0) return 0;
     54 
     55     // We now have the array of entries.  Populate the StringMap.
     56     for (unsigned i = 0; Array[i].Name; ++i)
     57       (*Map)[Array[i].Name] = Array+i;
     58   }
     59 
     60   // Look up this function in the string map.
     61   return Map->lookup(F->getName());
     62 }
     63 
     64