Pass -fprofile-sample-use to lto backends.

Summary: LTO backend will not invoke SampleProfileLoader pass even if -fprofile-sample-use is specified. This patch passes the flag down so that pass manager can add the SampleProfileLoader pass correctly.

Reviewers: mehdi_amini, tejohnson

Subscribers: cfe-commits

Differential Revision: https://reviews.llvm.org/D28588

llvm-svn: 291774
This commit is contained in:
Dehao Chen 2017-01-12 16:29:25 +00:00
parent 3d4cc68b8b
commit bd3689de91
2 changed files with 9 additions and 2 deletions

View File

@ -862,7 +862,8 @@ void EmitAssemblyHelper::EmitAssemblyWithNewPassManager(
} }
static void runThinLTOBackend(ModuleSummaryIndex *CombinedIndex, Module *M, static void runThinLTOBackend(ModuleSummaryIndex *CombinedIndex, Module *M,
std::unique_ptr<raw_pwrite_stream> OS) { std::unique_ptr<raw_pwrite_stream> OS,
std::string SampleProfile) {
StringMap<std::map<GlobalValue::GUID, GlobalValueSummary *>> StringMap<std::map<GlobalValue::GUID, GlobalValueSummary *>>
ModuleToDefinedGVSummaries; ModuleToDefinedGVSummaries;
CombinedIndex->collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries); CombinedIndex->collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries);
@ -930,6 +931,7 @@ static void runThinLTOBackend(ModuleSummaryIndex *CombinedIndex, Module *M,
return llvm::make_unique<lto::NativeObjectStream>(std::move(OS)); return llvm::make_unique<lto::NativeObjectStream>(std::move(OS));
}; };
lto::Config Conf; lto::Config Conf;
Conf.SampleProfile = SampleProfile;
if (Error E = thinBackend( if (Error E = thinBackend(
Conf, 0, AddStream, *M, *CombinedIndex, ImportList, Conf, 0, AddStream, *M, *CombinedIndex, ImportList,
ModuleToDefinedGVSummaries[M->getModuleIdentifier()], ModuleMap)) { ModuleToDefinedGVSummaries[M->getModuleIdentifier()], ModuleMap)) {
@ -965,7 +967,8 @@ void clang::EmitBackendOutput(DiagnosticsEngine &Diags,
// of an error). // of an error).
bool DoThinLTOBackend = CombinedIndex != nullptr; bool DoThinLTOBackend = CombinedIndex != nullptr;
if (DoThinLTOBackend) { if (DoThinLTOBackend) {
runThinLTOBackend(CombinedIndex.get(), M, std::move(OS)); runThinLTOBackend(CombinedIndex.get(), M, std::move(OS),
CGOpts.SampleProfileFile);
return; return;
} }
} }

View File

@ -8,6 +8,10 @@
; RUN: not %clang_cc1 -O2 -o %t1.o -x c %s -c -fthinlto-index=%t.thinlto.bc 2>&1 | FileCheck %s -check-prefix=CHECK-WARNING ; RUN: not %clang_cc1 -O2 -o %t1.o -x c %s -c -fthinlto-index=%t.thinlto.bc 2>&1 | FileCheck %s -check-prefix=CHECK-WARNING
; CHECK-WARNING: error: invalid argument '-fthinlto-index={{.*}}' only allowed with '-x ir' ; CHECK-WARNING: error: invalid argument '-fthinlto-index={{.*}}' only allowed with '-x ir'
; Ensure sample profile pass are passed to backend
; RUN: %clang -O2 -o %t4.o -x ir %t1.o -c -fthinlto-index=%t.thinlto.bc -fprofile-sample-use=%S/Inputs/pgo-sample.prof -mllvm -debug-pass=Structure 2>&1 | FileCheck %s -check-prefix=CHECK-SAMPLEPGO
; CHECK-SAMPLEPGO: Sample profile pass
; Ensure we get expected error for missing index file ; Ensure we get expected error for missing index file
; RUN: %clang -O2 -o %t4.o -x ir %t1.o -c -fthinlto-index=bad.thinlto.bc 2>&1 | FileCheck %s -check-prefix=CHECK-ERROR1 ; RUN: %clang -O2 -o %t4.o -x ir %t1.o -c -fthinlto-index=bad.thinlto.bc 2>&1 | FileCheck %s -check-prefix=CHECK-ERROR1
; CHECK-ERROR1: Error loading index file 'bad.thinlto.bc' ; CHECK-ERROR1: Error loading index file 'bad.thinlto.bc'