diff options
| author | Rong Xu <xur@google.com> | 2016-10-06 20:38:13 +0000 |
|---|---|---|
| committer | Rong Xu <xur@google.com> | 2016-10-06 20:38:13 +0000 |
| commit | 0e79f7d11d6a76c8509554bde344d0270fea814d (patch) | |
| tree | 2741e609b578b92128fe2a4d7cae51e2d2d5ae0c | |
| parent | c26d97401c85386a8171cee3a45ee4dafd20de97 (diff) | |
| download | bcm5719-llvm-0e79f7d11d6a76c8509554bde344d0270fea814d.tar.gz bcm5719-llvm-0e79f7d11d6a76c8509554bde344d0270fea814d.zip | |
[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
| -rw-r--r-- | llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp | 4 | ||||
| -rw-r--r-- | llvm/test/Transforms/PGOProfile/comdat_rename.ll | 6 |
2 files changed, 10 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp b/llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp index 4d6a5048797..c2e42177661 100644 --- a/llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp +++ b/llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp @@ -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. diff --git a/llvm/test/Transforms/PGOProfile/comdat_rename.ll b/llvm/test/Transforms/PGOProfile/comdat_rename.ll index 63bb367fda2..b69c802093b 100644 --- a/llvm/test/Transforms/PGOProfile/comdat_rename.ll +++ b/llvm/test/Transforms/PGOProfile/comdat_rename.ll @@ -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() { |

