[llvm] [BOLT] Support instrumentation hook via DT_FINI_ARRAY (PR #67348)

Vladislav Khmelevsky via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 26 06:55:58 PDT 2023


================
@@ -1276,6 +1280,60 @@ void RewriteInstance::discoverFileObjects() {
   registerFragments();
 }
 
+Error RewriteInstance::discoverFiniAddress() {
+  // If FiniFunctionAddress is already set, we got if from DT_FINI. We use
+  // DT_FINI instead of DT_FINI_ARRAY if it's available.
+  if (BC->FiniFunctionAddress)
+    return Error::success();
+
+  if (BC->IsStaticExecutable)
+    return Error::success();
+
+  if (!BC->FiniArrayAddress || !BC->FiniArraySize) {
+    return createStringError(
+        std::errc::not_supported,
+        "Instrumentation needs either DT_FINI or DT_FINI_ARRAY");
+  }
+
+  if (*BC->FiniArraySize < BC->AsmInfo->getCodePointerSize()) {
+    return createStringError(std::errc::not_supported,
+                             "Need at least 1 DT_FINI_ARRAY slot");
+  }
+
+  ErrorOr<BinarySection &> FiniArraySection =
+      BC->getSectionForAddress(*BC->FiniArrayAddress);
+  if (auto EC = FiniArraySection.getError())
+    return errorCodeToError(EC);
+
+  BC->FiniArraySection = &*FiniArraySection;
+  const Relocation *FiniFunctionReloc =
+      FiniArraySection->getDynamicRelocationAt(0);
+
+  if (!FiniFunctionReloc) {
+    return createStringError(std::errc::not_supported,
----------------
yota9 wrote:

Maybe I'm loosing smth but for static relocation you might just use symbol, not the addend? 
BTW the same thing is possible to do with dynamic relocations too, I have it in my golang support patch, please check the very end if RewriteInstance.cpp https://reviews.llvm.org/D124347 , I add extra logic there so RELATIVE relocations might use symbols too, I think we might use it here so you won't have to patch it using the emitted address. If you'd like I can prepare this part of patch separately

https://github.com/llvm/llvm-project/pull/67348


More information about the llvm-commits mailing list