[llvm] [llvm-readobj] Dump callgraph section info for ELF (PR #157499)
James Henderson via llvm-commits
llvm-commits at lists.llvm.org
Mon Nov 24 00:32:17 PST 2025
================
@@ -8094,6 +8305,76 @@ template <class ELFT> void LLVMELFDumper<ELFT>::printCGProfile() {
}
}
+template <class ELFT> void LLVMELFDumper<ELFT>::printCallGraphInfo() {
+ if (!this->processCallGraphSection() || this->FuncCGInfos.empty()) {
+ return;
+ }
+
+ auto PrintNonRelocatableFuncSymbol = [&](uint64_t FuncEntryPC) {
+ SmallVector<std::string> FuncSymNames = this->getFunctionNames(FuncEntryPC);
+ if (!FuncSymNames.empty())
+ W.printList("Names", FuncSymNames);
+ W.printHex("Address", FuncEntryPC);
+ };
+
+ std::vector<Relocation<ELFT>> Relocations;
+ const Elf_Shdr *RelocSymTab = nullptr;
+ if (this->Obj.getHeader().e_type == ELF::ET_REL)
+ this->getCallGraphRelocations(Relocations, RelocSymTab);
+
+ auto PrintRelocatableFuncSymbol = [&](uint64_t RelocOffset) {
+ auto R = llvm::find_if(Relocations, [&](const Relocation<ELFT> &R) {
+ return R.Offset == RelocOffset;
+ });
+ if (R == Relocations.end()) {
+ this->reportUniqueWarning("unknown relocation at offset " +
+ Twine(RelocOffset));
+ return;
+ }
+ Expected<RelSymbol<ELFT>> RelSymOrErr =
+ this->getRelocationTarget(*R, RelocSymTab);
+ if (!RelSymOrErr) {
+ this->reportUniqueWarning(RelSymOrErr.takeError());
+ return;
+ }
+ if (!RelSymOrErr->Name.empty()) {
----------------
jh7370 wrote:
Unnecessary braces.
https://github.com/llvm/llvm-project/pull/157499
More information about the llvm-commits
mailing list