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. getMap(void * Ptr)23static StringMap<const LibCallFunctionInfo*> *getMap(void *Ptr) { 24 return static_cast<StringMap<const LibCallFunctionInfo*> *>(Ptr); 25 } 26 ~LibCallInfo()27LibCallInfo::~LibCallInfo() { 28 delete getMap(Impl); 29 } 30 getLocationInfo(unsigned LocID) const31const 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 * getFunctionInfo(const Function * F) const44LibCallInfo::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