[llvm] [llvm-readobj] Dump callgraph section info for ELF (PR #157499)
James Henderson via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 19 02:27:34 PST 2025
================
@@ -5263,6 +5297,185 @@ template <class ELFT> void GNUELFDumper<ELFT>::printCGProfile() {
OS << "GNUStyle::printCGProfile not implemented\n";
}
+template <class ELFT>
+static std::optional<object::SectionRef>
+getCallGraphSection(const object::ELFObjectFile<ELFT> &ObjF) {
+ // Get the .llvm.callgraph section.
+ StringRef CallGraphSectionName(".llvm.callgraph");
+ for (auto Sec : ObjF.sections()) {
+ if (Expected<StringRef> NameOrErr = Sec.getName()) {
+ StringRef Name = *NameOrErr;
+ if (Name == CallGraphSectionName)
+ return Sec;
+ } else
+ consumeError(NameOrErr.takeError());
+ }
+ return std::nullopt;
+}
+
+namespace callgraph {
+LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE();
+enum Flags : uint8_t {
+ None = 0,
+ IsIndirectTarget = 1u << 0,
+ HasDirectCallees = 1u << 1,
+ HasIndirectCallees = 1u << 2,
+ LLVM_MARK_AS_BITMASK_ENUM(/*LargestValue*/ HasIndirectCallees)
+};
+} // namespace callgraph
+
+template <class ELFT> bool ELFDumper<ELFT>::processCallGraphSection() {
+ const Elf_Shdr *CGSection = findSectionByName(".llvm.callgraph");
+ if (!CGSection)
+ reportError(createError("No .llvm.callgraph section found."),
+ "Missing section");
+
+ Expected<ArrayRef<uint8_t>> SectionBytesOrErr =
+ Obj.getSectionContents(*CGSection);
+ if (!SectionBytesOrErr) {
+ reportError(SectionBytesOrErr.takeError(),
+ "Unable to read the .llvm.callgraph section");
+ }
+
+ auto PrintMalformedError = [&](Error &E, Twine FuncPC, StringRef Component) {
+ reportError(std::move(E),
+ Twine("While reading call graph info's [" + Component +
+ "] for function at [0x" + FuncPC + "]")
+ .str());
+ };
+
+ DataExtractor Data(SectionBytesOrErr.get(), Obj.isLE(),
----------------
jh7370 wrote:
Have you looked into using the `DataExtractor::Cursor` class? I think that would simplify some of your parsing logic below.
https://github.com/llvm/llvm-project/pull/157499
More information about the llvm-commits
mailing list