Re-apply r251050 with a for PR25421
[oota-llvm.git] / lib / Analysis / LibCallSemantics.cpp
index e98540ba7e90a57e6d05b309f2f2627fca6bd97d..b91ff20aee253d09108d9318fc60c6d93a3372cf 100644 (file)
 //===----------------------------------------------------------------------===//
 
 #include "llvm/Analysis/LibCallSemantics.h"
-#include "llvm/ADT/StringMap.h"
 #include "llvm/ADT/StringSwitch.h"
 #include "llvm/IR/Function.h"
 using namespace llvm;
 
-/// This impl pointer in ~LibCallInfo is actually a StringMap.  This
-/// helper does the cast.
-static StringMap<const LibCallFunctionInfo*> *getMap(void *Ptr) {
-  return static_cast<StringMap<const LibCallFunctionInfo*> *>(Ptr);
-}
-
-LibCallInfo::~LibCallInfo() {
-  delete getMap(Impl);
-}
-
-const LibCallLocationInfo &LibCallInfo::getLocationInfo(unsigned LocID) const {
-  // Get location info on the first call.
-  if (NumLocations == 0)
-    NumLocations = getLocationInfo(Locations);
-  
-  assert(LocID < NumLocations && "Invalid location ID!");
-  return Locations[LocID];
-}
-
-
-/// Return the LibCallFunctionInfo object corresponding to
-/// the specified function if we have it.  If not, return null.
-const LibCallFunctionInfo *
-LibCallInfo::getFunctionInfo(const Function *F) const {
-  StringMap<const LibCallFunctionInfo*> *Map = getMap(Impl);
-  
-  /// If this is the first time we are querying for this info, lazily construct
-  /// the StringMap to index it.
-  if (!Map) {
-    Impl = Map = new StringMap<const LibCallFunctionInfo*>();
-    
-    const LibCallFunctionInfo *Array = getFunctionInfoArray();
-    if (!Array) return nullptr;
-    
-    // We now have the array of entries.  Populate the StringMap.
-    for (unsigned i = 0; Array[i].Name; ++i)
-      (*Map)[Array[i].Name] = Array+i;
-  }
-  
-  // Look up this function in the string map.
-  return Map->lookup(F->getName());
-}
-
 /// See if the given exception handling personality function is one that we
 /// understand.  If so, return a description of it; otherwise return Unknown.
 EHPersonality llvm::classifyEHPersonality(const Value *Pers) {
-  const Function *F = dyn_cast<Function>(Pers->stripPointerCasts());
+  const Function *F =
+      Pers ? dyn_cast<Function>(Pers->stripPointerCasts()) : nullptr;
   if (!F)
     return EHPersonality::Unknown;
   return StringSwitch<EHPersonality>(F->getName())
@@ -77,12 +34,12 @@ EHPersonality llvm::classifyEHPersonality(const Value *Pers) {
     .Case("_except_handler4",      EHPersonality::MSVC_X86SEH)
     .Case("__C_specific_handler",  EHPersonality::MSVC_Win64SEH)
     .Case("__CxxFrameHandler3",    EHPersonality::MSVC_CXX)
+    .Case("ProcessCLRException",   EHPersonality::CoreCLR)
     .Default(EHPersonality::Unknown);
 }
 
-bool llvm::canSimplifyInvokeNoUnwind(const InvokeInst *II) {
-  const LandingPadInst *LP = II->getLandingPadInst();
-  EHPersonality Personality = classifyEHPersonality(LP->getPersonalityFn());
+bool llvm::canSimplifyInvokeNoUnwind(const Function *F) {
+  EHPersonality Personality = classifyEHPersonality(F->getPersonalityFn());
   // We can't simplify any invokes to nounwind functions if the personality
   // function wants to catch asynch exceptions.  The nounwind attribute only
   // implies that the function does not throw synchronous exceptions.