1
//===- LibCallSemantics.cpp - Describe library semantics ------------------===//
3
// The LLVM Compiler Infrastructure
5
// This file is distributed under the University of Illinois Open Source
6
// License. See LICENSE.TXT for details.
8
//===----------------------------------------------------------------------===//
10
// This file implements interfaces that can be used to describe language
11
// specific runtime library interfaces (e.g. libc, libm, etc) to LLVM
14
//===----------------------------------------------------------------------===//
16
#include "llvm/Analysis/LibCallSemantics.h"
17
#include "llvm/ADT/StringMap.h"
18
#include "llvm/Function.h"
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);
27
LibCallInfo::~LibCallInfo() {
31
const LibCallLocationInfo &LibCallInfo::getLocationInfo(unsigned LocID) const {
32
// Get location info on the first call.
33
if (NumLocations == 0)
34
NumLocations = getLocationInfo(Locations);
36
assert(LocID < NumLocations && "Invalid location ID!");
37
return Locations[LocID];
41
/// getFunctionInfo - Return the LibCallFunctionInfo object corresponding to
42
/// the specified function if we have it. If not, return null.
43
const LibCallFunctionInfo *LibCallInfo::getFunctionInfo(Function *F) const {
44
StringMap<const LibCallFunctionInfo*> *Map = getMap(Impl);
46
/// If this is the first time we are querying for this info, lazily construct
47
/// the StringMap to index it.
49
Impl = Map = new StringMap<const LibCallFunctionInfo*>();
51
const LibCallFunctionInfo *Array = getFunctionInfoArray();
52
if (Array == 0) return 0;
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;
59
// Look up this function in the string map.
60
return Map->lookup(F->getName());