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());