1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-26 04:32:44 +01:00

[PGO] Stop using invalid char in instr variable names.

Before the patch, -fprofile-instr-generate compile will fail
if no integrated-as is specified when the file contains
any static functions (the -S output is also invalid).

This is the second try. The fix in this patch is very localized.
Only profile symbol names of profile symbols with internal 
linkage are fixed up while initializer of name syms are not 
changes. This means there is no format change nor version bump.

llvm-svn: 255434
This commit is contained in:
Xinliang David Li 2015-12-12 17:28:03 +00:00
parent 3f624d4650
commit 9a2e877d9a
4 changed files with 30 additions and 10 deletions

View File

@ -102,6 +102,26 @@ std::string getPGOFuncName(const Function &F, uint64_t Version) {
Version); Version);
} }
// \p FuncName is the string used as profile lookup key for the function. A
// symbol is created to hold the name. Return the legalized symbol name.
static std::string getPGOFuncNameVarName(StringRef FuncName,
GlobalValue::LinkageTypes Linkage) {
std::string VarName = getInstrProfNameVarPrefix();
VarName += FuncName;
if (!GlobalValue::isLocalLinkage(Linkage))
return VarName;
// Now fix up illegal chars in local VarName that may upset the assembler.
const char *InvalidChars = "-:<>\"'";
size_t found = VarName.find_first_of(InvalidChars);
while (found != std::string::npos) {
VarName[found] = '_';
found = VarName.find_first_of(InvalidChars, found + 1);
}
return VarName;
}
GlobalVariable *createPGOFuncNameVar(Module &M, GlobalVariable *createPGOFuncNameVar(Module &M,
GlobalValue::LinkageTypes Linkage, GlobalValue::LinkageTypes Linkage,
StringRef FuncName) { StringRef FuncName) {
@ -120,7 +140,7 @@ GlobalVariable *createPGOFuncNameVar(Module &M,
auto *Value = ConstantDataArray::getString(M.getContext(), FuncName, false); auto *Value = ConstantDataArray::getString(M.getContext(), FuncName, false);
auto FuncNameVar = auto FuncNameVar =
new GlobalVariable(M, Value->getType(), true, Linkage, Value, new GlobalVariable(M, Value->getType(), true, Linkage, Value,
Twine(getInstrProfNameVarPrefix()) + FuncName); getPGOFuncNameVarName(FuncName, Linkage));
// Hide the symbol so that we correctly get a copy for each executable. // Hide the symbol so that we correctly get a copy for each executable.
if (!GlobalValue::isLocalLinkage(FuncNameVar->getLinkage())) if (!GlobalValue::isLocalLinkage(FuncNameVar->getLinkage()))

View File

@ -265,8 +265,8 @@ void InstrProfiling::lowerCoverageData(GlobalVariable *CoverageData) {
/// Get the name of a profiling variable for a particular function. /// Get the name of a profiling variable for a particular function.
static std::string getVarName(InstrProfIncrementInst *Inc, StringRef Prefix) { static std::string getVarName(InstrProfIncrementInst *Inc, StringRef Prefix) {
auto *Arr = cast<ConstantDataArray>(Inc->getName()->getInitializer()); StringRef NamePrefix = getInstrProfNameVarPrefix();
StringRef Name = Arr->isCString() ? Arr->getAsCString() : Arr->getAsString(); StringRef Name = Inc->getName()->getName().substr(NamePrefix.size());
return (Prefix + Name).str(); return (Prefix + Name).str();
} }

View File

@ -6,8 +6,8 @@ target triple = "x86_64-apple-macosx10.10.0"
; CHECK: @__llvm_profile_name_foo = hidden constant [3 x i8] c"foo", section "__DATA,__llvm_prf_names", align 1 ; CHECK: @__llvm_profile_name_foo = hidden constant [3 x i8] c"foo", section "__DATA,__llvm_prf_names", align 1
@__llvm_profile_name_bar = hidden constant [4 x i8] c"bar\00" @__llvm_profile_name_bar = hidden constant [4 x i8] c"bar\00"
; CHECK: @__llvm_profile_name_bar = hidden constant [4 x i8] c"bar\00", section "__DATA,__llvm_prf_names", align 1 ; CHECK: @__llvm_profile_name_bar = hidden constant [4 x i8] c"bar\00", section "__DATA,__llvm_prf_names", align 1
@baz_prof_name = hidden constant [3 x i8] c"baz" @__llvm_profile_name_baz = hidden constant [3 x i8] c"baz"
; CHECK: @baz_prof_name = hidden constant [3 x i8] c"baz", section "__DATA,__llvm_prf_names", align 1 ; CHECK: @__llvm_profile_name_baz = hidden constant [3 x i8] c"baz", section "__DATA,__llvm_prf_names", align 1
; CHECK: @__llvm_profile_counters_foo = hidden global [1 x i64] zeroinitializer, section "__DATA,__llvm_prf_cnts", align 8 ; CHECK: @__llvm_profile_counters_foo = hidden global [1 x i64] zeroinitializer, section "__DATA,__llvm_prf_cnts", align 8
; CHECK: @__llvm_profile_data_foo = hidden {{.*}}, section "__DATA,__llvm_prf_data", align 8 ; CHECK: @__llvm_profile_data_foo = hidden {{.*}}, section "__DATA,__llvm_prf_data", align 8
@ -26,9 +26,9 @@ define void @bar() {
; CHECK: @__llvm_profile_counters_baz = hidden global [3 x i64] zeroinitializer, section "__DATA,__llvm_prf_cnts", align 8 ; CHECK: @__llvm_profile_counters_baz = hidden global [3 x i64] zeroinitializer, section "__DATA,__llvm_prf_cnts", align 8
; CHECK: @__llvm_profile_data_baz = hidden {{.*}}, section "__DATA,__llvm_prf_data", align 8 ; CHECK: @__llvm_profile_data_baz = hidden {{.*}}, section "__DATA,__llvm_prf_data", align 8
define void @baz() { define void @baz() {
call void @llvm.instrprof.increment(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @baz_prof_name, i32 0, i32 0), i64 0, i32 3, i32 0) call void @llvm.instrprof.increment(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @__llvm_profile_name_baz, i32 0, i32 0), i64 0, i32 3, i32 0)
call void @llvm.instrprof.increment(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @baz_prof_name, i32 0, i32 0), i64 0, i32 3, i32 1) call void @llvm.instrprof.increment(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @__llvm_profile_name_baz, i32 0, i32 0), i64 0, i32 3, i32 1)
call void @llvm.instrprof.increment(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @baz_prof_name, i32 0, i32 0), i64 0, i32 3, i32 2) call void @llvm.instrprof.increment(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @__llvm_profile_name_baz, i32 0, i32 0), i64 0, i32 3, i32 2)
ret void ret void
} }

View File

@ -5,7 +5,7 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu" target triple = "x86_64-unknown-linux-gnu"
; GEN: @__llvm_profile_name_test_criticalEdge = private constant [17 x i8] c"test_criticalEdge" ; GEN: @__llvm_profile_name_test_criticalEdge = private constant [17 x i8] c"test_criticalEdge"
; GEN: @"__llvm_profile_name_<stdin>:bar" = private constant [11 x i8] c"<stdin>:bar" ; GEN: @__llvm_profile_name__stdin__bar = private constant [11 x i8] c"<stdin>:bar"
define i32 @test_criticalEdge(i32 %i, i32 %j) { define i32 @test_criticalEdge(i32 %i, i32 %j) {
entry: entry:
@ -99,7 +99,7 @@ return:
define internal i32 @bar(i32 %i) { define internal i32 @bar(i32 %i) {
entry: entry:
; GEN: call void @llvm.instrprof.increment(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @"__llvm_profile_name_<stdin>:bar", i32 0, i32 0), i64 12884901887, i32 1, i32 0) ; GEN: call void @llvm.instrprof.increment(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @__llvm_profile_name__stdin__bar, i32 0, i32 0), i64 12884901887, i32 1, i32 0)
ret i32 %i ret i32 %i
} }