diff --git a/llvm/test/tools/gold/X86/disable-verify.ll b/llvm/test/tools/gold/X86/disable-verify.ll new file mode 100644 index 000000000000..b5518868664c --- /dev/null +++ b/llvm/test/tools/gold/X86/disable-verify.ll @@ -0,0 +1,25 @@ +; RUN: llvm-as %s -o %t.o +; REQUIRES: asserts + +; RUN: %gold -plugin %llvmshlibdir/LLVMgold.so \ +; RUN: --plugin-opt=disable-verify \ +; RUN: --plugin-opt=-debug-pass=Arguments \ +; RUN: -shared %t.o -o %t2.o 2>&1 | FileCheck %s + +; RUN: %gold -plugin %llvmshlibdir/LLVMgold.so \ +; RUN: --plugin-opt=-debug-pass=Arguments \ +; RUN: -shared %t.o -o %t2.o 2>&1 | FileCheck %s -check-prefix=VERIFY + +target triple = "x86_64-unknown-linux-gnu" + +; -disable-verify should disable output verification from the optimization +; pipeline. +; CHECK: Pass Arguments: {{.*}} -verify -ipsccp +; CHECK-NOT: -verify + +; VERIFY: Pass Arguments: {{.*}} -verify {{.*}} -verify + +define void @f() { +entry: + ret void +} diff --git a/llvm/tools/gold/gold-plugin.cpp b/llvm/tools/gold/gold-plugin.cpp index a917ecfa502e..14c42671b0df 100644 --- a/llvm/tools/gold/gold-plugin.cpp +++ b/llvm/tools/gold/gold-plugin.cpp @@ -94,6 +94,11 @@ namespace options { static OutputType TheOutputType = OT_NORMAL; static unsigned OptLevel = 2; static unsigned Parallelism = 1; +#ifdef NDEBUG + static bool DisableVerify = true; +#else + static bool DisableVerify = false; +#endif static std::string obj_path; static std::string extra_library_path; static std::string triple; @@ -134,6 +139,8 @@ namespace options { } else if (opt.startswith("jobs=")) { if (StringRef(opt_ + 5).getAsInteger(10, Parallelism)) message(LDPL_FATAL, "Invalid parallelism level: %s", opt_ + 5); + } else if (opt == "disable-verify") { + DisableVerify = true; } else { // Save this option to pass to the code generator. // ParseCommandLineOptions() expects argv[0] to be program name. Lazily @@ -730,8 +737,10 @@ static void runLTOPasses(Module &M, TargetMachine &TM) { PassManagerBuilder PMB; PMB.LibraryInfo = new TargetLibraryInfoImpl(Triple(TM.getTargetTriple())); PMB.Inliner = createFunctionInliningPass(); + // Unconditionally verify input since it is not verified before this + // point and has unknown origin. PMB.VerifyInput = true; - PMB.VerifyOutput = true; + PMB.VerifyOutput = !options::DisableVerify; PMB.LoopVectorize = true; PMB.SLPVectorize = true; PMB.OptLevel = options::OptLevel;