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

Vladislav Khmelevsky via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 3 07:35:16 PDT 2023


================
@@ -1276,6 +1282,68 @@ void RewriteInstance::discoverFileObjects() {
   registerFragments();
 }
 
+Error RewriteInstance::discoverRtFiniAddress() {
+  // 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->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;
+
+  if (const Relocation *Reloc = FiniArraySection->getDynamicRelocationAt(0)) {
+    BC->FiniFunctionAddress = Reloc->Addend;
+    return Error::success();
+  }
+
+  if (const Relocation *Reloc = FiniArraySection->getRelocationAt(0)) {
+    BC->FiniFunctionAddress = Reloc->Value;
+    return Error::success();
+  }
+
+  return createStringError(std::errc::not_supported,
+                           "No relocation for first DT_FINI_ARRAY slot");
+}
+
+void RewriteInstance::updateRtFiniReloc() {
+  if (!BC->FiniArraySection)
----------------
yota9 wrote:

To be honest I don't really like FiniArraySection variable. First of all it is a bit confusing, since we might have fini array section, but we don't set it since we found DT_FINI to use instead. Renaming it for RT purposes seems to be not the best solution too. Please consider adding optional pointer argument for discoverRtFiniAddress to get the FiniArraySection if needed or returning tuple for example, checking both return value and the arg != nullptr,  it seems to be more straightforward solution to me, what do you think? 

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


More information about the llvm-commits mailing list