aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Utils/SampleProfileLoaderBaseUtil.cpp
diff options
context:
space:
mode:
authorRong Xu <xur@google.com>2021-06-15 21:31:27 -0700
committerRong Xu <xur@google.com>2021-06-15 21:51:04 -0700
commit82a0bb1afc2924a2457af574a83317a47659388a (patch)
tree837f133513569b2cdc00215320747600f80e60d9 /llvm/lib/Transforms/Utils/SampleProfileLoaderBaseUtil.cpp
parentbda1f2936e379e418156444d8d9f3fba2c60687c (diff)
downloadllvm-82a0bb1afc2924a2457af574a83317a47659388a.zip
llvm-82a0bb1afc2924a2457af574a83317a47659388a.tar.gz
llvm-82a0bb1afc2924a2457af574a83317a47659388a.tar.bz2
[SampleFDO] Place the discriminator flag variable into the used list.
We create flag variable "__llvm_fs_discriminator__" in the binary to indicate that FSAFDO hierarchical discriminators are used. This variable might be GC'ed by the linker since it is not explicitly reference. I initially added the var to the use list in pass MIRFSDiscriminator but it did not work. It turned out the used global list is collected in lowering (before MIR pass) and then emitted in the end of pass pipeline. Here I add the variable to the use list in IR level's AddDiscriminators pass. The machine level code is still keep in the case IR's AddDiscriminators is not invoked. If this is the case, this just use -Wl,--export-dynamic-symbol=__llvm_fs_discriminator__ to force the emit. Differential Revision: https://reviews.llvm.org/D103988
Diffstat (limited to 'llvm/lib/Transforms/Utils/SampleProfileLoaderBaseUtil.cpp')
-rw-r--r--llvm/lib/Transforms/Utils/SampleProfileLoaderBaseUtil.cpp14
1 files changed, 14 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/SampleProfileLoaderBaseUtil.cpp b/llvm/lib/Transforms/Utils/SampleProfileLoaderBaseUtil.cpp
index d2cd0de..6d995cf4 100644
--- a/llvm/lib/Transforms/Utils/SampleProfileLoaderBaseUtil.cpp
+++ b/llvm/lib/Transforms/Utils/SampleProfileLoaderBaseUtil.cpp
@@ -159,5 +159,19 @@ unsigned SampleCoverageTracker::computeCoverage(unsigned Used,
return Total > 0 ? Used * 100 / Total : 100;
}
+/// Create a global variable to flag FSDiscriminators are used.
+void createFSDiscriminatorVariable(Module *M) {
+ const char *FSDiscriminatorVar = "__llvm_fs_discriminator__";
+ if (M->getGlobalVariable(FSDiscriminatorVar))
+ return;
+
+ auto &Context = M->getContext();
+ // Place this variable to llvm.used so it won't be GC'ed.
+ appendToUsed(*M, {new GlobalVariable(*M, Type::getInt1Ty(Context), true,
+ GlobalValue::WeakODRLinkage,
+ ConstantInt::getTrue(Context),
+ FSDiscriminatorVar)});
+}
+
} // end of namespace sampleprofutil
} // end of namespace llvm