LazyValueInfo: Actually re-visit partially solved block-values in solveBlockValue()
[oota-llvm.git] / lib / Analysis / LibCallSemantics.cpp
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/IR/Function.h"
19 using namespace llvm;
20
21 /// This impl pointer in ~LibCallInfo is actually a StringMap.  This
22 /// helper does the cast.
23 static StringMap<const LibCallFunctionInfo*> *getMap(void *Ptr) {
24   return static_cast<StringMap<const LibCallFunctionInfo*> *>(Ptr);
25 }
26
27 LibCallInfo::~LibCallInfo() {
28   delete getMap(Impl);
29 }
30
31 const 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 /// Return the LibCallFunctionInfo object corresponding to
42 /// the specified function if we have it.  If not, return null.
43 const LibCallFunctionInfo *
44 LibCallInfo::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) {
50     Impl = Map = new StringMap<const LibCallFunctionInfo*>();
51     
52     const LibCallFunctionInfo *Array = getFunctionInfoArray();
53     if (!Array) return nullptr;
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