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 * 44LibCallInfo::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