114852f27e792470232287371c5ffd4cee1d5b943Chris Lattner//===- LibCallSemantics.cpp - Describe library semantics ------------------===// 214852f27e792470232287371c5ffd4cee1d5b943Chris Lattner// 314852f27e792470232287371c5ffd4cee1d5b943Chris Lattner// The LLVM Compiler Infrastructure 414852f27e792470232287371c5ffd4cee1d5b943Chris Lattner// 514852f27e792470232287371c5ffd4cee1d5b943Chris Lattner// This file is distributed under the University of Illinois Open Source 614852f27e792470232287371c5ffd4cee1d5b943Chris Lattner// License. See LICENSE.TXT for details. 714852f27e792470232287371c5ffd4cee1d5b943Chris Lattner// 814852f27e792470232287371c5ffd4cee1d5b943Chris Lattner//===----------------------------------------------------------------------===// 914852f27e792470232287371c5ffd4cee1d5b943Chris Lattner// 1014852f27e792470232287371c5ffd4cee1d5b943Chris Lattner// This file implements interfaces that can be used to describe language 1114852f27e792470232287371c5ffd4cee1d5b943Chris Lattner// specific runtime library interfaces (e.g. libc, libm, etc) to LLVM 1214852f27e792470232287371c5ffd4cee1d5b943Chris Lattner// optimizers. 1314852f27e792470232287371c5ffd4cee1d5b943Chris Lattner// 1414852f27e792470232287371c5ffd4cee1d5b943Chris Lattner//===----------------------------------------------------------------------===// 1514852f27e792470232287371c5ffd4cee1d5b943Chris Lattner 1614852f27e792470232287371c5ffd4cee1d5b943Chris Lattner#include "llvm/Analysis/LibCallSemantics.h" 1714852f27e792470232287371c5ffd4cee1d5b943Chris Lattner#include "llvm/ADT/StringMap.h" 180b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h" 1914852f27e792470232287371c5ffd4cee1d5b943Chris Lattnerusing namespace llvm; 2014852f27e792470232287371c5ffd4cee1d5b943Chris Lattner 2114852f27e792470232287371c5ffd4cee1d5b943Chris Lattner/// getMap - This impl pointer in ~LibCallInfo is actually a StringMap. This 2214852f27e792470232287371c5ffd4cee1d5b943Chris Lattner/// helper does the cast. 2314852f27e792470232287371c5ffd4cee1d5b943Chris Lattnerstatic StringMap<const LibCallFunctionInfo*> *getMap(void *Ptr) { 2414852f27e792470232287371c5ffd4cee1d5b943Chris Lattner return static_cast<StringMap<const LibCallFunctionInfo*> *>(Ptr); 2514852f27e792470232287371c5ffd4cee1d5b943Chris Lattner} 2614852f27e792470232287371c5ffd4cee1d5b943Chris Lattner 2714852f27e792470232287371c5ffd4cee1d5b943Chris LattnerLibCallInfo::~LibCallInfo() { 2814852f27e792470232287371c5ffd4cee1d5b943Chris Lattner delete getMap(Impl); 2914852f27e792470232287371c5ffd4cee1d5b943Chris Lattner} 3014852f27e792470232287371c5ffd4cee1d5b943Chris Lattner 3114852f27e792470232287371c5ffd4cee1d5b943Chris Lattnerconst LibCallLocationInfo &LibCallInfo::getLocationInfo(unsigned LocID) const { 3214852f27e792470232287371c5ffd4cee1d5b943Chris Lattner // Get location info on the first call. 3314852f27e792470232287371c5ffd4cee1d5b943Chris Lattner if (NumLocations == 0) 3414852f27e792470232287371c5ffd4cee1d5b943Chris Lattner NumLocations = getLocationInfo(Locations); 3514852f27e792470232287371c5ffd4cee1d5b943Chris Lattner 3614852f27e792470232287371c5ffd4cee1d5b943Chris Lattner assert(LocID < NumLocations && "Invalid location ID!"); 3714852f27e792470232287371c5ffd4cee1d5b943Chris Lattner return Locations[LocID]; 3814852f27e792470232287371c5ffd4cee1d5b943Chris Lattner} 3914852f27e792470232287371c5ffd4cee1d5b943Chris Lattner 4014852f27e792470232287371c5ffd4cee1d5b943Chris Lattner 4114852f27e792470232287371c5ffd4cee1d5b943Chris Lattner/// getFunctionInfo - Return the LibCallFunctionInfo object corresponding to 4214852f27e792470232287371c5ffd4cee1d5b943Chris Lattner/// the specified function if we have it. If not, return null. 4379fca6fea87be7221843031870bbf2c9ae1fc555Dan Gohmanconst LibCallFunctionInfo * 4479fca6fea87be7221843031870bbf2c9ae1fc555Dan GohmanLibCallInfo::getFunctionInfo(const Function *F) const { 4514852f27e792470232287371c5ffd4cee1d5b943Chris Lattner StringMap<const LibCallFunctionInfo*> *Map = getMap(Impl); 4614852f27e792470232287371c5ffd4cee1d5b943Chris Lattner 4714852f27e792470232287371c5ffd4cee1d5b943Chris Lattner /// If this is the first time we are querying for this info, lazily construct 4814852f27e792470232287371c5ffd4cee1d5b943Chris Lattner /// the StringMap to index it. 49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!Map) { 5014852f27e792470232287371c5ffd4cee1d5b943Chris Lattner Impl = Map = new StringMap<const LibCallFunctionInfo*>(); 5114852f27e792470232287371c5ffd4cee1d5b943Chris Lattner 5214852f27e792470232287371c5ffd4cee1d5b943Chris Lattner const LibCallFunctionInfo *Array = getFunctionInfoArray(); 53dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!Array) return nullptr; 5414852f27e792470232287371c5ffd4cee1d5b943Chris Lattner 5514852f27e792470232287371c5ffd4cee1d5b943Chris Lattner // We now have the array of entries. Populate the StringMap. 5614852f27e792470232287371c5ffd4cee1d5b943Chris Lattner for (unsigned i = 0; Array[i].Name; ++i) 5714852f27e792470232287371c5ffd4cee1d5b943Chris Lattner (*Map)[Array[i].Name] = Array+i; 5814852f27e792470232287371c5ffd4cee1d5b943Chris Lattner } 5914852f27e792470232287371c5ffd4cee1d5b943Chris Lattner 6014852f27e792470232287371c5ffd4cee1d5b943Chris Lattner // Look up this function in the string map. 61f0443c1eb44d737d9bd78962932fc80f74c6113cDaniel Dunbar return Map->lookup(F->getName()); 6214852f27e792470232287371c5ffd4cee1d5b943Chris Lattner} 6314852f27e792470232287371c5ffd4cee1d5b943Chris Lattner 64