LibCallSemantics.cpp revision 193323
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" 19using namespace llvm; 20 21/// getMap - This impl pointer in ~LibCallInfo is actually a StringMap. This 22/// helper does the cast. 23static StringMap<const LibCallFunctionInfo*> *getMap(void *Ptr) { 24 return static_cast<StringMap<const LibCallFunctionInfo*> *>(Ptr); 25} 26 27LibCallInfo::~LibCallInfo() { 28 delete getMap(Impl); 29} 30 31const 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. 43const LibCallFunctionInfo *LibCallInfo::getFunctionInfo(Function *F) const { 44 StringMap<const LibCallFunctionInfo*> *Map = getMap(Impl); 45 46 /// If this is the first time we are querying for this info, lazily construct 47 /// the StringMap to index it. 48 if (Map == 0) { 49 Impl = Map = new StringMap<const LibCallFunctionInfo*>(); 50 51 const LibCallFunctionInfo *Array = getFunctionInfoArray(); 52 if (Array == 0) return 0; 53 54 // We now have the array of entries. Populate the StringMap. 55 for (unsigned i = 0; Array[i].Name; ++i) 56 (*Map)[Array[i].Name] = Array+i; 57 } 58 59 // Look up this function in the string map. 60 const char *ValueName = F->getNameStart(); 61 StringMap<const LibCallFunctionInfo*>::iterator I = 62 Map->find(ValueName, ValueName+F->getNameLen()); 63 return I != Map->end() ? I->second : 0; 64} 65 66