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