diff options
| -rw-r--r-- | llvm/lib/Support/Signals.cpp | 16 | ||||
| -rw-r--r-- | llvm/test/BugPoint/unsymbolized.ll | 21 | ||||
| -rw-r--r-- | llvm/tools/bugpoint/OptimizerDriver.cpp | 5 |
3 files changed, 35 insertions, 7 deletions
diff --git a/llvm/lib/Support/Signals.cpp b/llvm/lib/Support/Signals.cpp index 052a7424709..256a22dee87 100644 --- a/llvm/lib/Support/Signals.cpp +++ b/llvm/lib/Support/Signals.cpp @@ -26,15 +26,21 @@ #include "llvm/Support/Program.h" #include "llvm/Support/StringSaver.h" #include "llvm/Support/raw_ostream.h" +#include "llvm/Support/Options.h" #include <vector> -namespace llvm { - //===----------------------------------------------------------------------===// //=== WARNING: Implementation here must contain only TRULY operating system //=== independent code. //===----------------------------------------------------------------------===// +using namespace llvm; + +static cl::opt<bool> + DisableSymbolication("disable-symbolication", + cl::desc("Disable symbolizing crash backtraces."), + cl::init(false), cl::Hidden); + static ManagedStatic<std::vector<std::pair<void (*)(void *), void *>>> CallBacksToRun; void sys::RunSignalHandlers() { @@ -44,9 +50,6 @@ void sys::RunSignalHandlers() { I.first(I.second); CallBacksToRun->clear(); } -} - -using namespace llvm; static bool findModulesAndOffsets(void **StackTrace, int Depth, const char **Modules, intptr_t *Offsets, @@ -70,6 +73,9 @@ static bool printSymbolizedStackTrace(StringRef Argv0, static bool printSymbolizedStackTrace(StringRef Argv0, void **StackTrace, int Depth, llvm::raw_ostream &OS) { + if (DisableSymbolication) + return false; + // Don't recursively invoke the llvm-symbolizer binary. if (Argv0.find("llvm-symbolizer") != std::string::npos) return false; diff --git a/llvm/test/BugPoint/unsymbolized.ll b/llvm/test/BugPoint/unsymbolized.ll new file mode 100644 index 00000000000..8547f220ea2 --- /dev/null +++ b/llvm/test/BugPoint/unsymbolized.ll @@ -0,0 +1,21 @@ +; REQUIRES: loadable_module +; RUN: echo "import sys" > %t.py +; RUN: echo "print('args = ' + str(sys.argv))" >> %t.py +; RUN: echo "exit(1)" >> %t.py +; RUN: not bugpoint -load %llvmshlibdir/BugpointPasses%shlibext %s -output-prefix %t -bugpoint-crashcalls -opt-command="%python" -opt-args %t.py | FileCheck %s +; RUN: not --crash opt -load %llvmshlibdir/BugpointPasses%shlibext %s -bugpoint-crashcalls -disable-symbolication 2>&1 | FileCheck --check-prefix=CRASH %s + +; Test that bugpoint disables symbolication on the opt tool to reduce runtime overhead when opt crashes +; CHECK: args = {{.*}}'-disable-symbolication' + +; Test that opt, when it crashes & is passed -disable-symbolication, doesn't symbolicate. +; In theory this test should maybe be in test/tools/opt or +; test/Transforms, but since there doesn't seem to be another convenient way to +; crash opt, apart from the BugpointPasses dynamic plugin, this is the spot for +; now. +; CRASH-NOT: Signals.inc + +define void @f() { + call void @f() + ret void +} diff --git a/llvm/tools/bugpoint/OptimizerDriver.cpp b/llvm/tools/bugpoint/OptimizerDriver.cpp index ae3a31adaea..489e50b8810 100644 --- a/llvm/tools/bugpoint/OptimizerDriver.cpp +++ b/llvm/tools/bugpoint/OptimizerDriver.cpp @@ -202,10 +202,11 @@ bool BugDriver::runPasses(Module *Program, } else Args.push_back(tool.c_str()); - Args.push_back("-o"); - Args.push_back(OutputFilename.c_str()); for (unsigned i = 0, e = OptArgs.size(); i != e; ++i) Args.push_back(OptArgs[i].c_str()); + Args.push_back("-disable-symbolication"); + Args.push_back("-o"); + Args.push_back(OutputFilename.c_str()); std::vector<std::string> pass_args; for (unsigned i = 0, e = PluginLoader::getNumPlugins(); i != e; ++i) { pass_args.push_back(std::string("-load")); |

