InstrProf: Avoid creating profile names for symbols in system headers

We don't emit any coverage mapping for uncovered functions that come
from system headers, but we were creating a GlobalVariable with each
of their names. This is wasteful since the linker will need to dead
strip the unused symbols, and it can lead to issues when merging
coverage with others TUs that do have coverage for those functions.

llvm-svn: 226764
This commit is contained in:
Justin Bogner 2015-01-22 02:17:23 +00:00
parent e71fb5ce05
commit 00270df517
2 changed files with 22 additions and 2 deletions

View File

@ -732,8 +732,6 @@ CodeGenPGO::emitEmptyCounterMapping(const Decl *D, StringRef FuncName,
llvm::GlobalValue::LinkageTypes Linkage) {
if (SkipCoverageMapping)
return;
setFuncName(FuncName, Linkage);
// Don't map the functions inside the system headers
auto Loc = D->getBody()->getLocStart();
if (CGM.getContext().getSourceManager().isInSystemHeader(Loc))
@ -750,6 +748,7 @@ CodeGenPGO::emitEmptyCounterMapping(const Decl *D, StringRef FuncName,
if (CoverageMapping.empty())
return;
setFuncName(FuncName, Linkage);
CGM.getCoverageMapping()->addFunctionMappingRecord(
FuncNameVar, FuncName, FunctionHash, CoverageMapping);
}

View File

@ -0,0 +1,21 @@
// RUN: %clang_cc1 -fprofile-instr-generate -fcoverage-mapping -emit-llvm -o - %s | FileCheck %s
// Since foo is never emitted, there should not be a profile name for it.
// CHECK-NOT: @__llvm_profile_name_foo =
// CHECK: @__llvm_profile_name_bar =
// CHECK-NOT: @__llvm_profile_name_foo =
#ifdef IS_SYSHEADER
#pragma clang system_header
inline int foo() { return 0; }
#else
#define IS_SYSHEADER
#include __FILE__
int bar() { return 0; }
#endif