John Bauman | 19bac1e | 2014-05-06 15:23:49 -0400 | [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. |
| 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 == 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 | |