LibCallSemantics.cpp revision 193323
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"
19using namespace llvm;
20
21/// getMap - This impl pointer in ~LibCallInfo is actually a StringMap.  This
22/// helper does the cast.
23static StringMap<const LibCallFunctionInfo*> *getMap(void *Ptr) {
24  return static_cast<StringMap<const LibCallFunctionInfo*> *>(Ptr);
25}
26
27LibCallInfo::~LibCallInfo() {
28  delete getMap(Impl);
29}
30
31const 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.
43const LibCallFunctionInfo *LibCallInfo::getFunctionInfo(Function *F) const {
44  StringMap<const LibCallFunctionInfo*> *Map = getMap(Impl);
45
46  /// If this is the first time we are querying for this info, lazily construct
47  /// the StringMap to index it.
48  if (Map == 0) {
49    Impl = Map = new StringMap<const LibCallFunctionInfo*>();
50
51    const LibCallFunctionInfo *Array = getFunctionInfoArray();
52    if (Array == 0) return 0;
53
54    // We now have the array of entries.  Populate the StringMap.
55    for (unsigned i = 0; Array[i].Name; ++i)
56      (*Map)[Array[i].Name] = Array+i;
57  }
58
59  // Look up this function in the string map.
60  const char *ValueName = F->getNameStart();
61  StringMap<const LibCallFunctionInfo*>::iterator I =
62  Map->find(ValueName, ValueName+F->getNameLen());
63  return I != Map->end() ? I->second : 0;
64}
65
66