| Chris Lattner | 9a35f1b | 2008-05-07 18:21:13 +0000 | [diff] [blame] | 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" | 
|  | 19 | using namespace llvm; | 
|  | 20 |  | 
|  | 21 | /// getMap - 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 | /// getFunctionInfo - Return the LibCallFunctionInfo object corresponding to | 
|  | 42 | /// the specified function if we have it.  If not, return null. | 
| Dan Gohman | 5442c71 | 2010-08-03 21:48:53 +0000 | [diff] [blame] | 43 | const LibCallFunctionInfo * | 
|  | 44 | LibCallInfo::getFunctionInfo(const Function *F) const { | 
| Chris Lattner | 9a35f1b | 2008-05-07 18:21:13 +0000 | [diff] [blame] | 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. | 
| Daniel Dunbar | ca414c7 | 2009-07-26 08:34:35 +0000 | [diff] [blame] | 61 | return Map->lookup(F->getName()); | 
| Chris Lattner | 9a35f1b | 2008-05-07 18:21:13 +0000 | [diff] [blame] | 62 | } | 
|  | 63 |  |