2008-05-07 20:21:13 +02:00
|
|
|
//===- LibCallSemantics.h - Describe library semantics --------------------===//
|
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// This file defines interfaces that can be used to describe language specific
|
|
|
|
// runtime library interfaces (e.g. libc, libm, etc) to LLVM optimizers.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#ifndef LLVM_ANALYSIS_LIBCALLSEMANTICS_H
|
|
|
|
#define LLVM_ANALYSIS_LIBCALLSEMANTICS_H
|
|
|
|
|
|
|
|
#include "llvm/Analysis/AliasAnalysis.h"
|
|
|
|
|
|
|
|
namespace llvm {
|
2015-02-11 02:23:16 +01:00
|
|
|
class InvokeInst;
|
2008-05-07 20:21:13 +02:00
|
|
|
|
2015-01-28 02:17:38 +01:00
|
|
|
enum class EHPersonality {
|
|
|
|
Unknown,
|
|
|
|
GNU_Ada,
|
|
|
|
GNU_C,
|
|
|
|
GNU_CXX,
|
|
|
|
GNU_ObjC,
|
2015-02-11 02:23:16 +01:00
|
|
|
MSVC_X86SEH,
|
2015-01-28 02:17:38 +01:00
|
|
|
MSVC_Win64SEH,
|
|
|
|
MSVC_CXX,
|
2015-10-06 22:28:16 +02:00
|
|
|
CoreCLR
|
2015-01-28 02:17:38 +01:00
|
|
|
};
|
|
|
|
|
2015-02-11 02:23:16 +01:00
|
|
|
/// \brief See if the given exception handling personality function is one
|
|
|
|
/// that we understand. If so, return a description of it; otherwise return
|
|
|
|
/// Unknown.
|
2015-02-14 01:21:02 +01:00
|
|
|
EHPersonality classifyEHPersonality(const Value *Pers);
|
2015-02-11 02:23:16 +01:00
|
|
|
|
|
|
|
/// \brief Returns true if this personality function catches asynchronous
|
|
|
|
/// exceptions.
|
2015-03-12 01:36:20 +01:00
|
|
|
inline bool isAsynchronousEHPersonality(EHPersonality Pers) {
|
|
|
|
// The two SEH personality functions can catch asynch exceptions. We assume
|
|
|
|
// unknown personalities don't catch asynch exceptions.
|
|
|
|
switch (Pers) {
|
|
|
|
case EHPersonality::MSVC_X86SEH:
|
|
|
|
case EHPersonality::MSVC_Win64SEH:
|
|
|
|
return true;
|
|
|
|
default: return false;
|
|
|
|
}
|
|
|
|
llvm_unreachable("invalid enum");
|
|
|
|
}
|
|
|
|
|
2015-10-06 22:28:16 +02:00
|
|
|
/// \brief Returns true if this is a personality function that invokes
|
|
|
|
/// handler funclets (which must return to it).
|
|
|
|
inline bool isFuncletEHPersonality(EHPersonality Pers) {
|
2015-03-12 01:36:20 +01:00
|
|
|
switch (Pers) {
|
|
|
|
case EHPersonality::MSVC_CXX:
|
|
|
|
case EHPersonality::MSVC_X86SEH:
|
|
|
|
case EHPersonality::MSVC_Win64SEH:
|
2015-10-06 22:28:16 +02:00
|
|
|
case EHPersonality::CoreCLR:
|
2015-03-12 01:36:20 +01:00
|
|
|
return true;
|
|
|
|
default: return false;
|
|
|
|
}
|
|
|
|
llvm_unreachable("invalid enum");
|
|
|
|
}
|
2015-02-11 02:23:16 +01:00
|
|
|
|
2015-07-14 21:22:51 +02:00
|
|
|
/// \brief Return true if this personality may be safely removed if there
|
|
|
|
/// are no invoke instructions remaining in the current function.
|
|
|
|
inline bool isNoOpWithoutInvoke(EHPersonality Pers) {
|
|
|
|
switch (Pers) {
|
|
|
|
case EHPersonality::Unknown:
|
|
|
|
return false;
|
|
|
|
// All known personalities currently have this behavior
|
|
|
|
default: return true;
|
|
|
|
}
|
|
|
|
llvm_unreachable("invalid enum");
|
|
|
|
}
|
|
|
|
|
2015-06-17 22:52:32 +02:00
|
|
|
bool canSimplifyInvokeNoUnwind(const Function *F);
|
2015-01-28 02:17:38 +01:00
|
|
|
|
2008-05-07 20:21:13 +02:00
|
|
|
} // end namespace llvm
|
|
|
|
|
|
|
|
#endif
|