[llvm] [BOLT][RISCV] Handle static IFUNC calls through .iplt (PR #207733)

Kito Cheng via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 24 20:23:18 PDT 2026


================
@@ -1904,6 +1937,25 @@ void RewriteInstance::createPLTBinaryFunction(uint64_t TargetAddress,
   else
     BF->addAlternativeName(Symbol->getName().str() + "@PLT");
   setPLTSymbol(BF, Symbol->getName());
+
+  // Keep RISC-V alias recovery local to the new path so the established x86
+  // and AArch64 PLT naming behavior remains unchanged.
+  if (BC->isRISCV() && Rel->isIRelative()) {
+    auto ResolverSyms = FileSymRefs.equal_range(Rel->Addend);
+    for (const SymbolRef &AliasSymbol : llvm::make_second_range(
+             llvm::make_range(ResolverSyms.first, ResolverSyms.second))) {
+      if (ELFSymbolRef(AliasSymbol).getELFType() != ELF::STT_GNU_IFUNC)
+        continue;
+      StringRef AliasName = cantFail(AliasSymbol.getName());
+      const std::string PLTName = AliasName.str() + "@PLT";
+      if (!BC->getBinaryDataByName(PLTName)) {
+        BF->addAlternativeName(PLTName);
+        BC->registerNameAtAddress(PLTName, EntryAddress, 0, EntrySize,
+                                  Section->getAlignment());
----------------
kito-cheng wrote:

This seems weird? should be `registerNameAtAddress(name, addr, size, alignment, flag)`, but your code like `registerNameAtAddress(name, addr, flag?, size, alignment)`

```
  MCSymbol *registerNameAtAddress(StringRef Name, uint64_t Address,
                                  uint64_t Size, uint16_t Alignment,
                                  unsigned Flags = 0);
```

https://github.com/llvm/llvm-project/blob/main/bolt/include/bolt/Core/BinaryContext.h#L1089-L1091

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


More information about the llvm-commits mailing list