diff --git a/lib/LTO/LTOBackend.cpp b/lib/LTO/LTOBackend.cpp index 83282249ef4..1796d6ba60c 100644 --- a/lib/LTO/LTOBackend.cpp +++ b/lib/LTO/LTOBackend.cpp @@ -237,6 +237,12 @@ static void runNewPMPasses(const Config &Conf, Module &Mod, TargetMachine *TM, CGSCCAnalysisManager CGAM(Conf.DebugPassManager); ModuleAnalysisManager MAM(Conf.DebugPassManager); + std::unique_ptr TLII( + new TargetLibraryInfoImpl(Triple(TM->getTargetTriple()))); + if (Conf.Freestanding) + TLII->disableAllFunctions(); + FAM.registerPass([&] { return TargetLibraryAnalysis(*TLII); }); + // Register the AA manager first so that our version is the one used. FAM.registerPass([&] { return std::move(AA); }); @@ -302,6 +308,12 @@ static void runNewPMCustomPasses(const Config &Conf, Module &Mod, CGSCCAnalysisManager CGAM; ModuleAnalysisManager MAM; + std::unique_ptr TLII( + new TargetLibraryInfoImpl(Triple(TM->getTargetTriple()))); + if (Conf.Freestanding) + TLII->disableAllFunctions(); + FAM.registerPass([&] { return TargetLibraryAnalysis(*TLII); }); + // Register the AA manager first so that our version is the one used. FAM.registerPass([&] { return std::move(AA); }); @@ -335,6 +347,8 @@ static void runOldPMPasses(const Config &Conf, Module &Mod, TargetMachine *TM, PassManagerBuilder PMB; PMB.LibraryInfo = new TargetLibraryInfoImpl(Triple(TM->getTargetTriple())); + if (Conf.Freestanding) + PMB.LibraryInfo->disableAllFunctions(); PMB.Inliner = createFunctionInliningPass(); PMB.ExportSummary = ExportSummary; PMB.ImportSummary = ImportSummary; diff --git a/test/LTO/X86/tli-nobuiltin.ll b/test/LTO/X86/tli-nobuiltin.ll index 4f6b3ef63f4..a83e4219068 100644 --- a/test/LTO/X86/tli-nobuiltin.ll +++ b/test/LTO/X86/tli-nobuiltin.ll @@ -11,6 +11,31 @@ ; RUN: llvm-nm %t.o | FileCheck %s --check-prefix=LTO-FREESTANDING ; LTO-FREESTANDING: fprintf +; Test -lto-freestanding option for LTOBackend & legacy PM. + +; RUN: llvm-lto2 run -r %t.bc,_fprintf,px -r %t.bc,_hello_world,px -r %t.bc,_percent_s,px -r %t.bc,_foo,px %t.bc -o %t1.o 2>&1 +; RUN: llvm-nm %t1.o.0 | FileCheck %s --check-prefix=LTO + +; RUN: llvm-lto2 run -lto-freestanding -r %t.bc,_fprintf,px -r %t.bc,_hello_world,px -r %t.bc,_percent_s,px -r %t.bc,_foo,px %t.bc -o %t2.o 2>&1 +; RUN: llvm-nm %t2.o.0 | FileCheck %s --check-prefix=LTO-FREESTANDING + +; Test -lto-freestanding option for LTOBackend & new PM. + +; RUN: llvm-lto2 run -use-new-pm -r %t.bc,_fprintf,px -r %t.bc,_hello_world,px -r %t.bc,_percent_s,px -r %t.bc,_foo,px %t.bc -o %t1.o 2>&1 +; RUN: llvm-nm %t1.o.0 | FileCheck %s --check-prefix=LTO + +; RUN: llvm-lto2 run -use-new-pm -lto-freestanding -r %t.bc,_fprintf,px -r %t.bc,_hello_world,px -r %t.bc,_percent_s,px -r %t.bc,_foo,px %t.bc -o %t2.o 2>&1 +; RUN: llvm-nm %t2.o.0 | FileCheck %s --check-prefix=LTO-FREESTANDING + +; Test -lto-freestanding option for LTOBackend & new PM with custom pipeline. + +; RUN: llvm-lto2 run -use-new-pm -opt-pipeline='default' -r %t.bc,_fprintf,px -r %t.bc,_hello_world,px -r %t.bc,_percent_s,px -r %t.bc,_foo,px %t.bc -o %t1.o 2>&1 +; RUN: llvm-nm %t1.o.0 | FileCheck %s --check-prefix=LTO + +; RUN: llvm-lto2 run -use-new-pm -opt-pipeline='default' -lto-freestanding -r %t.bc,_fprintf,px -r %t.bc,_hello_world,px -r %t.bc,_percent_s,px -r %t.bc,_foo,px %t.bc -o %t2.o 2>&1 +; RUN: llvm-nm %t2.o.0 | FileCheck %s --check-prefix=LTO-FREESTANDING + + target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.11.0" diff --git a/tools/llvm-lto2/llvm-lto2.cpp b/tools/llvm-lto2/llvm-lto2.cpp index b84bfff8158..ca4278fafb8 100644 --- a/tools/llvm-lto2/llvm-lto2.cpp +++ b/tools/llvm-lto2/llvm-lto2.cpp @@ -158,6 +158,11 @@ static cl::list PassPlugins("load-pass-plugin", cl::desc("Load passes from plugin library")); +static cl::opt EnableFreestanding( + "lto-freestanding", + cl::desc("Enable Freestanding (disable builtins / TLI) during LTO"), + cl::init(false), cl::Hidden); + static void check(Error E, std::string Msg) { if (!E) return; @@ -269,6 +274,7 @@ static int run(int argc, char **argv) { Conf.OptLevel = OptLevel - '0'; Conf.UseNewPM = UseNewPM; + Conf.Freestanding = EnableFreestanding; for (auto &PluginFN : PassPlugins) Conf.PassPlugins.push_back(PluginFN); switch (CGOptLevel) {