summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Support/CrashRecoveryContext.cpp13
-rw-r--r--lib/Transforms/IPO/GlobalDCE.cpp6
-rw-r--r--lib/Transforms/IPO/GlobalOpt.cpp7
-rw-r--r--lib/Transforms/Utils/CtorUtils.cpp6
4 files changed, 17 insertions, 15 deletions
diff --git a/lib/Support/CrashRecoveryContext.cpp b/lib/Support/CrashRecoveryContext.cpp
index a426377042..513875d4de 100644
--- a/lib/Support/CrashRecoveryContext.cpp
+++ b/lib/Support/CrashRecoveryContext.cpp
@@ -301,7 +301,7 @@ void CrashRecoveryContext::Disable() {
#endif
-bool CrashRecoveryContext::RunSafely(function_ref<void()> Fn) {
+bool CrashRecoveryContext::RunSafely(void (*Fn)(void*), void *UserData) {
// If crash recovery is disabled, do nothing.
if (gCrashRecoveryEnabled) {
assert(!Impl && "Crash recovery context already initialized!");
@@ -313,7 +313,7 @@ bool CrashRecoveryContext::RunSafely(function_ref<void()> Fn) {
}
}
- Fn();
+ Fn(UserData);
return true;
}
@@ -334,7 +334,8 @@ const std::string &CrashRecoveryContext::getBacktrace() const {
namespace {
struct RunSafelyOnThreadInfo {
- function_ref<void()> Fn;
+ void (*Fn)(void*);
+ void *Data;
CrashRecoveryContext *CRC;
bool Result;
};
@@ -343,11 +344,11 @@ struct RunSafelyOnThreadInfo {
static void RunSafelyOnThread_Dispatch(void *UserData) {
RunSafelyOnThreadInfo *Info =
reinterpret_cast<RunSafelyOnThreadInfo*>(UserData);
- Info->Result = Info->CRC->RunSafely(Info->Fn);
+ Info->Result = Info->CRC->RunSafely(Info->Fn, Info->Data);
}
-bool CrashRecoveryContext::RunSafelyOnThread(function_ref<void()> Fn,
+bool CrashRecoveryContext::RunSafelyOnThread(void (*Fn)(void*), void *UserData,
unsigned RequestedStackSize) {
- RunSafelyOnThreadInfo Info = { Fn, this, false };
+ RunSafelyOnThreadInfo Info = { Fn, UserData, this, false };
llvm_execute_on_thread(RunSafelyOnThread_Dispatch, &Info, RequestedStackSize);
if (CrashRecoveryContextImpl *CRC = (CrashRecoveryContextImpl *)Impl)
CRC->setSwitchedThread();
diff --git a/lib/Transforms/IPO/GlobalDCE.cpp b/lib/Transforms/IPO/GlobalDCE.cpp
index 9decddcff8..03b17d5238 100644
--- a/lib/Transforms/IPO/GlobalDCE.cpp
+++ b/lib/Transforms/IPO/GlobalDCE.cpp
@@ -54,16 +54,16 @@ namespace {
bool RemoveUnusedGlobalValue(GlobalValue &GV);
};
-}
/// Returns true if F contains only a single "ret" instruction.
-static bool isEmptyFunction(Function *F) {
+bool isEmptyFunction(void *Context, Function *F) {
BasicBlock &Entry = F->getEntryBlock();
if (Entry.size() != 1 || !isa<ReturnInst>(Entry.front()))
return false;
ReturnInst &RI = cast<ReturnInst>(Entry.front());
return RI.getReturnValue() == NULL;
}
+}
char GlobalDCE::ID = 0;
INITIALIZE_PASS(GlobalDCE, "globaldce",
@@ -75,7 +75,7 @@ bool GlobalDCE::runOnModule(Module &M) {
bool Changed = false;
// Remove empty functions from the global ctors list.
- Changed |= optimizeGlobalCtorsList(M, isEmptyFunction);
+ Changed |= optimizeGlobalCtorsList(M, isEmptyFunction, nullptr);
// Loop over the module, adding globals which are obviously necessary.
for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) {
diff --git a/lib/Transforms/IPO/GlobalOpt.cpp b/lib/Transforms/IPO/GlobalOpt.cpp
index a8471bacb4..3db0abf89f 100644
--- a/lib/Transforms/IPO/GlobalOpt.cpp
+++ b/lib/Transforms/IPO/GlobalOpt.cpp
@@ -3022,9 +3022,10 @@ bool GlobalOpt::runOnModule(Module &M) {
LocalChange |= OptimizeFunctions(M);
// Optimize global_ctors list.
- LocalChange |= optimizeGlobalCtorsList(M, [&](Function *F) {
- return EvaluateStaticConstructor(F, DL, TLI);
- });
+ LocalChange |= optimizeGlobalCtorsList(M, [](void *C, Function *F) -> bool {
+ GlobalOpt *self = static_cast<GlobalOpt *>(C);
+ return EvaluateStaticConstructor(F, self->DL, self->TLI);
+ }, this);
// Optimize non-address-taken globals.
LocalChange |= OptimizeGlobalVars(M);
diff --git a/lib/Transforms/Utils/CtorUtils.cpp b/lib/Transforms/Utils/CtorUtils.cpp
index 7cf793f626..0082df0121 100644
--- a/lib/Transforms/Utils/CtorUtils.cpp
+++ b/lib/Transforms/Utils/CtorUtils.cpp
@@ -132,8 +132,8 @@ GlobalVariable *findGlobalCtors(Module &M) {
/// Call "ShouldRemove" for every entry in M's global_ctor list and remove the
/// entries for which it returns true. Return true if anything changed.
-bool optimizeGlobalCtorsList(Module &M,
- function_ref<bool(Function *)> ShouldRemove) {
+bool optimizeGlobalCtorsList(Module &M, ShouldRemoveCtor ShouldRemove,
+ void *Context) {
GlobalVariable *GlobalCtors = findGlobalCtors(M);
if (!GlobalCtors)
return false;
@@ -163,7 +163,7 @@ bool optimizeGlobalCtorsList(Module &M,
continue;
// If we can evaluate the ctor at compile time, do.
- if (ShouldRemove(F)) {
+ if (ShouldRemove(Context, F)) {
Ctors.erase(Ctors.begin() + i);
MadeChange = true;
--i;