Skip to content

Commit 175c9af

Browse files
PrabhukLukacma
authored andcommitted
[llvm] Update call graph ELF section type. (llvm#164461)
Make call graph section to have a dedicated type instead of the generic progbits type.
1 parent d26d1b2 commit 175c9af

File tree

12 files changed

+47
-6
lines changed

12 files changed

+47
-6
lines changed

llvm/docs/Extensions.rst

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -601,6 +601,35 @@ sees fit (generally the section that would provide the best locality).
601601

602602
.. _CFI jump table: https://clang.llvm.org/docs/ControlFlowIntegrityDesign.html#forward-edge-cfi-for-indirect-function-calls
603603

604+
``SHT_LLVM_CALL_GRAPH`` Section (Call Graph)
605+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
606+
607+
This section is used to store the call graph. It has a type of
608+
``SHT_LLVM_CALL_GRAPH`` (0x6fff4c0f). Details of call graph section layout
609+
are described in :doc:`CallGraphSection`.
610+
611+
For example:
612+
613+
.. code-block:: gas
614+
615+
.section ".llvm.callgraph","",@llvm_call_graph
616+
.byte 0
617+
.byte 7
618+
.quad .Lball
619+
.quad 0
620+
.byte 3
621+
.quad foo
622+
.quad bar
623+
.quad baz
624+
.byte 3
625+
.quad 4524972987496481828
626+
.quad 3498816979441845844
627+
.quad 8646233951371320954
628+
629+
This indicates that ``ball`` calls ``foo``, ``bar`` and ``baz`` directly;
630+
``ball`` indirectly calls functions whose types are ``4524972987496481828``,
631+
``3498816979441845844`` and ``8646233951371320954``.
632+
604633
CodeView-Dependent
605634
------------------
606635

llvm/include/llvm/BinaryFormat/ELF.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1185,6 +1185,7 @@ enum : unsigned {
11851185
SHT_LLVM_LTO = 0x6fff4c0c, // .llvm.lto for fat LTO.
11861186
SHT_LLVM_JT_SIZES = 0x6fff4c0d, // LLVM jump tables sizes.
11871187
SHT_LLVM_CFI_JUMP_TABLE = 0x6fff4c0e, // LLVM CFI jump table.
1188+
SHT_LLVM_CALL_GRAPH = 0x6fff4c0f, // LLVM Call Graph Section.
11881189
// Android's experimental support for SHT_RELR sections.
11891190
// https://android.googlesource.com/platform/bionic/+/b7feec74547f84559a1467aca02708ff61346d2a/libc/include/elf.h#512
11901191
SHT_ANDROID_RELR = 0x6fffff00, // Relocation entries; only offsets.

llvm/lib/MC/MCAsmInfoELF.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,8 @@ void MCAsmInfoELF::printSwitchToSection(const MCSection &Section,
197197
OS << "llvm_jt_sizes";
198198
else if (Sec.Type == ELF::SHT_LLVM_CFI_JUMP_TABLE)
199199
OS << "llvm_cfi_jump_table";
200+
else if (Sec.Type == ELF::SHT_LLVM_CALL_GRAPH)
201+
OS << "llvm_call_graph";
200202
else
201203
OS << "0x" << Twine::utohexstr(Sec.Type);
202204

llvm/lib/MC/MCObjectFileInfo.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -554,7 +554,7 @@ void MCObjectFileInfo::initELFMCObjectFileInfo(const Triple &T, bool Large) {
554554
Ctx->getELFSection(".sframe", ELF::SHT_GNU_SFRAME, ELF::SHF_ALLOC);
555555

556556
CallGraphSection =
557-
Ctx->getELFSection(".llvm.callgraph", ELF::SHT_PROGBITS, 0);
557+
Ctx->getELFSection(".llvm.callgraph", ELF::SHT_LLVM_CALL_GRAPH, 0);
558558

559559
StackSizesSection = Ctx->getELFSection(".stack_sizes", ELF::SHT_PROGBITS, 0);
560560

@@ -1172,7 +1172,7 @@ MCObjectFileInfo::getCallGraphSection(const MCSection &TextSec) const {
11721172
}
11731173

11741174
return Ctx->getELFSection(
1175-
".llvm.callgraph", ELF::SHT_PROGBITS, Flags, 0, GroupName,
1175+
".llvm.callgraph", ELF::SHT_LLVM_CALL_GRAPH, Flags, 0, GroupName,
11761176
/*IsComdat=*/true, ElfSec.getUniqueID(),
11771177
static_cast<const MCSymbolELF *>(TextSec.getBeginSymbol()));
11781178
}

llvm/lib/MC/MCParser/ELFAsmParser.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -637,6 +637,8 @@ bool ELFAsmParser::parseSectionArguments(bool IsPush, SMLoc loc) {
637637
Type = ELF::SHT_LLVM_JT_SIZES;
638638
else if (TypeName == "llvm_cfi_jump_table")
639639
Type = ELF::SHT_LLVM_CFI_JUMP_TABLE;
640+
else if (TypeName == "llvm_call_graph")
641+
Type = ELF::SHT_LLVM_CALL_GRAPH;
640642
else if (TypeName.getAsInteger(0, Type))
641643
return TokError("unknown section type");
642644
}

llvm/lib/Object/ELF.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,7 @@ StringRef llvm::object::getELFSectionTypeName(uint32_t Machine, unsigned Type) {
322322
STRINGIFY_ENUM_CASE(ELF, SHT_LLVM_LTO);
323323
STRINGIFY_ENUM_CASE(ELF, SHT_LLVM_JT_SIZES)
324324
STRINGIFY_ENUM_CASE(ELF, SHT_LLVM_CFI_JUMP_TABLE)
325+
STRINGIFY_ENUM_CASE(ELF, SHT_LLVM_CALL_GRAPH);
325326
STRINGIFY_ENUM_CASE(ELF, SHT_GNU_SFRAME);
326327
STRINGIFY_ENUM_CASE(ELF, SHT_GNU_ATTRIBUTES);
327328
STRINGIFY_ENUM_CASE(ELF, SHT_GNU_HASH);

llvm/lib/ObjectYAML/ELFYAML.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -744,6 +744,7 @@ void ScalarEnumerationTraits<ELFYAML::ELF_SHT>::enumeration(
744744
ECase(SHT_LLVM_BB_ADDR_MAP);
745745
ECase(SHT_LLVM_OFFLOADING);
746746
ECase(SHT_LLVM_LTO);
747+
ECase(SHT_LLVM_CALL_GRAPH);
747748
ECase(SHT_GNU_SFRAME);
748749
ECase(SHT_GNU_ATTRIBUTES);
749750
ECase(SHT_GNU_HASH);

llvm/test/CodeGen/ARM/call-graph-section-addrtaken.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ entry:
2727
!1 = !{i64 0, !"_ZTSFivE.generalized"}
2828
!2 = !{i64 0, !"_ZTSFviE.generalized"}
2929

30-
; CHECK: .section .llvm.callgraph,"o",%progbits,.text
30+
; CHECK: .section .llvm.callgraph,"o",%llvm_call_graph,.text
3131
;; Version
3232
; CHECK-NEXT: .byte 0
3333
;; Flags -- Potential indirect target so LSB is set to 1. Other bits are 0.

llvm/test/CodeGen/ARM/call-graph-section-assembly.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ entry:
3636
!4 = !{!5}
3737
!5 = !{i64 0, !"_ZTSFPvS_E.generalized"}
3838

39-
; CHECK: .section .llvm.callgraph,"o",%progbits,.text
39+
; CHECK: .section .llvm.callgraph,"o",%llvm_call_graph,.text
4040
;; Version
4141
; CHECK-NEXT: .byte 0
4242
;; Flags

llvm/test/CodeGen/X86/call-graph-section-addrtaken.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ entry:
2727
!1 = !{i64 0, !"_ZTSFivE.generalized"}
2828
!2 = !{i64 0, !"_ZTSFviE.generalized"}
2929

30-
; CHECK: .section .llvm.callgraph,"o",@progbits,.text
30+
; CHECK: .section .llvm.callgraph,"o",@llvm_call_graph,.text
3131
;; Version
3232
; CHECK-NEXT: .byte 0
3333
;; Flags -- Potential indirect target so LSB is set to 1. Other bits are 0.

0 commit comments

Comments
 (0)