forked from OSchip/llvm-project
[PGO] Create weak alias for the renamed Comdat function
Add a weak alias to the renamed Comdat function in IR level instrumentation, using it's original name. This ensures the same behavior w/ and w/o IR instrumentation, even for non standard conforming code. Differential Revision: http://reviews.llvm.org/D25339 llvm-svn: 283490
This commit is contained in:
parent
c26d97401c
commit
0e79f7d11d
|
@ -439,9 +439,11 @@ template <class Edge, class BBInfo>
|
|||
void FuncPGOInstrumentation<Edge, BBInfo>::renameComdatFunction() {
|
||||
if (!canRenameComdat(F, ComdatMembers))
|
||||
return;
|
||||
std::string OrigName = F.getName().str();
|
||||
std::string NewFuncName =
|
||||
Twine(F.getName() + "." + Twine(FunctionHash)).str();
|
||||
F.setName(Twine(NewFuncName));
|
||||
GlobalAlias::create(GlobalValue::WeakAnyLinkage, OrigName, &F);
|
||||
FuncName = Twine(FuncName + "." + Twine(FunctionHash)).str();
|
||||
Comdat *NewComdat;
|
||||
Module *M = F.getParent();
|
||||
|
@ -467,7 +469,9 @@ void FuncPGOInstrumentation<Edge, BBInfo>::renameComdatFunction() {
|
|||
if (GlobalAlias *GA = dyn_cast<GlobalAlias>(CM.second)) {
|
||||
// For aliases, change the name directly.
|
||||
assert(dyn_cast<Function>(GA->getAliasee()->stripPointerCasts()) == &F);
|
||||
std::string OrigGAName = GA->getName().str();
|
||||
GA->setName(Twine(GA->getName() + "." + Twine(FunctionHash)));
|
||||
GlobalAlias::create(GlobalValue::WeakAnyLinkage, OrigGAName, GA);
|
||||
continue;
|
||||
}
|
||||
// Must be a function.
|
||||
|
|
|
@ -50,6 +50,12 @@ define linkonce_odr void @f_with_alias() comdat($f_with_alias) {
|
|||
|
||||
; Rename AvailableExternallyLinkage functions
|
||||
; ELFONLY-DAG: $aef.[[SINGLEBB_HASH]] = comdat any
|
||||
|
||||
; ELFONLY: @f = weak alias void (), void ()* @f.[[SINGLEBB_HASH]]
|
||||
; ELFONLY: @f_with_alias = weak alias void (), void ()* @f_with_alias.[[SINGLEBB_HASH]]
|
||||
; ELFONLY: @af = weak alias void (...), void (...)* @af.[[SINGLEBB_HASH]]
|
||||
; ELFONLY: @aef = weak alias void (), void ()* @aef.[[SINGLEBB_HASH]]
|
||||
|
||||
define available_externally void @aef() {
|
||||
; ELFONLY: define linkonce_odr void @aef.[[SINGLEBB_HASH]]() comdat {
|
||||
; COFFONLY: define available_externally void @aef() {
|
||||
|
|
Loading…
Reference in New Issue