[llvm] 57aeb30 - [JITLink][ELF] Don't skip debug info sections by default.

Lang Hames via llvm-commits llvm-commits at lists.llvm.org
Sat Mar 18 22:45:16 PDT 2023


Author: Lang Hames
Date: 2023-03-18T22:34:07-07:00
New Revision: 57aeb305460406f7b822cfe6ab9fb4d730fc3b38

URL: https://github.com/llvm/llvm-project/commit/57aeb305460406f7b822cfe6ab9fb4d730fc3b38
DIFF: https://github.com/llvm/llvm-project/commit/57aeb305460406f7b822cfe6ab9fb4d730fc3b38.diff

LOG: [JITLink][ELF] Don't skip debug info sections by default.

By default ELFLinkGraphBuilder will now create LinkGraph sections with NoAlloc
lifetime for debug info sections in the original object. Debug sections are not
kept alive by default, and will be dead-stripped unless some plugin marks them
as live in the pre-prune phase.

Added: 
    llvm/test/ExecutionEngine/JITLink/X86/ELF_debug_section_lifetime_is_NoAlloc.yaml

Modified: 
    llvm/lib/ExecutionEngine/JITLink/ELFLinkGraphBuilder.h

Removed: 
    llvm/test/ExecutionEngine/JITLink/X86/ELF_skip_debug_sections.s


################################################################################
diff  --git a/llvm/lib/ExecutionEngine/JITLink/ELFLinkGraphBuilder.h b/llvm/lib/ExecutionEngine/JITLink/ELFLinkGraphBuilder.h
index cd046057217f1..26feb8ea3277b 100644
--- a/llvm/lib/ExecutionEngine/JITLink/ELFLinkGraphBuilder.h
+++ b/llvm/lib/ExecutionEngine/JITLink/ELFLinkGraphBuilder.h
@@ -62,6 +62,14 @@ class ELFLinkGraphBuilder : public ELFLinkGraphBuilderBase {
                       StringRef FileName,
                       LinkGraph::GetEdgeKindNameFunction GetEdgeKindName);
 
+  /// Debug sections are included in the graph by default. Use
+  /// setProcessDebugSections(false) to ignore them if debug info is not
+  /// needed.
+  ELFLinkGraphBuilder &setProcessDebugSections(bool ProcessDebugSections) {
+    this->ProcessDebugSections = ProcessDebugSections;
+    return *this;
+  }
+
   /// Attempt to construct and return the LinkGraph.
   Expected<std::unique_ptr<LinkGraph>> buildGraph();
 
@@ -115,8 +123,7 @@ class ELFLinkGraphBuilder : public ELFLinkGraphBuilderBase {
   ///
   template <typename RelocHandlerMethod>
   Error forEachRelaRelocation(const typename ELFT::Shdr &RelSect,
-                              RelocHandlerMethod &&Func,
-                              bool ProcessDebugSections = false);
+                              RelocHandlerMethod &&Func);
 
   /// Traverse all matching ELFT::Rel relocation records in the given section.
   /// The handler function Func should be callable with this signature:
@@ -125,22 +132,19 @@ class ELFLinkGraphBuilder : public ELFLinkGraphBuilderBase {
   ///
   template <typename RelocHandlerMethod>
   Error forEachRelRelocation(const typename ELFT::Shdr &RelSect,
-                             RelocHandlerMethod &&Func,
-                             bool ProcessDebugSections = false);
+                             RelocHandlerMethod &&Func);
 
   /// Traverse all matching rela relocation records in the given section.
   /// Convenience wrapper to allow passing a member function for the handler.
   ///
   template <typename ClassT, typename RelocHandlerMethod>
   Error forEachRelaRelocation(const typename ELFT::Shdr &RelSect,
-                              ClassT *Instance, RelocHandlerMethod &&Method,
-                              bool ProcessDebugSections = false) {
+                              ClassT *Instance, RelocHandlerMethod &&Method) {
     return forEachRelaRelocation(
         RelSect,
         [Instance, Method](const auto &Rel, const auto &Target, auto &GS) {
           return (Instance->*Method)(Rel, Target, GS);
-        },
-        ProcessDebugSections);
+        });
   }
 
   /// Traverse all matching rel relocation records in the given section.
@@ -148,14 +152,12 @@ class ELFLinkGraphBuilder : public ELFLinkGraphBuilderBase {
   ///
   template <typename ClassT, typename RelocHandlerMethod>
   Error forEachRelRelocation(const typename ELFT::Shdr &RelSect,
-                             ClassT *Instance, RelocHandlerMethod &&Method,
-                             bool ProcessDebugSections = false) {
+                             ClassT *Instance, RelocHandlerMethod &&Method) {
     return forEachRelRelocation(
         RelSect,
         [Instance, Method](const auto &Rel, const auto &Target, auto &GS) {
           return (Instance->*Method)(Rel, Target, GS);
-        },
-        ProcessDebugSections);
+        });
   }
 
   const ELFFile &Obj;
@@ -163,6 +165,7 @@ class ELFLinkGraphBuilder : public ELFLinkGraphBuilderBase {
   typename ELFFile::Elf_Shdr_Range Sections;
   const typename ELFFile::Elf_Shdr *SymTabSec = nullptr;
   StringRef SectionStringTab;
+  bool ProcessDebugSections = true;
 
   // Maps ELF section indexes to LinkGraph Blocks.
   // Only SHF_ALLOC sections will have graph blocks.
@@ -318,7 +321,7 @@ template <typename ELFT> Error ELFLinkGraphBuilder<ELFT>::graphifySections() {
 
     // If the name indicates that it's a debug section then skip it: We don't
     // support those yet.
-    if (isDwarfSection(*Name)) {
+    if (!ProcessDebugSections && isDwarfSection(*Name)) {
       LLVM_DEBUG({
         dbgs() << "    " << SecIndex << ": \"" << *Name
                << "\" is a debug section: "
@@ -522,8 +525,7 @@ template <typename ELFT> Error ELFLinkGraphBuilder<ELFT>::graphifySymbols() {
 template <typename ELFT>
 template <typename RelocHandlerFunction>
 Error ELFLinkGraphBuilder<ELFT>::forEachRelaRelocation(
-    const typename ELFT::Shdr &RelSect, RelocHandlerFunction &&Func,
-    bool ProcessDebugSections) {
+    const typename ELFT::Shdr &RelSect, RelocHandlerFunction &&Func) {
   // Only look into sections that store relocation entries.
   if (RelSect.sh_type != ELF::SHT_RELA)
     return Error::success();
@@ -569,8 +571,7 @@ Error ELFLinkGraphBuilder<ELFT>::forEachRelaRelocation(
 template <typename ELFT>
 template <typename RelocHandlerFunction>
 Error ELFLinkGraphBuilder<ELFT>::forEachRelRelocation(
-    const typename ELFT::Shdr &RelSect, RelocHandlerFunction &&Func,
-    bool ProcessDebugSections) {
+    const typename ELFT::Shdr &RelSect, RelocHandlerFunction &&Func) {
   // Only look into sections that store relocation entries.
   if (RelSect.sh_type != ELF::SHT_REL)
     return Error::success();

diff  --git a/llvm/test/ExecutionEngine/JITLink/X86/ELF_debug_section_lifetime_is_NoAlloc.yaml b/llvm/test/ExecutionEngine/JITLink/X86/ELF_debug_section_lifetime_is_NoAlloc.yaml
new file mode 100644
index 0000000000000..0afcda467c326
--- /dev/null
+++ b/llvm/test/ExecutionEngine/JITLink/X86/ELF_debug_section_lifetime_is_NoAlloc.yaml
@@ -0,0 +1,195 @@
+# REQUIRES: asserts
+# RUN: yaml2obj -o %t.o %s
+# RUN: llvm-jitlink -debug-only=jitlink -noexec %t.o 2>&1 | FileCheck %s
+#
+# Check that debug sections get NoAlloc lifetimes.
+#
+# CHECK: ".debug_str" is not a SHF_ALLOC section. Using NoAlloc lifetime.
+# CHECK: ".debug_abbrev" is not a SHF_ALLOC section. Using NoAlloc lifetime.
+# CHECK: ".debug_info" is not a SHF_ALLOC section. Using NoAlloc lifetime.
+# CHECK: ".debug_line" is not a SHF_ALLOC section. Using NoAlloc lifetime.
+
+
+--- !ELF
+FileHeader:
+  Class:           ELFCLASS64
+  Data:            ELFDATA2LSB
+  Type:            ET_REL
+  Machine:         EM_X86_64
+  SectionHeaderStringTable: .strtab
+Sections:
+  - Name:            .text
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
+    AddressAlign:    0x10
+    Content:         B82A000000C3662E0F1F840000000000B82A000000C3
+  - Name:            .debug_abbrev
+    Type:            SHT_PROGBITS
+    AddressAlign:    0x1
+    Content:         011101250E1305030E10171B0E110112060000022E00110112064018974219030E3A0B3B0B271949133F190000032E01110112064018974219030E3A0B3B0B271949133F1900000405000218030E3A0B3B0B49130000052400030E3E0B0B0B0000060F004913000000
+  - Name:            .debug_info
+    Type:            SHT_PROGBITS
+    AddressAlign:    0x1
+    Content:         8C0000000400000000000801000000000C000000000000000000000000000000000000000000160000000200000000000000000600000001570000000001017700000003000000000000000006000000015700000000010577000000040155000000000105770000000401540000000001057E0000000005000000000504068300000006880000000500000000060100
+  - Name:            .comment
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_MERGE, SHF_STRINGS ]
+    AddressAlign:    0x1
+    EntSize:         0x1
+    Content:         00636C616E672076657273696F6E2031302E302E302D347562756E7475312000
+  - Name:            .note.GNU-stack
+    Type:            SHT_PROGBITS
+    AddressAlign:    0x1
+  - Name:            .debug_line
+    Type:            SHT_PROGBITS
+    AddressAlign:    0x1
+    Content:         58000000040036000000010101FB0E0D0001010101000000010000012F746D700000454C465F736B69705F64656275675F73656374696F6E732E63000100000000090200000000000000000105030A130500F505030A130206000101
+  - Name:            .eh_frame
+    Type:            SHT_X86_64_UNWIND
+    Flags:           [ SHF_ALLOC ]
+    AddressAlign:    0x8
+    Content:         1400000000000000017A5200017810011B0C070890010000100000001C0000000000000006000000000000001000000030000000000000000600000000000000
+  - Name:            .rela.debug_info
+    Type:            SHT_RELA
+    Flags:           [ SHF_INFO_LINK ]
+    Link:            .symtab
+    AddressAlign:    0x8
+    Info:            .debug_info
+    Relocations:
+      - Offset:          0x6
+        Symbol:          .debug_abbrev
+        Type:            R_X86_64_32
+      - Offset:          0xC
+        Symbol:          .debug_str
+        Type:            R_X86_64_32
+      - Offset:          0x12
+        Symbol:          .debug_str
+        Type:            R_X86_64_32
+        Addend:          31
+      - Offset:          0x16
+        Symbol:          .debug_line
+        Type:            R_X86_64_32
+      - Offset:          0x1A
+        Symbol:          .debug_str
+        Type:            R_X86_64_32
+        Addend:          57
+      - Offset:          0x1E
+        Symbol:          .text
+        Type:            R_X86_64_64
+      - Offset:          0x2B
+        Symbol:          .text
+        Type:            R_X86_64_64
+      - Offset:          0x39
+        Symbol:          .debug_str
+        Type:            R_X86_64_32
+        Addend:          62
+      - Offset:          0x44
+        Symbol:          .text
+        Type:            R_X86_64_64
+        Addend:          16
+      - Offset:          0x52
+        Symbol:          .debug_str
+        Type:            R_X86_64_32
+        Addend:          70
+      - Offset:          0x5F
+        Symbol:          .debug_str
+        Type:            R_X86_64_32
+        Addend:          75
+      - Offset:          0x6C
+        Symbol:          .debug_str
+        Type:            R_X86_64_32
+        Addend:          80
+      - Offset:          0x78
+        Symbol:          .debug_str
+        Type:            R_X86_64_32
+        Addend:          66
+      - Offset:          0x89
+        Symbol:          .debug_str
+        Type:            R_X86_64_32
+        Addend:          85
+  - Name:            .rela.debug_line
+    Type:            SHT_RELA
+    Flags:           [ SHF_INFO_LINK ]
+    Link:            .symtab
+    AddressAlign:    0x8
+    Info:            .debug_line
+    Relocations:
+      - Offset:          0x43
+        Symbol:          .text
+        Type:            R_X86_64_64
+  - Name:            .rela.eh_frame
+    Type:            SHT_RELA
+    Flags:           [ SHF_INFO_LINK ]
+    Link:            .symtab
+    AddressAlign:    0x8
+    Info:            .eh_frame
+    Relocations:
+      - Offset:          0x20
+        Symbol:          .text
+        Type:            R_X86_64_PC32
+      - Offset:          0x34
+        Symbol:          .text
+        Type:            R_X86_64_PC32
+        Addend:          16
+  - Name:            .llvm_addrsig
+    Type:            SHT_LLVM_ADDRSIG
+    Flags:           [ SHF_EXCLUDE ]
+    Link:            .symtab
+    AddressAlign:    0x1
+    Offset:          0x4C0
+    Symbols:         [  ]
+  - Type:            SectionHeaderTable
+    Sections:
+      - Name:            .strtab
+      - Name:            .text
+      - Name:            .debug_str
+      - Name:            .debug_abbrev
+      - Name:            .debug_info
+      - Name:            .rela.debug_info
+      - Name:            .comment
+      - Name:            .note.GNU-stack
+      - Name:            .debug_line
+      - Name:            .rela.debug_line
+      - Name:            .eh_frame
+      - Name:            .rela.eh_frame
+      - Name:            .llvm_addrsig
+      - Name:            .symtab
+Symbols:
+  - Name:            ELF_skip_debug_sections.c
+    Type:            STT_FILE
+    Index:           SHN_ABS
+  - Name:            .text
+    Type:            STT_SECTION
+    Section:         .text
+  - Name:            .debug_str
+    Type:            STT_SECTION
+    Section:         .debug_str
+  - Name:            .debug_abbrev
+    Type:            STT_SECTION
+    Section:         .debug_abbrev
+  - Name:            .debug_line
+    Type:            STT_SECTION
+    Section:         .debug_line
+  - Name:            foo
+    Type:            STT_FUNC
+    Section:         .text
+    Binding:         STB_GLOBAL
+    Size:            0x6
+  - Name:            main
+    Type:            STT_FUNC
+    Section:         .text
+    Binding:         STB_GLOBAL
+    Value:           0x10
+    Size:            0x6
+DWARF:
+  debug_str:
+    - 'clang version 10.0.0-4ubuntu1 '
+    - ELF_skip_debug_sections.c
+    - '/tmp'
+    - foo
+    - int
+    - main
+    - argc
+    - argv
+    - char
+...

diff  --git a/llvm/test/ExecutionEngine/JITLink/X86/ELF_skip_debug_sections.s b/llvm/test/ExecutionEngine/JITLink/X86/ELF_skip_debug_sections.s
deleted file mode 100644
index acd3ae7ad8b1f..0000000000000
--- a/llvm/test/ExecutionEngine/JITLink/X86/ELF_skip_debug_sections.s
+++ /dev/null
@@ -1,241 +0,0 @@
-# REQUIRES: asserts
-# RUN: llvm-mc -triple=x86_64-pc-linux-gnu -filetype=obj -o %t %s
-# RUN: llvm-jitlink -debug-only=jitlink -noexec %t 2>&1 | FileCheck %s
-#
-# Check that debug sections are not emitted.
-#
-# CHECK: ".debug_info" is a debug section: No graph section will be created.
-
-	.text
-	.file	"ELF_skip_debug_sections.c"
-	.globl	foo
-	.p2align	4, 0x90
-	.type	foo, at function
-foo:
-.Lfunc_begin0:
-	.file	1 "/tmp" "ELF_skip_debug_sections.c"
-	.loc	1 1 0
-	.cfi_startproc
-
-	.loc	1 2 3 prologue_end
-	movl	$42, %eax
-	retq
-.Ltmp0:
-.Lfunc_end0:
-	.size	foo, .Lfunc_end0-foo
-	.cfi_endproc
-
-	.globl	main
-	.p2align	4, 0x90
-	.type	main, at function
-main:
-.Lfunc_begin1:
-	.loc	1 5 0
-	.cfi_startproc
-
-
-
-	.loc	1 6 3 prologue_end
-	movl	$42, %eax
-	retq
-.Ltmp1:
-.Lfunc_end1:
-	.size	main, .Lfunc_end1-main
-	.cfi_endproc
-
-	.section	.debug_str,"MS", at progbits,1
-.Linfo_string0:
-	.asciz	"clang version 10.0.0-4ubuntu1 "
-.Linfo_string1:
-	.asciz	"ELF_skip_debug_sections.c"
-.Linfo_string2:
-	.asciz	"/tmp"
-.Linfo_string3:
-	.asciz	"foo"
-.Linfo_string4:
-	.asciz	"int"
-.Linfo_string5:
-	.asciz	"main"
-.Linfo_string6:
-	.asciz	"argc"
-.Linfo_string7:
-	.asciz	"argv"
-.Linfo_string8:
-	.asciz	"char"
-	.section	.debug_abbrev,"", at progbits
-	.byte	1
-	.byte	17
-	.byte	1
-	.byte	37
-	.byte	14
-	.byte	19
-	.byte	5
-	.byte	3
-	.byte	14
-	.byte	16
-	.byte	23
-	.byte	27
-	.byte	14
-	.byte	17
-	.byte	1
-	.byte	18
-	.byte	6
-	.byte	0
-	.byte	0
-	.byte	2
-	.byte	46
-	.byte	0
-	.byte	17
-	.byte	1
-	.byte	18
-	.byte	6
-	.byte	64
-	.byte	24
-	.ascii	"\227B"
-	.byte	25
-	.byte	3
-	.byte	14
-	.byte	58
-	.byte	11
-	.byte	59
-	.byte	11
-	.byte	39
-	.byte	25
-	.byte	73
-	.byte	19
-	.byte	63
-	.byte	25
-	.byte	0
-	.byte	0
-	.byte	3
-	.byte	46
-	.byte	1
-	.byte	17
-	.byte	1
-	.byte	18
-	.byte	6
-	.byte	64
-	.byte	24
-	.ascii	"\227B"
-	.byte	25
-	.byte	3
-	.byte	14
-	.byte	58
-	.byte	11
-	.byte	59
-	.byte	11
-	.byte	39
-	.byte	25
-	.byte	73
-	.byte	19
-	.byte	63
-	.byte	25
-	.byte	0
-	.byte	0
-	.byte	4
-	.byte	5
-	.byte	0
-	.byte	2
-	.byte	24
-	.byte	3
-	.byte	14
-	.byte	58
-	.byte	11
-	.byte	59
-	.byte	11
-	.byte	73
-	.byte	19
-	.byte	0
-	.byte	0
-	.byte	5
-	.byte	36
-	.byte	0
-	.byte	3
-	.byte	14
-	.byte	62
-	.byte	11
-	.byte	11
-	.byte	11
-	.byte	0
-	.byte	0
-	.byte	6
-	.byte	15
-	.byte	0
-	.byte	73
-	.byte	19
-	.byte	0
-	.byte	0
-	.byte	0
-	.section	.debug_info,"", at progbits
-.Lcu_begin0:
-	.long	.Ldebug_info_end0-.Ldebug_info_start0
-.Ldebug_info_start0:
-	.short	4
-	.long	.debug_abbrev
-	.byte	8
-	.byte	1
-	.long	.Linfo_string0
-	.short	12
-	.long	.Linfo_string1
-	.long	.Lline_table_start0
-	.long	.Linfo_string2
-	.quad	.Lfunc_begin0
-	.long	.Lfunc_end1-.Lfunc_begin0
-	.byte	2
-	.quad	.Lfunc_begin0
-	.long	.Lfunc_end0-.Lfunc_begin0
-	.byte	1
-	.byte	87
-
-	.long	.Linfo_string3
-	.byte	1
-	.byte	1
-
-	.long	119
-
-	.byte	3
-	.quad	.Lfunc_begin1
-	.long	.Lfunc_end1-.Lfunc_begin1
-	.byte	1
-	.byte	87
-
-	.long	.Linfo_string5
-	.byte	1
-	.byte	5
-
-	.long	119
-
-	.byte	4
-	.byte	1
-	.byte	85
-	.long	.Linfo_string6
-	.byte	1
-	.byte	5
-	.long	119
-	.byte	4
-	.byte	1
-	.byte	84
-	.long	.Linfo_string7
-	.byte	1
-	.byte	5
-	.long	126
-	.byte	0
-	.byte	5
-	.long	.Linfo_string4
-	.byte	5
-	.byte	4
-	.byte	6
-	.long	131
-	.byte	6
-	.long	136
-	.byte	5
-	.long	.Linfo_string8
-	.byte	6
-	.byte	1
-	.byte	0
-.Ldebug_info_end0:
-	.ident	"clang version 10.0.0-4ubuntu1 "
-	.section	".note.GNU-stack","", at progbits
-	.addrsig
-	.section	.debug_line,"", at progbits
-.Lline_table_start0:


        


More information about the llvm-commits mailing list