[llvm] e717f91 - Revert "[Debuginfo][llvm-dwarfutil] llvm-dwarfutil dsymutil-like tool for ELF."
Alexey Lapshin via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 19 02:18:16 PDT 2022
Author: Alexey Lapshin
Date: 2022-07-19T12:17:47+03:00
New Revision: e717f91c96b5b046a34a823b44b21268c1c5fee1
URL: https://github.com/llvm/llvm-project/commit/e717f91c96b5b046a34a823b44b21268c1c5fee1
DIFF: https://github.com/llvm/llvm-project/commit/e717f91c96b5b046a34a823b44b21268c1c5fee1.diff
LOG: Revert "[Debuginfo][llvm-dwarfutil] llvm-dwarfutil dsymutil-like tool for ELF."
This reverts commit e2147c26bd1522ad67a98836fbe94933eab869bb.
Added:
Modified:
llvm/include/llvm/DWARFLinker/DWARFLinkerCompileUnit.h
llvm/lib/DWARFLinker/DWARFLinker.cpp
llvm/lib/DWARFLinker/DWARFLinkerCompileUnit.cpp
llvm/test/CMakeLists.txt
llvm/test/lit.cfg.py
Removed:
llvm/docs/CommandGuide/llvm-dwarfutil.rst
llvm/test/tools/llvm-dwarfutil/ELF/Inputs/common.yaml
llvm/test/tools/llvm-dwarfutil/ELF/copy-itself.test
llvm/test/tools/llvm-dwarfutil/ELF/copy.test
llvm/test/tools/llvm-dwarfutil/ELF/error-separate-file-stdout.test
llvm/test/tools/llvm-dwarfutil/ELF/error-unsupported-input-file.test
llvm/test/tools/llvm-dwarfutil/ELF/gc-bfd.test
llvm/test/tools/llvm-dwarfutil/ELF/gc-class.test
llvm/test/tools/llvm-dwarfutil/ELF/gc-default.test
llvm/test/tools/llvm-dwarfutil/ELF/gc-exec.test
llvm/test/tools/llvm-dwarfutil/ELF/gc-maxpc.test
llvm/test/tools/llvm-dwarfutil/ELF/gc-no-garbage.test
llvm/test/tools/llvm-dwarfutil/ELF/odr-fwd-declaration.test
llvm/test/tools/llvm-dwarfutil/ELF/separate-debug-file.test
llvm/test/tools/llvm-dwarfutil/ELF/verbose.test
llvm/test/tools/llvm-dwarfutil/ELF/verify.test
llvm/test/tools/llvm-dwarfutil/error-invalid-format.test
llvm/test/tools/llvm-dwarfutil/error-no-gc-odr.test
llvm/test/tools/llvm-dwarfutil/error-no-input-file.test
llvm/test/tools/llvm-dwarfutil/error-positional-args.test
llvm/test/tools/llvm-dwarfutil/error-unknown-option.test
llvm/test/tools/llvm-dwarfutil/error-unknown-tombstone.test
llvm/test/tools/llvm-dwarfutil/help.test
llvm/tools/llvm-dwarfutil/CMakeLists.txt
llvm/tools/llvm-dwarfutil/DebugInfoLinker.cpp
llvm/tools/llvm-dwarfutil/DebugInfoLinker.h
llvm/tools/llvm-dwarfutil/Error.h
llvm/tools/llvm-dwarfutil/Options.h
llvm/tools/llvm-dwarfutil/Options.td
llvm/tools/llvm-dwarfutil/llvm-dwarfutil.cpp
################################################################################
diff --git a/llvm/docs/CommandGuide/llvm-dwarfutil.rst b/llvm/docs/CommandGuide/llvm-dwarfutil.rst
deleted file mode 100644
index a939fd4a29335..0000000000000
--- a/llvm/docs/CommandGuide/llvm-dwarfutil.rst
+++ /dev/null
@@ -1,123 +0,0 @@
-llvm-dwarfutil - A tool to copy and manipulate debug info
-=========================================================
-
-.. program:: llvm-dwarfutil
-
-SYNOPSIS
---------
-
-:program:`llvm-dwarfutil` [*options*] *input* *output*
-
-DESCRIPTION
------------
-
-:program:`llvm-dwarfutil` is a tool to copy and manipulate debug info.
-
-In basic usage, it makes a semantic copy of the input to the output. If any
-options are specified, the output may be modified along the way, e.g.
-by removing unused debug info.
-
-If "-" is specified for the input file, the input is read from the program's
-standard input stream. If "-" is specified for the output file, the output
-is written to the standard output stream of the program.
-
-The tool is still in active development.
-
-COMMAND-LINE OPTIONS
---------------------
-
-.. option:: --garbage-collection
-
- Removes pieces of debug information related to discarded sections.
- When the linker does section garbage collection the abandoned debug info
- is left behind. Such abandoned debug info references address ranges using
- tombstone values. Thus, when this option is specified, the tool removes
- debug info which is marked with the tombstone value.
-
- That option is enabled by default.
-
-.. option:: --odr-deduplication
-
- Remove duplicated types (if "One Definition Rule" is supported by source
- language). Keeps first type definition and removes other definitions,
- potentially significantly reducing the size of output debug info.
-
- That option is enabled by default.
-
-.. option:: --help, -h
-
- Print a summary of command line options.
-
-.. option:: --no-garbage-collection
-
- Disable :option:`--garbage-collection`.
-
-.. option:: --no-odr-deduplication
-
- Disable :option:`--odr-deduplication`.
-
-.. option:: --no-separate-debug-file
-
- Disable :option:`--separate-debug-file`.
-
-.. option:: --num-threads=<n>, -j
-
- Specifies the maximum number (`n`) of simultaneous threads to use
- for processing.
-
-.. option:: --separate-debug-file
-
- Generate separate file containing output debug info. Using
- :program:`llvm-dwarfutil` with that option equals to the
- following set of commands:
-
-.. code-block:: console
-
- :program:`llvm-objcopy` --only-keep-debug in-file out-file.debug
- :program:`llvm-objcopy` --strip-debug in-file out-file
- :program:`llvm-objcopy` --add-gnu-debuglink=out-file.debug out-file
-
-.. option:: --tombstone=<value>
-
- <value> can be one of the following values:
-
- - `bfd`: zero for all addresses and [1,1] for DWARF v4 (or less) address
- ranges.
-
- - `maxpc`: -1 for all addresses and -2 for DWARF v4 (or less) address ranges.
-
- - `universal`: both `bfd` and `maxpc`.
-
- - `exec`: match with address ranges of executable sections.
-
- The value `universal` is used by default.
-
-.. option:: --verbose
-
- Enable verbose logging. This option disables multi-thread mode.
-
-.. option:: --verify
-
- Run the DWARF verifier on the output DWARF debug info.
-
-.. option:: --version
-
- Print the version of this program.
-
-SUPPORTED FORMATS
------------------
-
-The following formats are currently supported by :program:`llvm-dwarfutil`:
-
-ELF
-
-EXIT STATUS
------------
-
-:program:`llvm-dwarfutil` exits with a non-zero exit code if there is an error.
-Otherwise, it exits with code 0.
-
-BUGS
-----
-
-To report bugs, please visit <https://github.com/llvm/llvm-project/labels/tools:llvm-dwarfutil/>.
diff --git a/llvm/include/llvm/DWARFLinker/DWARFLinkerCompileUnit.h b/llvm/include/llvm/DWARFLinker/DWARFLinkerCompileUnit.h
index 930db0913226a..788275782235c 100644
--- a/llvm/include/llvm/DWARFLinker/DWARFLinkerCompileUnit.h
+++ b/llvm/include/llvm/DWARFLinker/DWARFLinkerCompileUnit.h
@@ -182,10 +182,6 @@ class CompileUnit {
/// offset \p PCOffset.
void addFunctionRange(uint64_t LowPC, uint64_t HighPC, int64_t PCOffset);
- /// Check whether specified address range \p LowPC \p HighPC
- /// overlaps with existing function ranges.
- bool overlapsWithFunctionRanges(uint64_t LowPC, uint64_t HighPC);
-
/// Keep track of a DW_AT_range attribute that we will need to patch up later.
void noteRangeAttribute(const DIE &Die, PatchLocation Attr);
diff --git a/llvm/lib/DWARFLinker/DWARFLinker.cpp b/llvm/lib/DWARFLinker/DWARFLinker.cpp
index 47cce9ed67778..298359dea9af5 100644
--- a/llvm/lib/DWARFLinker/DWARFLinker.cpp
+++ b/llvm/lib/DWARFLinker/DWARFLinker.cpp
@@ -505,19 +505,6 @@ unsigned DWARFLinker::shouldKeepSubprogramDIE(
return Flags;
}
- // TODO: Following check is a workaround for overlapping address ranges.
- // ELF binaries built with LTO might contain overlapping address
- // ranges. The better fix would be to combine such ranges. Following
- // is a workaround that should be removed when a good fix is done.
- if (Unit.overlapsWithFunctionRanges(*LowPc, *HighPc)) {
- reportWarning(
- formatv("Overlapping address range [{0:X}, {1:X}]. Range will "
- "be discarded.\n",
- *LowPc, *HighPc),
- File, &DIE);
- return Flags;
- }
-
// Replace the debug map range with a more accurate one.
Ranges[*LowPc] = ObjFileAddressRange(*HighPc, MyInfo.AddrAdjust);
Unit.addFunctionRange(*LowPc, *HighPc, MyInfo.AddrAdjust);
diff --git a/llvm/lib/DWARFLinker/DWARFLinkerCompileUnit.cpp b/llvm/lib/DWARFLinker/DWARFLinkerCompileUnit.cpp
index ebb1106521cc6..e9e8be7fd0083 100644
--- a/llvm/lib/DWARFLinker/DWARFLinkerCompileUnit.cpp
+++ b/llvm/lib/DWARFLinker/DWARFLinkerCompileUnit.cpp
@@ -114,10 +114,6 @@ void CompileUnit::addFunctionRange(uint64_t FuncLowPc, uint64_t FuncHighPc,
this->HighPc = std::max(HighPc, FuncHighPc + PcOffset);
}
-bool CompileUnit::overlapsWithFunctionRanges(uint64_t LowPC, uint64_t HighPC) {
- return Ranges.overlaps(LowPC, HighPC);
-}
-
void CompileUnit::noteRangeAttribute(const DIE &Die, PatchLocation Attr) {
if (Die.getTag() != dwarf::DW_TAG_compile_unit)
RangeAttributes.push_back(Attr);
diff --git a/llvm/test/CMakeLists.txt b/llvm/test/CMakeLists.txt
index 86ca20ada7b80..b94681f54b7a7 100644
--- a/llvm/test/CMakeLists.txt
+++ b/llvm/test/CMakeLists.txt
@@ -83,7 +83,6 @@ set(LLVM_TEST_DEPENDS
llvm-dlltool
dsymutil
llvm-dwarfdump
- llvm-dwarfutil
llvm-dwp
llvm-exegesis
llvm-extract
diff --git a/llvm/test/lit.cfg.py b/llvm/test/lit.cfg.py
index 93db320610dcb..97079af853a56 100644
--- a/llvm/test/lit.cfg.py
+++ b/llvm/test/lit.cfg.py
@@ -160,8 +160,8 @@ def get_asan_rtlib():
'dsymutil', 'lli', 'lli-child-target', 'llvm-ar', 'llvm-as',
'llvm-addr2line', 'llvm-bcanalyzer', 'llvm-bitcode-strip', 'llvm-config',
'llvm-cov', 'llvm-cxxdump', 'llvm-cvtres', 'llvm-debuginfod-find', 'llvm-debuginfod',
- 'llvm-
diff ', 'llvm-dis', 'llvm-dwarfdump', 'llvm-dwarfutil', 'llvm-dlltool',
- 'llvm-exegesis', 'llvm-extract', 'llvm-isel-fuzzer', 'llvm-ifs',
+ 'llvm-
diff ', 'llvm-dis', 'llvm-dwarfdump', 'llvm-dlltool', 'llvm-exegesis',
+ 'llvm-extract', 'llvm-isel-fuzzer', 'llvm-ifs',
'llvm-install-name-tool', 'llvm-jitlink', 'llvm-opt-fuzzer', 'llvm-lib',
'llvm-link', 'llvm-lto', 'llvm-lto2', 'llvm-mc', 'llvm-mca',
'llvm-modextract', 'llvm-nm', 'llvm-objcopy', 'llvm-objdump', 'llvm-otool',
diff --git a/llvm/test/tools/llvm-dwarfutil/ELF/Inputs/common.yaml b/llvm/test/tools/llvm-dwarfutil/ELF/Inputs/common.yaml
deleted file mode 100644
index 0bfe09056ed50..0000000000000
--- a/llvm/test/tools/llvm-dwarfutil/ELF/Inputs/common.yaml
+++ /dev/null
@@ -1,137 +0,0 @@
---- !ELF
-FileHeader:
- Class: ELFCLASS64
- Data: ELFDATA2LSB
- Type: ET_REL
- Machine: EM_X86_64
-Sections:
- - Name: .text
- Type: SHT_PROGBITS
- Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
- Address: 0x1000
- Size: 0x1b
-DWARF:
- debug_abbrev:
- - Table:
- - Tag: DW_TAG_compile_unit
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_producer
- Form: DW_FORM_string
- - Attribute: DW_AT_language
- Form: DW_FORM_data2
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_low_pc
- Form: DW_FORM_addr
- - Attribute: DW_AT_high_pc
- Form: DW_FORM_data8
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Tag: DW_TAG_member
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_declaration
- Form: DW_FORM_flag_present
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_declaration
- Form: DW_FORM_flag_present
- - Tag: DW_TAG_template_type_parameter
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- - Tag: DW_TAG_base_type
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Tag: DW_TAG_pointer_type
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- - Tag: DW_TAG_variable
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_const_value
- Form: DW_FORM_data4
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- - Tag: DW_TAG_subprogram
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_low_pc
- Form: DW_FORM_addr
- - Attribute: DW_AT_high_pc
- Form: DW_FORM_data8
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- debug_info:
- - Version: 4
- Entries:
- - AbbrCode: 1
- Values:
- - CStr: by_hand
- - Value: 0x04
- - CStr: CU1
- - Value: 0x1000
- - Value: 0x1b
- - AbbrCode: 2
- Values:
- - CStr: class1
- - AbbrCode: 3
- Values:
- - Value: 0x00000052
- - CStr: member1
- - AbbrCode: 3
- Values:
- - Value: 0x00000058
- - CStr: member2
- - AbbrCode: 0
- - AbbrCode: 7
- Values:
- - CStr: int
- - AbbrCode: 7
- Values:
- - CStr: char
- - AbbrCode: 7
- Values:
- - CStr: float
- - AbbrCode: 8
- Values:
- - Value: 0x0000002a
- - AbbrCode: 9
- Values:
- - CStr: var1
- - Value: 0x00000000
- - Value: 0x0000005f
- - AbbrCode: 10
- Values:
- - CStr: foo1
- - Value: 0x1000
- - Value: 0x10
- - Value: 0x0000002a
- - AbbrCode: 0
- - AbbrCode: 0
-...
diff --git a/llvm/test/tools/llvm-dwarfutil/ELF/copy-itself.test b/llvm/test/tools/llvm-dwarfutil/ELF/copy-itself.test
deleted file mode 100644
index c1934f9d14618..0000000000000
--- a/llvm/test/tools/llvm-dwarfutil/ELF/copy-itself.test
+++ /dev/null
@@ -1,37 +0,0 @@
-## This test checks that the debug info contained in the source file
-## is fully copied to the destination file when the source and
-## destination are the same file.
-
-## Check --no-separate-debug-file.
-# RUN: yaml2obj %p/Inputs/common.yaml -o %t1
-# RUN: llvm-dwarfutil --no-separate-debug-file %t1 %t1
-# RUN: llvm-dwarfdump -a %t1 | FileCheck --check-prefix=CHECK-DEBUG %s
-
-## Check --separate-debug-file.
-# RUN: yaml2obj %p/Inputs/common.yaml -o %t1
-# RUN: llvm-dwarfutil --separate-debug-file %t1 %t1
-# RUN: llvm-objdump --headers %t1 | FileCheck --check-prefix=CHECK-NON-DEBUG %s
-# RUN: llvm-dwarfdump -a %t1.debug | FileCheck --check-prefix=CHECK-DEBUG %s
-
-# CHECK-NON-DEBUG-NOT: .debug_abbrev
-# CHECK-NON-DEBUG-NOT: .debug_info
-# CHECK-NON-DEBUG: .gnu_debuglink
-# CHECK-NON-DEBUG-NOT: .debug_abbrev
-# CHECK-NON-DEBUG-NOT: .debug_info
-
-# CHECK-DEBUG: .debug_abbrev
-# CHECK-DEBUG: DW_TAG_compile_unit
-# CHECK-DEBUG: .debug_info
-# CHECK-DEBUG: DW_TAG_compile_unit
-# CHECK-DEBUG: DW_AT_producer{{.*}}"by_hand"
-# CHECK-DEBUG: DW_AT_language{{.*}}DW_LANG_C_plus_plus
-# CHECK-DEBUG: DW_AT_name{{.*}}"CU1"
-# CHECK-DEBUG: DW_TAG_class_type
-# CHECK-DEBUG: DW_AT_name{{.*}}"class1"
-# CHECK-DEBUG: DW_TAG_base_type
-# CHECK-DEBUG: DW_AT_name{{.*}}"int"
-# CHECK-DEBUG: DW_AT_name{{.*}}"char"
-# CHECK-DEBUG: DW_AT_name{{.*}}"float"
-# CHECK-DEBUG: DW_TAG_pointer_type
-# CHECK-DEBUG: DW_TAG_variable
-# CHECK-DEBUG: DW_AT_name{{.*}}"var1"
diff --git a/llvm/test/tools/llvm-dwarfutil/ELF/copy.test b/llvm/test/tools/llvm-dwarfutil/ELF/copy.test
deleted file mode 100644
index 8385813bbe549..0000000000000
--- a/llvm/test/tools/llvm-dwarfutil/ELF/copy.test
+++ /dev/null
@@ -1,34 +0,0 @@
-## This test checks that debug info contained in the source file
-## is fully copied to the destination file in case --no-garbage-collection
-## is specified.
-
-# RUN: yaml2obj %p/Inputs/common.yaml -o %t.o
-
-## Check that the resulting file contains debug info from source file.
-# RUN: llvm-dwarfutil --no-garbage-collection %t.o %t1
-# RUN: llvm-dwarfdump -a %t1 | FileCheck %s
-
-## Check that the second copy matches with the first.
-# RUN: llvm-dwarfutil --no-garbage-collection %t1 %t2
-# RUN: cmp %t1 %t2
-
-## Check that input file passed through <stdin> is correctly processesed.
-# RUN: llvm-dwarfutil --no-garbage-collection - %t2 < %t1
-# RUN: cmp %t1 %t2
-
-# CHECK: .debug_abbrev
-# CHECK: DW_TAG_compile_unit
-# CHECK: .debug_info
-# CHECK: DW_TAG_compile_unit
-# CHECK: DW_AT_producer{{.*}}"by_hand"
-# CHECK: DW_AT_language{{.*}}DW_LANG_C_plus_plus
-# CHECK: DW_AT_name{{.*}}"CU1"
-# CHECK: DW_TAG_class_type
-# CHECK: DW_AT_name{{.*}}"class1"
-# CHECK: DW_TAG_base_type
-# CHECK: DW_AT_name{{.*}}"int"
-# CHECK: DW_AT_name{{.*}}"char"
-# CHECK: DW_AT_name{{.*}}"float"
-# CHECK: DW_TAG_pointer_type
-# CHECK: DW_TAG_variable
-# CHECK: DW_AT_name{{.*}}"var1"
diff --git a/llvm/test/tools/llvm-dwarfutil/ELF/error-separate-file-stdout.test b/llvm/test/tools/llvm-dwarfutil/ELF/error-separate-file-stdout.test
deleted file mode 100644
index 07492a495a9e3..0000000000000
--- a/llvm/test/tools/llvm-dwarfutil/ELF/error-separate-file-stdout.test
+++ /dev/null
@@ -1,7 +0,0 @@
-## This test checks the error message displayed if the destination
-## is stdout and separate debug info file is requested.
-
-# RUN: yaml2obj %p/Inputs/common.yaml -o %t.o
-# RUN: not llvm-dwarfutil --separate-debug-file %t.o - 2>&1 | FileCheck --check-prefix CHECK %s
-
-# CHECK: error: unable to write to stdout when --separate-debug-file specified
diff --git a/llvm/test/tools/llvm-dwarfutil/ELF/error-unsupported-input-file.test b/llvm/test/tools/llvm-dwarfutil/ELF/error-unsupported-input-file.test
deleted file mode 100644
index 13b19b5cfe719..0000000000000
--- a/llvm/test/tools/llvm-dwarfutil/ELF/error-unsupported-input-file.test
+++ /dev/null
@@ -1,7 +0,0 @@
-## This test checks the error message displayed if input file
-## has unsupported format.
-
-# RUN: echo "!<thin>" > %t1
-# RUN: not llvm-dwarfutil --garbage-collection %t1 - 2>&1 | FileCheck %s -DFILE=%t1
-
-# CHECK: error: '[[FILE]]': unsupported input file
diff --git a/llvm/test/tools/llvm-dwarfutil/ELF/gc-bfd.test b/llvm/test/tools/llvm-dwarfutil/ELF/gc-bfd.test
deleted file mode 100644
index 7e61036ae27de..0000000000000
--- a/llvm/test/tools/llvm-dwarfutil/ELF/gc-bfd.test
+++ /dev/null
@@ -1,150 +0,0 @@
-## This test checks that debug info related to deleted code (marked with
-## tombstone=bfd) is removed.
-
-# RUN: yaml2obj %s -o %t.o
-
-# RUN: llvm-dwarfutil --tombstone=bfd --garbage-collection %t.o - | llvm-dwarfdump -a - | FileCheck %s
-# RUN: llvm-dwarfutil --tombstone=universal --garbage-collection %t.o - | llvm-dwarfdump -a - | FileCheck %s
-
-# CHECK: DW_TAG_compile_unit
-# CHECK: DW_AT_name{{.*}}"CU1"
-# CHECK: DW_TAG_class_type
-# CHECK: DW_AT_name{{.*}}"class1"
-# CHECK-NOT: DW_TAG_class_type
-# CHECK-NOT: "class2"
-# CHECK-NOT: "class3"
-# CHECK: DW_TAG_subprogram
-# CHECK: DW_AT_name{{.*}}"foo1"
-# CHECK: DW_AT_low_pc{{.*}}0x0000000000001000
-# CHECK: DW_AT_high_pc{{.*}}0x0000000000001010
-# CHECK: DW_AT_type{{.*}}"class1"
-# CHECK-NOT: DW_TAG_subprogram
-# CHECK-NOT: "foo2"
-
-
---- !ELF
-FileHeader:
- Class: ELFCLASS64
- Data: ELFDATA2LSB
- Type: ET_REL
- Machine: EM_X86_64
-Sections:
- - Name: .text
- Type: SHT_PROGBITS
- Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
- Address: 0x1000
- Size: 0x1b
-DWARF:
- debug_abbrev:
- - Table:
- - Tag: DW_TAG_compile_unit
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_producer
- Form: DW_FORM_string
- - Attribute: DW_AT_language
- Form: DW_FORM_data2
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_low_pc
- Form: DW_FORM_addr
- - Attribute: DW_AT_high_pc
- Form: DW_FORM_data8
- - Tag: DW_TAG_subprogram
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_low_pc
- Form: DW_FORM_addr
- - Attribute: DW_AT_high_pc
- Form: DW_FORM_data8
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Tag: DW_TAG_member
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_declaration
- Form: DW_FORM_flag_present
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_declaration
- Form: DW_FORM_flag_present
- - Tag: DW_TAG_template_type_parameter
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- - Tag: DW_TAG_base_type
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- debug_info:
- - Version: 4
- Entries:
- - AbbrCode: 1
- Values:
- - CStr: by_hand
- - Value: 0x04
- - CStr: CU1
- - Value: 0x1000
- - Value: 0x1b
- - AbbrCode: 3
- Values:
- - CStr: class1
- - AbbrCode: 4
- Values:
- - Value: 0x0000006c
- - CStr: member1
- - AbbrCode: 0
- - AbbrCode: 3
- Values:
- - CStr: class2
- - AbbrCode: 4
- Values:
- - Value: 0x0000006c
- - CStr: member1
- - AbbrCode: 0
- - AbbrCode: 3
- Values:
- - CStr: class3
- - AbbrCode: 4
- Values:
- - Value: 0x0000006c
- - CStr: member1
- - AbbrCode: 0
- - AbbrCode: 8
- Values:
- - CStr: int
- - AbbrCode: 2
- Values:
- - CStr: foo1
- - Value: 0x1000
- - Value: 0x10
- - Value: 0x0000002a
- - AbbrCode: 2
- Values:
- - CStr: foo2
- - Value: 0x0
- - Value: 0x100
- - Value: 0x00000040
- - AbbrCode: 0
-...
diff --git a/llvm/test/tools/llvm-dwarfutil/ELF/gc-class.test b/llvm/test/tools/llvm-dwarfutil/ELF/gc-class.test
deleted file mode 100644
index 92797e972597e..0000000000000
--- a/llvm/test/tools/llvm-dwarfutil/ELF/gc-class.test
+++ /dev/null
@@ -1,344 +0,0 @@
-## This test checks debug info for the case when one compilation unit
-## contains a definition of a type and another compilation unit
-## contains a definition of the same type. When --garbage-collection
-## is enabled the result should contain the original definition in CU1
-## and the definition from CU2 should have been removed.
-
-# RUN: yaml2obj %s -o %t.o
-
-## Check --odr-deduplication.
-# RUN: llvm-dwarfutil %t.o %t1
-# RUN: llvm-dwarfdump -a %t1 | FileCheck %s --check-prefixes=CHECK,CHECK-ODR
-
-## Check --odr alias.
-# RUN: llvm-dwarfutil --odr %t.o %t2
-# RUN: cmp %t1 %t2
-
-## Check --no-odr alias.
-# RUN: llvm-dwarfutil --no-odr %t.o %t3
-# RUN: llvm-dwarfdump -a %t3 | FileCheck %s --check-prefixes=CHECK,CHECK-NOODR
-
-## Check --no-odr-deduplication wins if last.
-# RUN: llvm-dwarfutil --odr-deduplication --no-odr-deduplication %t.o %t4
-# RUN: cmp %t3 %t4
-
-## Check --odr-deduplication wins if last.
-# RUN: llvm-dwarfutil --no-odr-deduplication --odr-deduplication %t.o %t6
-# RUN: cmp %t1 %t6
-
-## CU1:
-##
-## class class1 {
-## char member1;
-## float member2;
-## };
-##
-## class1 *var1;
-##
-## CU2:
-##
-## class class1 {
-## char member1;
-## float member2;
-## };
-##
-## class1 *var1;
-
-# CHECK: file format elf64-x86-64
-# CHECK: .debug_info contents:
-
-# CHECK: DW_TAG_compile_unit
-# CHECK: DW_AT_name{{.*}}"CU1"
-
-# CHECK: 0x[[CU1_CLASS1:[0-9a-f]*]]: DW_TAG_class_type{{.*[[:space:]].*}}DW_AT_name{{.*}}"class1"
-# CHECK: DW_TAG_member
-# CHECK-ODR: DW_AT_type{{.*}}0x00000000[[CU1_CHAR:[0-9a-f]*]] "char"
-# CHECK-NOODR: DW_AT_type{{.*}}0x[[CU1_CHAR:[0-9a-f]*]] "char"
-# CHECK: DW_AT_name{{.*}}"member1"
-
-# CHECK: DW_TAG_member
-# CHECK-ODR: DW_AT_type{{.*}}0x00000000[[CU1_FLOAT:[0-9a-f]*]] "float"
-# CHECK-NOODR: DW_AT_type{{.*}}0x[[CU1_FLOAT:[0-9a-f]*]] "float"
-# CHECK: DW_AT_name{{.*}}"member2"
-
-# CHECK: 0x[[CU1_INT:[0-9a-f]*]]: DW_TAG_base_type
-# CHECK: DW_AT_name{{.*}}"int"
-
-# CHECK: 0x[[CU1_CHAR]]: DW_TAG_base_type
-# CHECK: DW_AT_name{{.*}}"char"
-
-# CHECK: 0x[[CU1_FLOAT]]: DW_TAG_base_type
-# CHECK: DW_AT_name{{.*}}"float"
-
-# CHECK-ODR: 0x[[CU1_PTR_CLASS1:[0-9a-f]*]]: DW_TAG_pointer_type{{.*[[:space:]].*}}DW_AT_type{{.*}}0x00000000[[CU1_CLASS1]] "class1"
-# CHECK-NOODR: 0x[[CU1_PTR_CLASS1:[0-9a-f]*]]: DW_TAG_pointer_type{{.*[[:space:]].*}}DW_AT_type{{.*}}0x[[CU1_CLASS1]] "class1"
-
-# CHECK: DW_TAG_variable
-# CHECK: DW_AT_name{{.*}}"var1"
-# CHECK-ODR: DW_AT_type{{.*}}0x00000000[[CU1_PTR_CLASS1]] "class1 *"
-# CHECK-NOODR: DW_AT_type{{.*}}0x[[CU1_PTR_CLASS1]] "class1 *"
-
-# CHECK: DW_TAG_compile_unit
-# CHECK: DW_AT_name{{.*}}"CU2"
-
-# CHECK-ODR-NOT: DW_TAG_class_type
-# CHECK-ODR-NOT: "class1"
-
-# CHECK-ODR: 0x[[CU2_PTR_CLASS1:[0-9a-f]*]]: DW_TAG_pointer_type{{.*[[:space:]].*}}DW_AT_type{{.*}}0x00000000[[CU1_CLASS1]] "class1"
-
-# CHECK-ODR: DW_TAG_variable
-# CHECK-ODR: DW_AT_name{{.*}}"var1"
-# CHECK-ODR: DW_AT_type{{.*}}0x00000000[[CU2_PTR_CLASS1]] "class1 *"
-
-
-# CHECK-NOODR: 0x[[CU2_CLASS1:[0-9a-f]*]]: DW_TAG_class_type{{.*[[:space:]].*}}DW_AT_name{{.*}}"class1"
-# CHECK-NOODR: DW_TAG_member
-# CHECK-NOODR: DW_AT_type{{.*}}0x[[CU2_CHAR:[0-9a-f]*]] "char"
-# CHECK-NOODR: DW_AT_name{{.*}}"member1"
-
-# CHECK-NOODR: DW_TAG_member
-# CHECK-NOODR: DW_AT_type{{.*}}0x[[CU2_FLOAT:[0-9a-f]*]] "float"
-# CHECK-NOODR: DW_AT_name{{.*}}"member2"
-
-# CHECK-NOODR: 0x[[CU2_INT:[0-9a-f]*]]: DW_TAG_base_type
-# CHECK-NOODR: DW_AT_name{{.*}}"int"
-
-# CHECK-NOODR: 0x[[CU2_CHAR]]: DW_TAG_base_type
-# CHECK-NOODR: DW_AT_name{{.*}}"char"
-
-# CHECK-NOODR: 0x[[CU2_FLOAT]]: DW_TAG_base_type
-# CHECK-NOODR: DW_AT_name{{.*}}"float"
-
-# CHECK-NOODR: 0x[[CU2_PTR_CLASS1:[0-9a-f]*]]: DW_TAG_pointer_type{{.*[[:space:]].*}}DW_AT_type{{.*}}0x[[CU2_CLASS1]] "class1"
-
-# CHECK-NOODR: DW_TAG_variable
-# CHECK-NOODR: DW_AT_name{{.*}}"var1"
-# CHECK-NOODR: DW_AT_type{{.*}}0x[[CU2_PTR_CLASS1]] "class1 *"
-
---- !ELF
-FileHeader:
- Class: ELFCLASS64
- Data: ELFDATA2LSB
- Type: ET_REL
- Machine: EM_X86_64
-Sections:
- - Name: .text
- Type: SHT_PROGBITS
- Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
- Address: 0x1000
- Size: 0x1b
- - Name: .text2
- Type: SHT_PROGBITS
- Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
- Address: 0x2000
- Size: 0x1b
-DWARF:
- debug_abbrev:
- - Table:
- - Tag: DW_TAG_compile_unit
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_producer
- Form: DW_FORM_string
- - Attribute: DW_AT_language
- Form: DW_FORM_data2
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_low_pc
- Form: DW_FORM_addr
- - Attribute: DW_AT_high_pc
- Form: DW_FORM_data8
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Tag: DW_TAG_member
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_declaration
- Form: DW_FORM_flag_present
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_declaration
- Form: DW_FORM_flag_present
- - Tag: DW_TAG_template_type_parameter
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- - Tag: DW_TAG_base_type
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Tag: DW_TAG_pointer_type
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- - Tag: DW_TAG_variable
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_const_value
- Form: DW_FORM_data4
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- - Table:
- - Tag: DW_TAG_compile_unit
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_producer
- Form: DW_FORM_string
- - Attribute: DW_AT_language
- Form: DW_FORM_data2
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_low_pc
- Form: DW_FORM_addr
- - Attribute: DW_AT_high_pc
- Form: DW_FORM_data8
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Tag: DW_TAG_member
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_declaration
- Form: DW_FORM_flag_present
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_declaration
- Form: DW_FORM_flag_present
- - Tag: DW_TAG_template_type_parameter
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- - Tag: DW_TAG_base_type
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Tag: DW_TAG_pointer_type
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- - Tag: DW_TAG_variable
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_const_value
- Form: DW_FORM_data4
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- debug_info:
- - Version: 4
- Entries:
- - AbbrCode: 1
- Values:
- - CStr: by_hand
- - Value: 0x04
- - CStr: CU1
- - Value: 0x1000
- - Value: 0x1b
- - AbbrCode: 2
- Values:
- - CStr: class1
- - AbbrCode: 3
- Values:
- - Value: 0x00000052
- - CStr: member1
- - AbbrCode: 3
- Values:
- - Value: 0x00000058
- - CStr: member2
- - AbbrCode: 0
- - AbbrCode: 7
- Values:
- - CStr: int
- - AbbrCode: 7
- Values:
- - CStr: char
- - AbbrCode: 7
- Values:
- - CStr: float
- - AbbrCode: 8
- Values:
- - Value: 0x0000002a
- - AbbrCode: 9
- Values:
- - CStr: var1
- - Value: 0x00000000
- - Value: 0x0000005f
- - AbbrCode: 0
- - Version: 4
- Entries:
- - AbbrCode: 1
- Values:
- - CStr: by_hand
- - Value: 0x04
- - CStr: CU2
- - Value: 0x2000
- - Value: 0x1b
- - AbbrCode: 2
- Values:
- - CStr: class1
- - AbbrCode: 3
- Values:
- - Value: 0x00000052
- - CStr: member1
- - AbbrCode: 3
- Values:
- - Value: 0x00000058
- - CStr: member2
- - AbbrCode: 0
- - AbbrCode: 7
- Values:
- - CStr: int
- - AbbrCode: 7
- Values:
- - CStr: char
- - AbbrCode: 7
- Values:
- - CStr: float
- - AbbrCode: 8
- Values:
- - Value: 0x0000002a
- - AbbrCode: 9
- Values:
- - CStr: var1
- - Value: 0x00000000
- - Value: 0x0000005f
- - AbbrCode: 0
-...
diff --git a/llvm/test/tools/llvm-dwarfutil/ELF/gc-default.test b/llvm/test/tools/llvm-dwarfutil/ELF/gc-default.test
deleted file mode 100644
index 4cac7c5849dbe..0000000000000
--- a/llvm/test/tools/llvm-dwarfutil/ELF/gc-default.test
+++ /dev/null
@@ -1,162 +0,0 @@
-## This test checks that debug info related to deleted code (marked with
-## default tombstone value) is removed.
-
-# RUN: yaml2obj %s -o %t.o
-
-# RUN: llvm-dwarfutil %t.o - | llvm-dwarfdump -a - | FileCheck %s --check-prefixes=CHECK,CHECK-GC
-
-# RUN: llvm-dwarfutil --garbage-collection %t.o - | llvm-dwarfdump -a - | FileCheck %s --check-prefixes=CHECK,CHECK-GC
-
-# RUN: llvm-dwarfutil --no-garbage-collection --garbage-collection %t.o - | llvm-dwarfdump -a - | FileCheck %s --check-prefixes=CHECK,CHECK-GC
-
-# RUN: llvm-dwarfutil --garbage-collection --no-garbage-collection %t.o - | llvm-dwarfdump -a - | FileCheck %s --check-prefixes=CHECK,CHECK-NOGC
-
-# RUN: llvm-dwarfutil %t.o --tombstone=universal - | llvm-dwarfdump -a - | FileCheck %s --check-prefixes=CHECK,CHECK-GC
-
-# CHECK: DW_TAG_compile_unit
-# CHECK: DW_AT_name{{.*}}"CU1"
-# CHECK: DW_TAG_class_type
-# CHECK: DW_AT_name{{.*}}"class1"
-# CHECK-GC-NOT: DW_TAG_class_type
-# CHECK-GC-NOT: "class2"
-# CHECK-GC-NOT: "class3"
-# CHECK-NOGC: DW_TAG_class_type
-# CHECK-NOGC: "class2"
-# CHECK-NOGC: "class3"
-# CHECK: DW_TAG_subprogram
-# CHECK: DW_AT_name{{.*}}"foo1"
-# CHECK: DW_AT_low_pc{{.*}}0x0000000000001000
-# CHECK: DW_AT_high_pc{{.*}}0x0000000000001010
-# CHECK: DW_AT_type{{.*}}"class1"
-# CHECK-GC-NOT: DW_TAG_subprogram
-# CHECK-GC-NOT: "foo2"
-# CHECK-NOGC: DW_TAG_subprogram
-# CHECK-NOGC: "foo2"
-
-
---- !ELF
-FileHeader:
- Class: ELFCLASS64
- Data: ELFDATA2LSB
- Type: ET_REL
- Machine: EM_X86_64
-Sections:
- - Name: .text
- Type: SHT_PROGBITS
- Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
- Address: 0x1000
- Size: 0x1b
-DWARF:
- debug_abbrev:
- - Table:
- - Tag: DW_TAG_compile_unit
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_producer
- Form: DW_FORM_string
- - Attribute: DW_AT_language
- Form: DW_FORM_data2
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_low_pc
- Form: DW_FORM_addr
- - Attribute: DW_AT_high_pc
- Form: DW_FORM_data8
- - Tag: DW_TAG_subprogram
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_low_pc
- Form: DW_FORM_addr
- - Attribute: DW_AT_high_pc
- Form: DW_FORM_data8
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Tag: DW_TAG_member
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_declaration
- Form: DW_FORM_flag_present
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_declaration
- Form: DW_FORM_flag_present
- - Tag: DW_TAG_template_type_parameter
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- - Tag: DW_TAG_base_type
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- debug_info:
- - Version: 4
- Entries:
- - AbbrCode: 1
- Values:
- - CStr: by_hand
- - Value: 0x04
- - CStr: CU1
- - Value: 0x1000
- - Value: 0x1b
- - AbbrCode: 3
- Values:
- - CStr: class1
- - AbbrCode: 4
- Values:
- - Value: 0x0000006c
- - CStr: member1
- - AbbrCode: 0
- - AbbrCode: 3
- Values:
- - CStr: class2
- - AbbrCode: 4
- Values:
- - Value: 0x0000006c
- - CStr: member1
- - AbbrCode: 0
- - AbbrCode: 3
- Values:
- - CStr: class3
- - AbbrCode: 4
- Values:
- - Value: 0x0000006c
- - CStr: member1
- - AbbrCode: 0
- - AbbrCode: 8
- Values:
- - CStr: int
- - AbbrCode: 2
- Values:
- - CStr: foo1
- - Value: 0x1000
- - Value: 0x10
- - Value: 0x0000002a
- - AbbrCode: 2
- Values:
- - CStr: foo2
- - Value: 0x0
- - Value: 0x100
- - Value: 0x00000040
- - AbbrCode: 0
-...
diff --git a/llvm/test/tools/llvm-dwarfutil/ELF/gc-exec.test b/llvm/test/tools/llvm-dwarfutil/ELF/gc-exec.test
deleted file mode 100644
index e7a6eed1748b1..0000000000000
--- a/llvm/test/tools/llvm-dwarfutil/ELF/gc-exec.test
+++ /dev/null
@@ -1,150 +0,0 @@
-## This test checks that debug info related to deleted code (marked with
-## tombstone=exec) is removed.
-
-# RUN: yaml2obj %s -o %t.o
-
-# RUN: llvm-dwarfutil --tombstone=exec --garbage-collection %t.o - | llvm-dwarfdump -a - | FileCheck %s
-# RUN: llvm-dwarfutil --tombstone=universal --garbage-collection %t.o - | llvm-dwarfdump -a - | FileCheck %s
-
-# CHECK: DW_TAG_compile_unit
-# CHECK: DW_AT_name{{.*}}"CU1"
-# CHECK: DW_TAG_class_type
-# CHECK: DW_AT_name{{.*}}"class1"
-# CHECK-NOT: DW_TAG_class_type
-# CHECK-NOT: "class2"
-# CHECK-NOT: "class3"
-# CHECK: DW_TAG_subprogram
-# CHECK: DW_AT_name{{.*}}"foo1"
-# CHECK: DW_AT_low_pc{{.*}}0x0000000000001000
-# CHECK: DW_AT_high_pc{{.*}}0x0000000000001010
-# CHECK: DW_AT_type{{.*}}"class1"
-# CHECK-NOT: DW_TAG_subprogram
-# CHECK-NOT: "foo2"
-
-
---- !ELF
-FileHeader:
- Class: ELFCLASS64
- Data: ELFDATA2LSB
- Type: ET_REL
- Machine: EM_X86_64
-Sections:
- - Name: .text
- Type: SHT_PROGBITS
- Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
- Address: 0x1000
- Size: 0x1b
-DWARF:
- debug_abbrev:
- - Table:
- - Tag: DW_TAG_compile_unit
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_producer
- Form: DW_FORM_string
- - Attribute: DW_AT_language
- Form: DW_FORM_data2
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_low_pc
- Form: DW_FORM_addr
- - Attribute: DW_AT_high_pc
- Form: DW_FORM_data8
- - Tag: DW_TAG_subprogram
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_low_pc
- Form: DW_FORM_addr
- - Attribute: DW_AT_high_pc
- Form: DW_FORM_data8
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Tag: DW_TAG_member
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_declaration
- Form: DW_FORM_flag_present
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_declaration
- Form: DW_FORM_flag_present
- - Tag: DW_TAG_template_type_parameter
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- - Tag: DW_TAG_base_type
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- debug_info:
- - Version: 4
- Entries:
- - AbbrCode: 1
- Values:
- - CStr: by_hand
- - Value: 0x04
- - CStr: CU1
- - Value: 0x1000
- - Value: 0x1b
- - AbbrCode: 3
- Values:
- - CStr: class1
- - AbbrCode: 4
- Values:
- - Value: 0x0000006c
- - CStr: member1
- - AbbrCode: 0
- - AbbrCode: 3
- Values:
- - CStr: class2
- - AbbrCode: 4
- Values:
- - Value: 0x0000006c
- - CStr: member1
- - AbbrCode: 0
- - AbbrCode: 3
- Values:
- - CStr: class3
- - AbbrCode: 4
- Values:
- - Value: 0x0000006c
- - CStr: member1
- - AbbrCode: 0
- - AbbrCode: 8
- Values:
- - CStr: int
- - AbbrCode: 2
- Values:
- - CStr: foo1
- - Value: 0x1000
- - Value: 0x10
- - Value: 0x0000002a
- - AbbrCode: 2
- Values:
- - CStr: foo2
- - Value: 0x0
- - Value: 0x100
- - Value: 0x00000040
- - AbbrCode: 0
-...
diff --git a/llvm/test/tools/llvm-dwarfutil/ELF/gc-maxpc.test b/llvm/test/tools/llvm-dwarfutil/ELF/gc-maxpc.test
deleted file mode 100644
index 6184f72496129..0000000000000
--- a/llvm/test/tools/llvm-dwarfutil/ELF/gc-maxpc.test
+++ /dev/null
@@ -1,150 +0,0 @@
-## This test checks that debug info related to deleted code (marked with
-## tombstone=maxpc) is removed.
-
-## RUN: yaml2obj %s -o %t.o
-
-# RUN: llvm-dwarfutil --tombstone=maxpc --garbage-collection %t.o - | llvm-dwarfdump -a - | FileCheck %s
-# RUN: llvm-dwarfutil --tombstone=universal --garbage-collection %t.o - | llvm-dwarfdump -a - | FileCheck %s
-
-# CHECK: DW_TAG_compile_unit
-# CHECK: DW_AT_name{{.*}}"CU1"
-# CHECK: DW_TAG_class_type
-# CHECK: DW_AT_name{{.*}}"class1"
-# CHECK-NOT: DW_TAG_class_type
-# CHECK-NOT: "class2"
-# CHECK-NOT: "class3"
-# CHECK: DW_TAG_subprogram
-# CHECK: DW_AT_name{{.*}}"foo1"
-# CHECK: DW_AT_low_pc{{.*}}0x0000000000001000
-# CHECK: DW_AT_high_pc{{.*}}0x0000000000001010
-# CHECK: DW_AT_type{{.*}}"class1"
-# CHECK-NOT: DW_TAG_subprogram
-# CHECK-NOT: "foo2"
-
-
---- !ELF
-FileHeader:
- Class: ELFCLASS64
- Data: ELFDATA2LSB
- Type: ET_REL
- Machine: EM_X86_64
-Sections:
- - Name: .text
- Type: SHT_PROGBITS
- Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
- Address: 0x1000
- Size: 0x1b
-DWARF:
- debug_abbrev:
- - Table:
- - Tag: DW_TAG_compile_unit
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_producer
- Form: DW_FORM_string
- - Attribute: DW_AT_language
- Form: DW_FORM_data2
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_low_pc
- Form: DW_FORM_addr
- - Attribute: DW_AT_high_pc
- Form: DW_FORM_data8
- - Tag: DW_TAG_subprogram
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_low_pc
- Form: DW_FORM_addr
- - Attribute: DW_AT_high_pc
- Form: DW_FORM_data8
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Tag: DW_TAG_member
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_declaration
- Form: DW_FORM_flag_present
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_declaration
- Form: DW_FORM_flag_present
- - Tag: DW_TAG_template_type_parameter
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- - Tag: DW_TAG_base_type
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- debug_info:
- - Version: 4
- Entries:
- - AbbrCode: 1
- Values:
- - CStr: by_hand
- - Value: 0x04
- - CStr: CU1
- - Value: 0x1000
- - Value: 0x1b
- - AbbrCode: 3
- Values:
- - CStr: class1
- - AbbrCode: 4
- Values:
- - Value: 0x0000006c
- - CStr: member1
- - AbbrCode: 0
- - AbbrCode: 3
- Values:
- - CStr: class2
- - AbbrCode: 4
- Values:
- - Value: 0x0000006c
- - CStr: member1
- - AbbrCode: 0
- - AbbrCode: 3
- Values:
- - CStr: class3
- - AbbrCode: 4
- Values:
- - Value: 0x0000006c
- - CStr: member1
- - AbbrCode: 0
- - AbbrCode: 8
- Values:
- - CStr: int
- - AbbrCode: 2
- Values:
- - CStr: foo1
- - Value: 0x1000
- - Value: 0x10
- - Value: 0x0000002a
- - AbbrCode: 2
- Values:
- - CStr: foo2
- - Value: 0xFFFFFFFFFFFFFFFF
- - Value: 0x100
- - Value: 0x00000040
- - AbbrCode: 0
-...
diff --git a/llvm/test/tools/llvm-dwarfutil/ELF/gc-no-garbage.test b/llvm/test/tools/llvm-dwarfutil/ELF/gc-no-garbage.test
deleted file mode 100644
index 11252295617d7..0000000000000
--- a/llvm/test/tools/llvm-dwarfutil/ELF/gc-no-garbage.test
+++ /dev/null
@@ -1,142 +0,0 @@
-## This test checks that debug info removal optimization (--garbage-collection)
-## does not affect files which do not have dead debug info.
-
-# RUN: yaml2obj %s -o %t.o
-# RUN: llvm-dwarfutil --tombstone=maxpc --garbage-collection %t.o - | llvm-dwarfdump -a - | FileCheck %s
-
-# CHECK: DW_TAG_compile_unit
-# CHECK: DW_AT_name{{.*}}"CU1"
-# CHECK: DW_TAG_class_type
-# CHECK: DW_AT_name{{.*}}"class1"
-# CHECK: DW_TAG_class_type
-# CHECK: "class2"
-# CHECK: DW_TAG_subprogram
-# CHECK: DW_AT_name{{.*}}"foo1"
-# CHECK: DW_AT_low_pc{{.*}}0x0000000000001000
-# CHECK: DW_AT_high_pc{{.*}}0x0000000000001010
-# CHECK: DW_AT_type{{.*}}"class1"
-# CHECK: DW_TAG_subprogram
-# CHECK: "foo2"
-# CHECK: DW_AT_low_pc{{.*}}0x0000000000001010
-# CHECK: DW_AT_high_pc{{.*}}0x000000000000101b
-# CHECK: DW_AT_type{{.*}}"class2"
-
-
---- !ELF
-FileHeader:
- Class: ELFCLASS64
- Data: ELFDATA2LSB
- Type: ET_REL
- Machine: EM_X86_64
-Sections:
- - Name: .text
- Type: SHT_PROGBITS
- Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
- Address: 0x1000
- Size: 0x1b
-DWARF:
- debug_abbrev:
- - Table:
- - Tag: DW_TAG_compile_unit
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_producer
- Form: DW_FORM_string
- - Attribute: DW_AT_language
- Form: DW_FORM_data2
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_low_pc
- Form: DW_FORM_addr
- - Attribute: DW_AT_high_pc
- Form: DW_FORM_data8
- - Tag: DW_TAG_subprogram
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_low_pc
- Form: DW_FORM_addr
- - Attribute: DW_AT_high_pc
- Form: DW_FORM_data8
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Tag: DW_TAG_member
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_declaration
- Form: DW_FORM_flag_present
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_declaration
- Form: DW_FORM_flag_present
- - Tag: DW_TAG_template_type_parameter
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- - Tag: DW_TAG_base_type
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- debug_info:
- - Version: 4
- Entries:
- - AbbrCode: 1
- Values:
- - CStr: by_hand
- - Value: 0x04
- - CStr: CU1
- - Value: 0x1000
- - Value: 0x1b
- - AbbrCode: 3
- Values:
- - CStr: class1
- - AbbrCode: 4
- Values:
- - Value: 0x00000056
- - CStr: member1
- - AbbrCode: 0
- - AbbrCode: 3
- Values:
- - CStr: class2
- - AbbrCode: 4
- Values:
- - Value: 0x00000056
- - CStr: member1
- - AbbrCode: 0
- - AbbrCode: 8
- Values:
- - CStr: int
- - AbbrCode: 2
- Values:
- - CStr: foo1
- - Value: 0x1000
- - Value: 0x10
- - Value: 0x0000002a
- - AbbrCode: 2
- Values:
- - CStr: foo2
- - Value: 0x1010
- - Value: 0xb
- - Value: 0x00000040
- - AbbrCode: 0
-...
diff --git a/llvm/test/tools/llvm-dwarfutil/ELF/odr-fwd-declaration.test b/llvm/test/tools/llvm-dwarfutil/ELF/odr-fwd-declaration.test
deleted file mode 100644
index 224d668870b44..0000000000000
--- a/llvm/test/tools/llvm-dwarfutil/ELF/odr-fwd-declaration.test
+++ /dev/null
@@ -1,341 +0,0 @@
-## This test checks debug info for the case when one compilation unit
-## contains a forward declaration of a type and another compilation unit
-## contains a definition for that type. The result should contain
-## the original definition and the declaration without modifications.
-
-# RUN: yaml2obj %s -o %t.o
-# RUN: llvm-dwarfutil %t.o - | llvm-dwarfdump -a - | FileCheck %s
-
-## CU1:
-##
-## class class1;
-## template<int> class class2;
-##
-## class1 *var1;
-## class2<int> *var2;
-##
-## CU2:
-##
-## class class1 {
-## char member1;
-## float member2;
-## };
-##
-## template<int> class class2 {
-## char member1;
-## };
-##
-## class1 *var1;
-## class2<int> *var2;
-
-# CHECK: file format elf64-x86-64
-# CHECK: .debug_info contents:
-
-# CHECK: DW_TAG_compile_unit
-# CHECK: DW_AT_name{{.*}}"CU1"
-
-# CHECK: 0x[[CU1_CLASS1:[0-9a-f]*]]: DW_TAG_class_type{{.*[[:space:]].*}}DW_AT_name{{.*}}"class1"
-# CHECK: DW_AT_declaration (true)
-
-# CHECK: 0x[[CU1_CLASS2:[0-9a-f]*]]: DW_TAG_class_type{{.*[[:space:]].*}}DW_AT_name{{.*}}"class2"
-# CHECK: DW_AT_declaration (true)
-# CHECK: DW_TAG_template_type_parameter{{.*[[:space:]].*}}DW_AT_type{{.*}}0x00000000[[CU1_INT:[0-9a-f]*]] "int"
-
-# CHECK: 0x[[CU1_INT]]: DW_TAG_base_type
-# CHECK: DW_AT_name{{.*}}"int"
-
-# CHECK: 0x[[CU1_PTR_CLASS1:[0-9a-f]*]]: DW_TAG_pointer_type{{.*[[:space:]].*}}DW_AT_type{{.*}}0x00000000[[CU1_CLASS1]] "class1"
-
-# CHECK: 0x[[CU1_PTR_CLASS2:[0-9a-f]*]]: DW_TAG_pointer_type{{.*[[:space:]].*}}DW_AT_type{{.*}}0x00000000[[CU1_CLASS2]] "class2<int>"
-
-# CHECK: DW_TAG_variable
-# CHECK: DW_AT_name{{.*}}"var1"
-# CHECK: DW_AT_type{{.*}}0x00000000[[CU1_PTR_CLASS1]] "class1 *"
-# CHECK: DW_TAG_variable
-# CHECK: DW_AT_name{{.*}}"var2"
-# CHECK: DW_AT_type{{.*}}0x00000000[[CU1_PTR_CLASS2]] "class2<int> *"
-
-# CHECK: DW_TAG_compile_unit
-# CHECK: DW_AT_name{{.*}}"CU2"
-
-# CHECK: 0x[[CU2_CLASS1:[0-9a-f]*]]: DW_TAG_class_type{{.*[[:space:]].*}}DW_AT_name{{.*}}"class1"
-# CHECK: DW_TAG_member
-# CHECK: DW_AT_type{{.*}}0x00000000[[CU2_CHAR:[0-9a-f]*]] "char"
-# CHECK: DW_AT_name{{.*}}"member1"
-
-# CHECK: DW_TAG_member
-# CHECK: DW_AT_type{{.*}}0x00000000[[CU2_FLOAT:[0-9a-f]*]] "float"
-# CHECK: DW_AT_name{{.*}}"member2"
-
-# CHECK: 0x[[CU2_CLASS2:[0-9a-f]*]]: DW_TAG_class_type{{.*[[:space:]].*}}DW_AT_name{{.*}}"class2"
-# CHECK: DW_TAG_template_type_parameter{{.*[[:space:]].*}}DW_AT_type{{.*}}0x00000000[[CU2_INT:[0-9a-f]*]] "int"
-# CHECK: DW_TAG_member
-# CHECK: DW_AT_type{{.*}}0x00000000[[CU2_CHAR]] "char"
-# CHECK: DW_AT_name{{.*}}"member1"
-
-# CHECK: 0x[[CU2_INT]]: DW_TAG_base_type
-# CHECK: DW_AT_name{{.*}}"int"
-
-# CHECK: 0x[[CU2_CHAR]]: DW_TAG_base_type
-# CHECK: DW_AT_name{{.*}}"char"
-
-# CHECK: 0x[[CU2_FLOAT]]: DW_TAG_base_type
-# CHECK: DW_AT_name{{.*}}"float"
-
-# CHECK: 0x[[CU2_PTR_CLASS1:[0-9a-f]*]]: DW_TAG_pointer_type{{.*[[:space:]].*}}DW_AT_type{{.*}}0x00000000[[CU2_CLASS1]] "class1"
-
-# CHECK: 0x[[CU2_PTR_CLASS2:[0-9a-f]*]]: DW_TAG_pointer_type{{.*[[:space:]].*}}DW_AT_type{{.*}}0x00000000[[CU2_CLASS2]] "class2<int>"
-
-# CHECK: DW_TAG_variable
-# CHECK: DW_AT_name{{.*}}"var1"
-# CHECK: DW_AT_type{{.*}}0x00000000[[CU2_PTR_CLASS1]] "class1 *"
-# CHECK: DW_TAG_variable
-# CHECK: DW_AT_name{{.*}}"var2"
-# CHECK: DW_AT_type{{.*}}0x00000000[[CU2_PTR_CLASS2]] "class2<int> *"
-
---- !ELF
-FileHeader:
- Class: ELFCLASS64
- Data: ELFDATA2LSB
- Type: ET_REL
- Machine: EM_X86_64
-Sections:
- - Name: .text
- Type: SHT_PROGBITS
- Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
- Address: 0x1000
- Size: 0x1b
- - Name: .text2
- Type: SHT_PROGBITS
- Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
- Address: 0x2000
- Size: 0x1b
-DWARF:
- debug_abbrev:
- - Table:
- - Tag: DW_TAG_compile_unit
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_producer
- Form: DW_FORM_string
- - Attribute: DW_AT_language
- Form: DW_FORM_data2
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_low_pc
- Form: DW_FORM_addr
- - Attribute: DW_AT_high_pc
- Form: DW_FORM_data8
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Tag: DW_TAG_member
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_type
- Form: DW_FORM_ref_addr
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_declaration
- Form: DW_FORM_flag_present
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_declaration
- Form: DW_FORM_flag_present
- - Tag: DW_TAG_template_type_parameter
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_type
- Form: DW_FORM_ref_addr
- - Tag: DW_TAG_base_type
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Tag: DW_TAG_pointer_type
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_type
- Form: DW_FORM_ref_addr
- - Tag: DW_TAG_variable
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_const_value
- Form: DW_FORM_data4
- - Attribute: DW_AT_type
- Form: DW_FORM_ref_addr
- - Table:
- - Tag: DW_TAG_compile_unit
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_producer
- Form: DW_FORM_string
- - Attribute: DW_AT_language
- Form: DW_FORM_data2
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_low_pc
- Form: DW_FORM_addr
- - Attribute: DW_AT_high_pc
- Form: DW_FORM_data8
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Tag: DW_TAG_member
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_type
- Form: DW_FORM_ref_addr
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_declaration
- Form: DW_FORM_flag_present
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_declaration
- Form: DW_FORM_flag_present
- - Tag: DW_TAG_template_type_parameter
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_type
- Form: DW_FORM_ref_addr
- - Tag: DW_TAG_base_type
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Tag: DW_TAG_pointer_type
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_type
- Form: DW_FORM_ref_addr
- - Tag: DW_TAG_variable
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_const_value
- Form: DW_FORM_data4
- - Attribute: DW_AT_type
- Form: DW_FORM_ref_addr
- debug_info:
- - Version: 4
- Entries:
- - AbbrCode: 1
- Values:
- - CStr: by_hand
- - Value: 0x04
- - CStr: CU1
- - Value: 0x1000
- - Value: 0x1b
- - AbbrCode: 4
- Values:
- - CStr: class1
- - AbbrCode: 5
- Values:
- - CStr: class2
- - AbbrCode: 6
- Values:
- - Value: 0x00000040
- - AbbrCode: 0
- - AbbrCode: 7
- Values:
- - CStr: int
- - AbbrCode: 8
- Values:
- - Value: 0x0000002a
- - AbbrCode: 8
- Values:
- - Value: 0x00000032
- - AbbrCode: 9
- Values:
- - CStr: var1
- - Value: 0x00000000
- - Value: 0x00000045
- - AbbrCode: 9
- Values:
- - CStr: var2
- - Value: 0x00000000
- - Value: 0x0000004a
- - AbbrCode: 0
- - Version: 4
- Entries:
- - AbbrCode: 1
- Values:
- - CStr: by_hand
- - Value: 0x04
- - CStr: CU2
- - Value: 0x2000
- - Value: 0x1b
- - AbbrCode: 2
- Values:
- - CStr: class1
- - AbbrCode: 3
- Values:
- - Value: 0x000000d9
- - CStr: member1
- - AbbrCode: 3
- Values:
- - Value: 0x000000df
- - CStr: member2
- - AbbrCode: 0
- - AbbrCode: 2
- Values:
- - CStr: class2
- - AbbrCode: 6
- Values:
- - Value: 0x000000d4
- - AbbrCode: 3
- Values:
- - Value: 0x000000d9
- - CStr: member1
- - AbbrCode: 0
- - AbbrCode: 7
- Values:
- - CStr: int
- - AbbrCode: 7
- Values:
- - CStr: char
- - AbbrCode: 7
- Values:
- - CStr: float
- - AbbrCode: 8
- Values:
- - Value: 0x00000096
- - AbbrCode: 8
- Values:
- - Value: 0x000000b9
- - AbbrCode: 9
- Values:
- - CStr: var1
- - Value: 0x00000000
- - Value: 0x000000e6
- - AbbrCode: 9
- Values:
- - CStr: var2
- - Value: 0x00000000
- - Value: 0x000000eb
- - AbbrCode: 0
-...
diff --git a/llvm/test/tools/llvm-dwarfutil/ELF/separate-debug-file.test b/llvm/test/tools/llvm-dwarfutil/ELF/separate-debug-file.test
deleted file mode 100644
index d54cb3a182cdc..0000000000000
--- a/llvm/test/tools/llvm-dwarfutil/ELF/separate-debug-file.test
+++ /dev/null
@@ -1,56 +0,0 @@
-## This test checks the --[no-]separate-debug-file option.
-
-# RUN: yaml2obj %p/Inputs/common.yaml -o %t.o
-
-## Check --garbage-collection --no-separate-debug-file.
-# RUN: llvm-dwarfutil --garbage-collection --no-separate-debug-file %t.o %t2
-# RUN: llvm-dwarfdump -a %t2 | FileCheck --check-prefix=CHECK-DEBUG %s
-
-## Check --garbage-collection --separate-debug-file.
-# RUN: llvm-dwarfutil --garbage-collection --separate-debug-file %t.o %t2
-# RUN: llvm-objdump --headers %t2 | FileCheck --check-prefix=CHECK-NON-DEBUG %s
-# RUN: llvm-dwarfdump -a %t2.debug | FileCheck --check-prefix=CHECK-DEBUG %s
-
-## Check --no-garbage-collection --no-separate-debug-file.
-# RUN: llvm-dwarfutil --no-garbage-collection --no-separate-debug-file %t.o %t1
-# RUN: llvm-dwarfdump -a %t1 | FileCheck --check-prefix=CHECK-DEBUG %s
-
-## Check --no-garbage-collection --separate-debug-file.
-# RUN: llvm-dwarfutil --no-garbage-collection %t.o --separate-debug-file %t3
-# RUN: llvm-objdump --headers %t3 | FileCheck --check-prefix=CHECK-NON-DEBUG %s
-# RUN: llvm-dwarfdump -a %t3.debug | FileCheck --check-prefix=CHECK-DEBUG %s
-## Copy result to compare it later.
-# RUN: cp %t3 %t4
-# RUN: cp %t3.debug %t4.debug
-
-## Check that --separate-debug-file wins if last.
-# RUN: llvm-dwarfutil --no-garbage-collection --no-separate-debug-file --separate-debug-file %t.o %t3
-# RUN: cmp %t4 %t3
-# RUN: cmp %t4.debug %t3.debug
-
-## Check that --no-separate-debug-file wins if last.
-# RUN: llvm-dwarfutil --no-garbage-collection --separate-debug-file --no-separate-debug-file %t.o %t5
-# RUN: cmp %t1 %t5
-
-# CHECK-NON-DEBUG-NOT: .debug_abbrev
-# CHECK-NON-DEBUG-NOT: .debug_info
-# CHECK-NON-DEBUG: .gnu_debuglink
-# CHECK-NON-DEBUG-NOT: .debug_abbrev
-# CHECK-NON-DEBUG-NOT: .debug_info
-
-# CHECK-DEBUG: .debug_abbrev
-# CHECK-DEBUG: DW_TAG_compile_unit
-# CHECK-DEBUG: .debug_info
-# CHECK-DEBUG: DW_TAG_compile_unit
-# CHECK-DEBUG: DW_AT_producer{{.*}}"by_hand"
-# CHECK-DEBUG: DW_AT_language{{.*}}DW_LANG_C_plus_plus
-# CHECK-DEBUG: DW_AT_name{{.*}}"CU1"
-# CHECK-DEBUG: DW_TAG_class_type
-# CHECK-DEBUG: DW_AT_name{{.*}}"class1"
-# CHECK-DEBUG: DW_TAG_base_type
-# CHECK-DEBUG: DW_AT_name{{.*}}"int"
-# CHECK-DEBUG: DW_AT_name{{.*}}"char"
-# CHECK-DEBUG: DW_AT_name{{.*}}"float"
-# CHECK-DEBUG: DW_TAG_pointer_type
-# CHECK-DEBUG: DW_TAG_variable
-# CHECK-DEBUG: DW_AT_name{{.*}}"var1"
diff --git a/llvm/test/tools/llvm-dwarfutil/ELF/verbose.test b/llvm/test/tools/llvm-dwarfutil/ELF/verbose.test
deleted file mode 100644
index 6675d7cd8a3bb..0000000000000
--- a/llvm/test/tools/llvm-dwarfutil/ELF/verbose.test
+++ /dev/null
@@ -1,25 +0,0 @@
-## This test checks output of llvm-dwarfutil when verbose mode
-## is enabled.
-
-# RUN: yaml2obj %p/Inputs/common.yaml -o %t.o
-
-## Check verbose output.
-# RUN: llvm-dwarfutil %t.o %t1 --verbose 2>&1 | FileCheck %s
-
-## Check warning displayed in multi-thread mode (--num-threads set explicitly).
-# RUN: llvm-dwarfutil %t.o %t1 --verbose --num-threads 10 2>&1 | FileCheck %s --check-prefix=CHECK-THREAD-WARNING
-
-## Check -j alias.
-# RUN: llvm-dwarfutil %t.o %t1 --verbose -j 10 2>&1 | FileCheck %s --check-prefix=CHECK-THREAD-WARNING
-
-## Check verbose output for --verify.
-# RUN: llvm-dwarfutil %t.o %t1 -j 1 --verbose --verify 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-VERIFY
-
-# CHECK-NOT: warning: --num-threads set to 1 because verbose mode is specified
-# CHECK: Do garbage collection for debug info ...
-# CHECK: Input compilation unit:
-# CHECK: DW_TAG_compile_unit
-# CHECK: Keeping subprogram DIE
-# CHECK: DW_TAG_subprogram
-# CHECK-THREAD-WARNING: warning: --num-threads set to 1 because verbose mode is specified
-# CHECK-VERIFY: Verifying DWARF...
diff --git a/llvm/test/tools/llvm-dwarfutil/ELF/verify.test b/llvm/test/tools/llvm-dwarfutil/ELF/verify.test
deleted file mode 100644
index 844e8fb671af3..0000000000000
--- a/llvm/test/tools/llvm-dwarfutil/ELF/verify.test
+++ /dev/null
@@ -1,151 +0,0 @@
-## This test checks that debug info contained in the source file is properly
-## verified by --verify after copying. If --no-garbage-collection is
-## specified then the verification should fail, otherwise the verification
-## should succeed.
-
-# RUN: yaml2obj %s -o %t.o
-
-## Verify resulting debug info after --garbage-collection optimisation.
-# RUN: llvm-dwarfutil %t.o %t1 --verify
-
-## Verify separate debug file after --garbage-collection optimisation.
-# RUN: llvm-dwarfutil %t.o --separate-debug-file %t1 --verify
-
-## Verify not optimised resulting debug info.
-# RUN: not llvm-dwarfutil --no-garbage-collection %t.o %t1 --verify 2>&1 | FileCheck %s -DFILE=%t1
-
-## Verify not optimised resulting separate debug file.
-# RUN: not llvm-dwarfutil --no-garbage-collection %t.o --separate-debug-file %t1 --verify 2>&1 | FileCheck %s -DFILE=%t1.debug
-
-## Check that verification is disabled when destination is stdout.
-# RUN: llvm-dwarfutil %t.o - --verify 2>&1 | FileCheck %s --check-prefix=CHECK-STDOUT
-
-# CHECK: error: '[[FILE]]': output verification failed
-# CHECK-STDOUT: warning: verification skipped because writing to stdout
-
---- !ELF
-FileHeader:
- Class: ELFCLASS64
- Data: ELFDATA2LSB
- Type: ET_REL
- Machine: EM_X86_64
-DWARF:
- debug_abbrev:
- - Table:
- - Tag: DW_TAG_compile_unit
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_producer
- Form: DW_FORM_string
- - Attribute: DW_AT_language
- Form: DW_FORM_data2
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_low_pc
- Form: DW_FORM_addr
- - Attribute: DW_AT_high_pc
- Form: DW_FORM_data8
- - Tag: DW_TAG_subprogram
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_low_pc
- Form: DW_FORM_addr
- - Attribute: DW_AT_high_pc
- Form: DW_FORM_data8
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Tag: DW_TAG_member
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_declaration
- Form: DW_FORM_flag_present
- - Tag: DW_TAG_class_type
- Children: DW_CHILDREN_yes
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- - Attribute: DW_AT_declaration
- Form: DW_FORM_flag_present
- - Tag: DW_TAG_template_type_parameter
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_type
- Form: DW_FORM_ref4
- - Tag: DW_TAG_base_type
- Children: DW_CHILDREN_no
- Attributes:
- - Attribute: DW_AT_name
- Form: DW_FORM_string
- debug_info:
- - Version: 4
- Entries:
- - AbbrCode: 1
- Values:
- - CStr: by_hand
- - Value: 0x04
- - CStr: CU1
- - Value: 0x1000
- - Value: 0x100
- - AbbrCode: 3
- Values:
- - CStr: class1
- - AbbrCode: 4
- Values:
- - Value: 0x0000006c
- - CStr: member1
- - AbbrCode: 0
- - AbbrCode: 3
- Values:
- - CStr: class2
- - AbbrCode: 4
- Values:
- - Value: 0x0000006c
- - CStr: member1
- - AbbrCode: 0
- - AbbrCode: 3
- Values:
- - CStr: class3
- - AbbrCode: 4
- Values:
- - Value: 0x0000006c
- - CStr: member1
- - AbbrCode: 0
- - AbbrCode: 8
- Values:
- - CStr: int
- - AbbrCode: 2
- Values:
- - CStr: foo1
- - Value: 0x1000
- - Value: 0x10
- - Value: 0x0000002a
- - AbbrCode: 2
- Values:
- - CStr: foo2
- - Value: 0x0
- - Value: 0x100
- - Value: 0x00000040
- - AbbrCode: 2
- Values:
- - CStr: foo3
- - Value: 0x0
- - Value: 0x100
- - Value: 0x00000040
- - AbbrCode: 0
-...
diff --git a/llvm/test/tools/llvm-dwarfutil/error-invalid-format.test b/llvm/test/tools/llvm-dwarfutil/error-invalid-format.test
deleted file mode 100644
index 531cde3c4f2b7..0000000000000
--- a/llvm/test/tools/llvm-dwarfutil/error-invalid-format.test
+++ /dev/null
@@ -1,6 +0,0 @@
-## This test checks that llvm-dwarfutil displays an error message
-## if an input file is not valid.
-
-# RUN: not llvm-dwarfutil %s - 2>&1 | FileCheck %s -DFILE=%s
-
-# CHECK: error: '[[FILE]]': The file was not recognized as a valid object file
diff --git a/llvm/test/tools/llvm-dwarfutil/error-no-gc-odr.test b/llvm/test/tools/llvm-dwarfutil/error-no-gc-odr.test
deleted file mode 100644
index d52cca3c71482..0000000000000
--- a/llvm/test/tools/llvm-dwarfutil/error-no-gc-odr.test
+++ /dev/null
@@ -1,6 +0,0 @@
-## This test checks the error message displayed if ODR deduplication
-## is enabled while debug info garbage collection is disabled.
-
-# RUN: not llvm-dwarfutil --no-garbage-collection --odr-deduplication - - 2>&1 | FileCheck --check-prefix CHECK %s
-
-# CHECK: error: cannot use --odr-deduplication without --garbage-collection
diff --git a/llvm/test/tools/llvm-dwarfutil/error-no-input-file.test b/llvm/test/tools/llvm-dwarfutil/error-no-input-file.test
deleted file mode 100644
index 6d81e7389a5ad..0000000000000
--- a/llvm/test/tools/llvm-dwarfutil/error-no-input-file.test
+++ /dev/null
@@ -1,6 +0,0 @@
-## This test checks the error message displayed if
-## an input file does not exist.
-
-# RUN: not llvm-dwarfutil not-existed not-existed 2>&1 | FileCheck %s -DMSG=%errc_ENOENT
-
-# CHECK: error: 'not-existed': [[MSG]]
diff --git a/llvm/test/tools/llvm-dwarfutil/error-positional-args.test b/llvm/test/tools/llvm-dwarfutil/error-positional-args.test
deleted file mode 100644
index b46f94e671da9..0000000000000
--- a/llvm/test/tools/llvm-dwarfutil/error-positional-args.test
+++ /dev/null
@@ -1,8 +0,0 @@
-## This test checks the error message displayed if an incorrect
-## number of positional arguments is specified.
-
-# RUN: not llvm-dwarfutil - 2>&1 | FileCheck --check-prefix CHECK1 %s
-# RUN: not llvm-dwarfutil - - - 2>&1 | FileCheck --check-prefix CHECK3 %s
-
-# CHECK1: error: exactly two positional arguments expected, 1 provided
-# CHECK3: error: exactly two positional arguments expected, 3 provided
diff --git a/llvm/test/tools/llvm-dwarfutil/error-unknown-option.test b/llvm/test/tools/llvm-dwarfutil/error-unknown-option.test
deleted file mode 100644
index d25eb1ce60070..0000000000000
--- a/llvm/test/tools/llvm-dwarfutil/error-unknown-option.test
+++ /dev/null
@@ -1,6 +0,0 @@
-## This test checks the error message displayed if an unknown
-## option is specified.
-
-# RUN: not llvm-dwarfutil --unknown-option 2>&1 | FileCheck %s
-
-# CHECK: error: unknown option: --unknown-option
diff --git a/llvm/test/tools/llvm-dwarfutil/error-unknown-tombstone.test b/llvm/test/tools/llvm-dwarfutil/error-unknown-tombstone.test
deleted file mode 100644
index afc5a6db6e211..0000000000000
--- a/llvm/test/tools/llvm-dwarfutil/error-unknown-tombstone.test
+++ /dev/null
@@ -1,6 +0,0 @@
-## This test checks the error message diplayed if an incorrect
-## tombstone value is specified.
-
-# RUN: not llvm-dwarfutil --tombstone=unknown - - 2>&1 | FileCheck --check-prefix CHECK %s
-
-# CHECK: error: unknown tombstone value: 'unknown'
diff --git a/llvm/test/tools/llvm-dwarfutil/help.test b/llvm/test/tools/llvm-dwarfutil/help.test
deleted file mode 100644
index 7fc1cc17682e7..0000000000000
--- a/llvm/test/tools/llvm-dwarfutil/help.test
+++ /dev/null
@@ -1,25 +0,0 @@
-## This test checks the help message of llvm-dwarfutil.
-
-# RUN: llvm-dwarfutil | FileCheck %s
-# RUN: llvm-dwarfutil -h | FileCheck %s
-# RUN: llvm-dwarfutil --help | FileCheck %s
-
-# CHECK: OVERVIEW: llvm-dwarfutil is a tool to copy and manipulate debug info
-# CHECK: USAGE: {{.*}}llvm-dwarfutil{{.*}} [options] <input file> <output file>
-# CHECK: OPTIONS:
-# CHECK: --garbage-collection
-# CHECK: --help
-# CHECK: -h
-# CHECK: -j
-# CHECK: --no-garbage-collection
-# CHECK: --no-odr-deduplication
-# CHECK: --no-odr
-# CHECK: --no-separate-debug-file
-# CHECK: --num-threads
-# CHECK: --odr-deduplication
-# CHECK: --separate-debug-file
-# CHECK: --tombstone
-# CHECK: --verbose
-# CHECK: --verify
-# CHECK: --version
-# CHECK: -V
diff --git a/llvm/tools/llvm-dwarfutil/CMakeLists.txt b/llvm/tools/llvm-dwarfutil/CMakeLists.txt
deleted file mode 100644
index d932ff1eff2d0..0000000000000
--- a/llvm/tools/llvm-dwarfutil/CMakeLists.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-set(LLVM_TARGET_DEFINITIONS Options.td)
-tablegen(LLVM Options.inc -gen-opt-parser-defs)
-add_public_tablegen_target(DwarfutilTableGen)
-
-set(LLVM_LINK_COMPONENTS
- ${LLVM_TARGETS_TO_BUILD}
- DebugInfoDWARF
- DWARFLinker
- MC
- ObjCopy
- Object
- Option
- Support
- Target
- AllTargetsCodeGens
- AllTargetsDescs
- AllTargetsInfos
- )
-
-add_llvm_tool(llvm-dwarfutil
- llvm-dwarfutil.cpp
- DebugInfoLinker.cpp
-
- DEPENDS
- intrinsics_gen
- ${tablegen_deps}
- )
diff --git a/llvm/tools/llvm-dwarfutil/DebugInfoLinker.cpp b/llvm/tools/llvm-dwarfutil/DebugInfoLinker.cpp
deleted file mode 100644
index ee6bf4fa78120..0000000000000
--- a/llvm/tools/llvm-dwarfutil/DebugInfoLinker.cpp
+++ /dev/null
@@ -1,281 +0,0 @@
-//=== DebugInfoLinker.cpp -------------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "DebugInfoLinker.h"
-#include "Error.h"
-#include "llvm/DWARFLinker/DWARFLinker.h"
-#include "llvm/DWARFLinker/DWARFStreamer.h"
-#include "llvm/DebugInfo/DWARF/DWARFContext.h"
-#include "llvm/DebugInfo/DWARF/DWARFExpression.h"
-#include "llvm/Object/ObjectFile.h"
-#include <memory>
-#include <vector>
-
-namespace llvm {
-namespace dwarfutil {
-
-// ObjFileAddressMap allows to check whether specified DIE referencing
-// dead addresses. It uses tombstone values to determine dead addresses.
-// The concrete values of tombstone constants were discussed in
-// https://reviews.llvm.org/D81784 and https://reviews.llvm.org/D84825.
-// So we use following values as indicators of dead addresses:
-//
-// bfd: (LowPC == 0) or (LowPC == 1 and HighPC == 1 and DWARF v4 (or less))
-// or ([LowPC, HighPC] is not inside address ranges of .text sections).
-//
-// maxpc: (LowPC == -1) or (LowPC == -2 and DWARF v4 (or less))
-// That value is assumed to be compatible with
-// http://www.dwarfstd.org/ShowIssue.php?issue=200609.1
-//
-// exec: [LowPC, HighPC] is not inside address ranges of .text sections
-//
-// universal: maxpc and bfd
-class ObjFileAddressMap : public AddressesMap {
-public:
- ObjFileAddressMap(DWARFContext &Context, const Options &Options,
- object::ObjectFile &ObjFile)
- : Opts(Options) {
- // Remember addresses of existing text sections.
- for (const object::SectionRef &Sect : ObjFile.sections()) {
- if (!Sect.isText())
- continue;
- const uint64_t Size = Sect.getSize();
- if (Size == 0)
- continue;
- const uint64_t StartAddr = Sect.getAddress();
- TextAddressRanges[{StartAddr}] = {StartAddr + Size, 0};
- }
-
- // Check CU address ranges for tombstone value.
- for (std::unique_ptr<DWARFUnit> &CU : Context.compile_units()) {
- Expected<llvm::DWARFAddressRangesVector> ARanges =
- CU->getUnitDIE().getAddressRanges();
- if (ARanges) {
- for (auto &Range : *ARanges) {
- if (!isDeadAddressRange(Range.LowPC, Range.HighPC, CU->getVersion(),
- Options.Tombstone, CU->getAddressByteSize()))
- DWARFAddressRanges[{Range.LowPC}] = {Range.HighPC, 0};
- }
- }
- }
- }
-
- // should be renamed into has valid address ranges
- bool hasValidRelocs() override { return !DWARFAddressRanges.empty(); }
-
- bool isLiveSubprogram(const DWARFDie &DIE,
- CompileUnit::DIEInfo &Info) override {
- assert((DIE.getTag() == dwarf::DW_TAG_subprogram ||
- DIE.getTag() == dwarf::DW_TAG_label) &&
- "Wrong type of input die");
-
- if (Optional<uint64_t> LowPC =
- dwarf::toAddress(DIE.find(dwarf::DW_AT_low_pc))) {
- if (!isDeadAddress(*LowPC, DIE.getDwarfUnit()->getVersion(),
- Opts.Tombstone,
- DIE.getDwarfUnit()->getAddressByteSize())) {
- Info.AddrAdjust = 0;
- Info.InDebugMap = true;
- return true;
- }
- }
-
- return false;
- }
-
- bool isLiveVariable(const DWARFDie &DIE,
- CompileUnit::DIEInfo &Info) override {
- assert((DIE.getTag() == dwarf::DW_TAG_variable ||
- DIE.getTag() == dwarf::DW_TAG_constant) &&
- "Wrong type of input die");
-
- if (Expected<DWARFLocationExpressionsVector> Loc =
- DIE.getLocations(dwarf::DW_AT_location)) {
- DWARFUnit *U = DIE.getDwarfUnit();
- for (const auto &Entry : *Loc) {
- DataExtractor Data(toStringRef(Entry.Expr),
- U->getContext().isLittleEndian(), 0);
- DWARFExpression Expression(Data, U->getAddressByteSize(),
- U->getFormParams().Format);
- bool HasLiveAddresses =
- any_of(Expression, [&](const DWARFExpression::Operation &Op) {
- // TODO: add handling of dwarf::DW_OP_addrx
- return !Op.isError() &&
- (Op.getCode() == dwarf::DW_OP_addr &&
- !isDeadAddress(Op.getRawOperand(0), U->getVersion(),
- Opts.Tombstone,
- DIE.getDwarfUnit()->getAddressByteSize()));
- });
-
- if (HasLiveAddresses) {
- Info.AddrAdjust = 0;
- Info.InDebugMap = true;
- return true;
- }
- }
- } else {
- // FIXME: missing DW_AT_location is OK here, but other errors should be
- // reported to the user.
- consumeError(Loc.takeError());
- }
-
- return false;
- }
-
- bool applyValidRelocs(MutableArrayRef<char>, uint64_t, bool) override {
- // no need to apply relocations to the linked binary.
- return false;
- }
-
- RangesTy &getValidAddressRanges() override { return DWARFAddressRanges; };
-
- void clear() override { DWARFAddressRanges.clear(); }
-
- llvm::Expected<uint64_t> relocateIndexedAddr(uint64_t, uint64_t) override {
- // should not be called.
- return object::createError("no relocations in linked binary");
- }
-
-protected:
- // returns true if specified address range is inside address ranges
- // of executable sections.
- bool isInsideExecutableSectionsAddressRange(uint64_t LowPC,
- Optional<uint64_t> HighPC) {
- auto Range = TextAddressRanges.lower_bound(LowPC);
- if ((Range == TextAddressRanges.end() || Range->first != LowPC) &&
- Range != TextAddressRanges.begin())
- --Range;
-
- if (Range != TextAddressRanges.end() && Range->first <= LowPC &&
- (HighPC ? Range->second.HighPC >= HighPC
- : Range->second.HighPC >= LowPC))
- return true;
-
- return false;
- }
-
- uint64_t isBFDDeadAddressRange(uint64_t LowPC, Optional<uint64_t> HighPC,
- uint16_t Version) {
- if (LowPC == 0)
- return true;
-
- if ((Version <= 4) && HighPC && (LowPC == 1 && *HighPC == 1))
- return true;
-
- return !isInsideExecutableSectionsAddressRange(LowPC, HighPC);
- }
-
- uint64_t isMAXPCDeadAddressRange(uint64_t LowPC, Optional<uint64_t> HighPC,
- uint16_t Version, uint8_t AddressByteSize) {
- if (Version <= 4 && HighPC) {
- if (LowPC == (dwarf::computeTombstoneAddress(AddressByteSize) - 1))
- return true;
- } else if (LowPC == dwarf::computeTombstoneAddress(AddressByteSize))
- return true;
-
- if (!isInsideExecutableSectionsAddressRange(LowPC, HighPC))
- warning("Address referencing invalid text section is not marked with "
- "tombstone value");
-
- return false;
- }
-
- bool isDeadAddressRange(uint64_t LowPC, Optional<uint64_t> HighPC,
- uint16_t Version, TombstoneKind Tombstone,
- uint8_t AddressByteSize) {
- switch (Tombstone) {
- case TombstoneKind::BFD:
- return isBFDDeadAddressRange(LowPC, HighPC, Version);
- case TombstoneKind::MaxPC:
- return isMAXPCDeadAddressRange(LowPC, HighPC, Version, AddressByteSize);
- case TombstoneKind::Universal:
- return isBFDDeadAddressRange(LowPC, HighPC, Version) ||
- isMAXPCDeadAddressRange(LowPC, HighPC, Version, AddressByteSize);
- case TombstoneKind::Exec:
- return !isInsideExecutableSectionsAddressRange(LowPC, HighPC);
- }
-
- llvm_unreachable("Unknown tombstone value");
- }
-
- bool isDeadAddress(uint64_t LowPC, uint16_t Version, TombstoneKind Tombstone,
- uint8_t AddressByteSize) {
- return isDeadAddressRange(LowPC, None, Version, Tombstone, AddressByteSize);
- }
-
-private:
- RangesTy DWARFAddressRanges;
- RangesTy TextAddressRanges;
- const Options &Opts;
-};
-
-bool linkDebugInfo(object::ObjectFile &File, const Options &Options,
- raw_pwrite_stream &OutStream) {
-
- auto ReportWarn = [&](const Twine &Message, StringRef Context,
- const DWARFDie *Die) {
- warning(Message, Context);
-
- if (!Options.Verbose || !Die)
- return;
-
- DIDumpOptions DumpOpts;
- DumpOpts.ChildRecurseDepth = 0;
- DumpOpts.Verbose = Options.Verbose;
-
- WithColor::note() << " in DIE:\n";
- Die->dump(errs(), /*Indent=*/6, DumpOpts);
- };
- auto ReportErr = [&](const Twine &Message, StringRef Context,
- const DWARFDie *) {
- WithColor::error(errs(), Context) << Message << '\n';
- };
-
- // Create output streamer.
- DwarfStreamer OutStreamer(OutputFileType::Object, OutStream, nullptr,
- ReportWarn, ReportWarn);
- if (!OutStreamer.init(File.makeTriple(), ""))
- return false;
-
- // Create DWARF linker.
- DWARFLinker DebugInfoLinker(&OutStreamer, DwarfLinkerClient::LLD);
-
- DebugInfoLinker.setEstimatedObjfilesAmount(1);
- DebugInfoLinker.setAccelTableKind(DwarfLinkerAccelTableKind::None);
- DebugInfoLinker.setErrorHandler(ReportErr);
- DebugInfoLinker.setWarningHandler(ReportWarn);
- DebugInfoLinker.setNumThreads(Options.NumThreads);
- DebugInfoLinker.setNoODR(!Options.DoODRDeduplication);
- DebugInfoLinker.setVerbosity(Options.Verbose);
- DebugInfoLinker.setUpdate(!Options.DoGarbageCollection);
-
- std::vector<std::unique_ptr<DWARFFile>> ObjectsForLinking(1);
- std::vector<std::unique_ptr<AddressesMap>> AddresssMapForLinking(1);
- std::vector<std::string> EmptyWarnings;
-
- std::unique_ptr<DWARFContext> Context = DWARFContext::create(File);
-
- // Add object files to the DWARFLinker.
- AddresssMapForLinking[0] =
- std::make_unique<ObjFileAddressMap>(*Context, Options, File);
-
- ObjectsForLinking[0] = std::make_unique<DWARFFile>(
- File.getFileName(), &*Context, AddresssMapForLinking[0].get(),
- EmptyWarnings);
-
- for (size_t I = 0; I < ObjectsForLinking.size(); I++)
- DebugInfoLinker.addObjectFile(*ObjectsForLinking[I]);
-
- // Link debug info.
- DebugInfoLinker.link();
- OutStreamer.finish();
- return true;
-}
-
-} // end of namespace dwarfutil
-} // end of namespace llvm
diff --git a/llvm/tools/llvm-dwarfutil/DebugInfoLinker.h b/llvm/tools/llvm-dwarfutil/DebugInfoLinker.h
deleted file mode 100644
index e95c83cb96090..0000000000000
--- a/llvm/tools/llvm-dwarfutil/DebugInfoLinker.h
+++ /dev/null
@@ -1,31 +0,0 @@
-//===- DebugInfoLinker.h ----------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TOOLS_LLVM_DWARFUTIL_DEBUGINFOLINKER_H
-#define LLVM_TOOLS_LLVM_DWARFUTIL_DEBUGINFOLINKER_H
-
-#include "Options.h"
-#include "llvm/Object/Archive.h"
-#include "llvm/Object/ELFObjectFile.h"
-#include "llvm/Object/ObjectFile.h"
-
-namespace llvm {
-namespace dwarfutil {
-
-inline bool isDebugSection(StringRef SecName) {
- return SecName.startswith(".debug") || SecName.startswith(".zdebug") ||
- SecName == ".gdb_index";
-}
-
-bool linkDebugInfo(object::ObjectFile &file, const Options &Options,
- raw_pwrite_stream &OutStream);
-
-} // end of namespace dwarfutil
-} // end of namespace llvm
-
-#endif // LLVM_TOOLS_LLVM_DWARFUTIL_DEBUGINFOLINKER_H
diff --git a/llvm/tools/llvm-dwarfutil/Error.h b/llvm/tools/llvm-dwarfutil/Error.h
deleted file mode 100644
index 9ef288d4f6573..0000000000000
--- a/llvm/tools/llvm-dwarfutil/Error.h
+++ /dev/null
@@ -1,44 +0,0 @@
-//===- Error.h --------------------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TOOLS_LLVM_DWARFUTIL_ERROR_H
-#define LLVM_TOOLS_LLVM_DWARFUTIL_ERROR_H
-
-#include "llvm/ADT/STLExtras.h"
-#include "llvm/ADT/StringRef.h"
-#include "llvm/ADT/StringSet.h"
-#include "llvm/ADT/Triple.h"
-#include "llvm/Support/Debug.h"
-#include "llvm/Support/Error.h"
-#include "llvm/Support/Format.h"
-#include "llvm/Support/WithColor.h"
-#include "llvm/Support/raw_ostream.h"
-
-namespace llvm {
-namespace dwarfutil {
-
-inline void error(Error Err, StringRef Prefix = "") {
- handleAllErrors(std::move(Err), [&](ErrorInfoBase &Info) {
- WithColor::error(errs(), Prefix) << Info.message() << '\n';
- });
- std::exit(EXIT_FAILURE);
-}
-
-inline void warning(const Twine &Message, StringRef Prefix = "") {
- WithColor::warning(errs(), Prefix) << Message << '\n';
-}
-
-inline void verbose(const Twine &Message, bool Verbose) {
- if (Verbose)
- outs() << Message << '\n';
-}
-
-} // end of namespace dwarfutil
-} // end of namespace llvm
-
-#endif // LLVM_TOOLS_LLVM_DWARFUTIL_ERROR_H
diff --git a/llvm/tools/llvm-dwarfutil/Options.h b/llvm/tools/llvm-dwarfutil/Options.h
deleted file mode 100644
index c993200ceb4b7..0000000000000
--- a/llvm/tools/llvm-dwarfutil/Options.h
+++ /dev/null
@@ -1,46 +0,0 @@
-//===- Options.h ------------------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TOOLS_LLVM_DWARFUTIL_OPTIONS_H
-#define LLVM_TOOLS_LLVM_DWARFUTIL_OPTIONS_H
-
-#include "llvm/ADT/SmallString.h"
-#include "llvm/ADT/StringRef.h"
-
-namespace llvm {
-namespace dwarfutil {
-
-/// The kind of tombstone value.
-enum class TombstoneKind {
- BFD, /// 0/[1:1]. Bfd default.
- MaxPC, /// -1/-2. Assumed to match with
- /// http://www.dwarfstd.org/ShowIssue.php?issue=200609.1.
- Universal, /// both: BFD + MaxPC
- Exec, /// match with address range of executable sections.
-};
-
-struct Options {
- std::string InputFileName;
- std::string OutputFileName;
- bool DoGarbageCollection = false;
- bool DoODRDeduplication = false;
- bool BuildSeparateDebugFile = false;
- TombstoneKind Tombstone = TombstoneKind::Universal;
- bool Verbose = false;
- int NumThreads = 0;
- bool Verify = false;
-
- std::string getSeparateDebugFileName() const {
- return OutputFileName + ".debug";
- }
-};
-
-} // namespace dwarfutil
-} // namespace llvm
-
-#endif // LLVM_TOOLS_LLVM_DWARFUTIL_OPTIONS_H
diff --git a/llvm/tools/llvm-dwarfutil/Options.td b/llvm/tools/llvm-dwarfutil/Options.td
deleted file mode 100644
index 4ab1b51d808d8..0000000000000
--- a/llvm/tools/llvm-dwarfutil/Options.td
+++ /dev/null
@@ -1,65 +0,0 @@
-include "llvm/Option/OptParser.td"
-
-multiclass BB<string name, string help1, string help2> {
- def NAME: Flag<["--"], name>, HelpText<help1>;
- def no_ # NAME: Flag<["--"], "no-" # name>, HelpText<help2>;
-}
-
-def help : Flag<["--"], "help">,
- HelpText<"Prints this help output">;
-
-def h : Flag<["-"], "h">,
- Alias<help>,
- HelpText<"Alias for --help">;
-
-defm odr_deduplication : BB<"odr-deduplication",
- "Do ODR deduplication for debug types(default)",
- "Don`t do ODR deduplication for debug types">;
-
-def odr : Flag<["--"], "odr">,
- Alias<odr_deduplication>,
- HelpText<"Alias for --odr-deduplication">;
-
-def no_odr : Flag<["--"], "no-odr">,
- Alias<no_odr_deduplication>,
- HelpText<"Alias for --no-odr-deduplication">;
-
-defm garbage_collection : BB<"garbage-collection",
- "Do garbage collection for debug info(default)",
- "Don`t do garbage collection for debug info">;
-
-defm separate_debug_file : BB<"separate-debug-file",
- "Create two output files: file w/o debug tables and file with debug tables",
- "Create single output file, containing debug tables(default)">;
-
-def tombstone: Separate<["--", "-"], "tombstone">,
- MetaVarName<"[bfd,maxpc,exec,universal]">,
- HelpText<"Tombstone value used as a marker of invalid address(default: universal)\n"
- " =bfd - Zero for all addresses and [1,1] for DWARF v4 (or less) address ranges and exec\n"
- " =maxpc - Minus 1 for all addresses and minus 2 for DWARF v4 (or less) address ranges\n"
- " =exec - Match with address ranges of executable sections\n"
- " =universal - Both: bfd and maxpc"
- >;
-def: Joined<["--", "-"], "tombstone=">, Alias<tombstone>;
-
-def threads: Separate<["--", "-"], "num-threads">,
- MetaVarName<"<threads>">,
- HelpText<"Number of available threads for multi-threaded execution. "
- "Defaults to the number of cores on the current machine">;
-
-def: Separate<["-"], "j">,
- Alias<threads>,
- HelpText<"Alias for --num-threads">;
-
-def verbose : Flag<["--"], "verbose">,
- HelpText<"Enable verbose logging">;
-
-def verify : Flag<["--"], "verify">,
- HelpText<"Run the DWARF verifier on the resulting debug info">;
-
-def version : Flag<["--"], "version">,
- HelpText<"Print the version and exit">;
-
-def V : Flag<["-"], "V">,
- Alias<version>,
- HelpText<"Alias for --version">;
diff --git a/llvm/tools/llvm-dwarfutil/llvm-dwarfutil.cpp b/llvm/tools/llvm-dwarfutil/llvm-dwarfutil.cpp
deleted file mode 100644
index e77c82e0fad9a..0000000000000
--- a/llvm/tools/llvm-dwarfutil/llvm-dwarfutil.cpp
+++ /dev/null
@@ -1,527 +0,0 @@
-//=== llvm-dwarfutil.cpp --------------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "DebugInfoLinker.h"
-#include "Error.h"
-#include "Options.h"
-#include "llvm/DebugInfo/DWARF/DWARFContext.h"
-#include "llvm/DebugInfo/DWARF/DWARFVerifier.h"
-#include "llvm/MC/MCTargetOptionsCommandFlags.h"
-#include "llvm/ObjCopy/CommonConfig.h"
-#include "llvm/ObjCopy/ConfigManager.h"
-#include "llvm/ObjCopy/ObjCopy.h"
-#include "llvm/Option/Arg.h"
-#include "llvm/Option/ArgList.h"
-#include "llvm/Option/Option.h"
-#include "llvm/Support/CRC.h"
-#include "llvm/Support/CommandLine.h"
-#include "llvm/Support/FileUtilities.h"
-#include "llvm/Support/InitLLVM.h"
-#include "llvm/Support/PrettyStackTrace.h"
-#include "llvm/Support/Process.h"
-#include "llvm/Support/Signals.h"
-#include "llvm/Support/TargetSelect.h"
-
-using namespace llvm;
-using namespace object;
-
-namespace {
-enum ID {
- OPT_INVALID = 0, // This is not an option ID.
-#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
- HELPTEXT, METAVAR, VALUES) \
- OPT_##ID,
-#include "Options.inc"
-#undef OPTION
-};
-
-#define PREFIX(NAME, VALUE) const char *const NAME[] = VALUE;
-#include "Options.inc"
-#undef PREFIX
-
-const opt::OptTable::Info InfoTable[] = {
-#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
- HELPTEXT, METAVAR, VALUES) \
- { \
- PREFIX, NAME, HELPTEXT, \
- METAVAR, OPT_##ID, opt::Option::KIND##Class, \
- PARAM, FLAGS, OPT_##GROUP, \
- OPT_##ALIAS, ALIASARGS, VALUES},
-#include "Options.inc"
-#undef OPTION
-};
-
-class DwarfutilOptTable : public opt::OptTable {
-public:
- DwarfutilOptTable() : OptTable(InfoTable) {}
-};
-} // namespace
-
-namespace llvm {
-namespace dwarfutil {
-
-std::string ToolName;
-
-static mc::RegisterMCTargetOptionsFlags MOF;
-
-static Error validateAndSetOptions(opt::InputArgList &Args, Options &Options) {
- auto UnknownArgs = Args.filtered(OPT_UNKNOWN);
- if (!UnknownArgs.empty())
- return createStringError(
- std::errc::invalid_argument,
- formatv("unknown option: {0}", (*UnknownArgs.begin())->getSpelling())
- .str()
- .c_str());
-
- std::vector<std::string> InputFiles = Args.getAllArgValues(OPT_INPUT);
- if (InputFiles.size() != 2)
- return createStringError(
- std::errc::invalid_argument,
- formatv("exactly two positional arguments expected, {0} provided",
- InputFiles.size())
- .str()
- .c_str());
-
- Options.InputFileName = InputFiles[0];
- Options.OutputFileName = InputFiles[1];
-
- Options.BuildSeparateDebugFile =
- Args.hasFlag(OPT_separate_debug_file, OPT_no_separate_debug_file, false);
- Options.DoODRDeduplication =
- Args.hasFlag(OPT_odr_deduplication, OPT_no_odr_deduplication, true);
- Options.DoGarbageCollection =
- Args.hasFlag(OPT_garbage_collection, OPT_no_garbage_collection, true);
- Options.Verbose = Args.hasArg(OPT_verbose);
- Options.Verify = Args.hasArg(OPT_verify);
-
- if (opt::Arg *NumThreads = Args.getLastArg(OPT_threads))
- Options.NumThreads = atoi(NumThreads->getValue());
- else
- Options.NumThreads = 0; // Use all available hardware threads
-
- if (opt::Arg *Tombstone = Args.getLastArg(OPT_tombstone)) {
- StringRef S = Tombstone->getValue();
- if (S == "bfd")
- Options.Tombstone = TombstoneKind::BFD;
- else if (S == "maxpc")
- Options.Tombstone = TombstoneKind::MaxPC;
- else if (S == "universal")
- Options.Tombstone = TombstoneKind::Universal;
- else if (S == "exec")
- Options.Tombstone = TombstoneKind::Exec;
- else
- return createStringError(
- std::errc::invalid_argument,
- formatv("unknown tombstone value: '{0}'", S).str().c_str());
- }
-
- if (Options.Verbose) {
- if (Options.NumThreads != 1 && Args.hasArg(OPT_threads))
- warning("--num-threads set to 1 because verbose mode is specified");
-
- Options.NumThreads = 1;
- }
-
- if (Options.DoODRDeduplication && Args.hasArg(OPT_odr_deduplication) &&
- !Options.DoGarbageCollection)
- return createStringError(
- std::errc::invalid_argument,
- "cannot use --odr-deduplication without --garbage-collection");
-
- if (Options.BuildSeparateDebugFile && Options.OutputFileName == "-")
- return createStringError(
- std::errc::invalid_argument,
- "unable to write to stdout when --separate-debug-file specified");
-
- return Error::success();
-}
-
-static Error setConfigToAddNewDebugSections(objcopy::ConfigManager &Config,
- ObjectFile &ObjFile) {
- // Add new debug sections.
- for (SectionRef Sec : ObjFile.sections()) {
- Expected<StringRef> SecName = Sec.getName();
- if (!SecName)
- return SecName.takeError();
-
- if (isDebugSection(*SecName)) {
- Expected<StringRef> SecData = Sec.getContents();
- if (!SecData)
- return SecData.takeError();
-
- Config.Common.AddSection.emplace_back(objcopy::NewSectionInfo(
- *SecName, MemoryBuffer::getMemBuffer(*SecData, *SecName, false)));
- }
- }
-
- return Error::success();
-}
-
-static Error verifyOutput(const Options &Opts) {
- if (Opts.OutputFileName == "-") {
- warning("verification skipped because writing to stdout");
- return Error::success();
- }
-
- std::string FileName = Opts.BuildSeparateDebugFile
- ? Opts.getSeparateDebugFileName()
- : Opts.OutputFileName;
- Expected<OwningBinary<Binary>> BinOrErr = createBinary(FileName);
- if (!BinOrErr)
- return createFileError(FileName, BinOrErr.takeError());
-
- if (BinOrErr->getBinary()->isObject()) {
- if (ObjectFile *Obj = static_cast<ObjectFile *>(BinOrErr->getBinary())) {
- verbose("Verifying DWARF...", Opts.Verbose);
- std::unique_ptr<DWARFContext> DICtx = DWARFContext::create(*Obj);
- DIDumpOptions DumpOpts;
- if (!DICtx->verify(Opts.Verbose ? outs() : nulls(),
- DumpOpts.noImplicitRecursion()))
- return createFileError(FileName,
- createError("output verification failed"));
-
- return Error::success();
- }
- }
-
- // The file "FileName" was created by this utility in the previous steps
- // (i.e. it is already known that it should pass the isObject check).
- // If the createBinary() function does not return an error, the isObject
- // check should also be successful.
- llvm_unreachable(
- formatv("tool unexpectedly did not emit a supported object file: '{0}'",
- FileName)
- .str()
- .c_str());
-}
-
-class raw_crc_ostream : public raw_ostream {
-public:
- explicit raw_crc_ostream(raw_ostream &O) : OS(O) { SetUnbuffered(); }
-
- void reserveExtraSpace(uint64_t ExtraSize) override {
- OS.reserveExtraSpace(ExtraSize);
- }
-
- uint32_t getCRC32() { return CRC32; }
-
-protected:
- raw_ostream &OS;
- uint32_t CRC32 = 0;
-
- /// See raw_ostream::write_impl.
- void write_impl(const char *Ptr, size_t Size) override {
- CRC32 = crc32(
- CRC32, ArrayRef<uint8_t>(reinterpret_cast<const uint8_t *>(Ptr), Size));
- OS.write(Ptr, Size);
- }
-
- /// Return the current position within the stream, not counting the bytes
- /// currently in the buffer.
- uint64_t current_pos() const override { return OS.tell(); }
-};
-
-static Expected<uint32_t> saveSeparateDebugInfo(const Options &Opts,
- ObjectFile &InputFile) {
- objcopy::ConfigManager Config;
- std::string OutputFilename = Opts.getSeparateDebugFileName();
- Config.Common.InputFilename = Opts.InputFileName;
- Config.Common.OutputFilename = OutputFilename;
- Config.Common.OnlyKeepDebug = true;
- uint32_t WrittenFileCRC32 = 0;
-
- if (Error Err = writeToOutput(
- Config.Common.OutputFilename, [&](raw_ostream &OutFile) -> Error {
- raw_crc_ostream CRCBuffer(OutFile);
- if (Error Err = objcopy::executeObjcopyOnBinary(Config, InputFile,
- CRCBuffer))
- return Err;
-
- WrittenFileCRC32 = CRCBuffer.getCRC32();
- return Error::success();
- }))
- return std::move(Err);
-
- return WrittenFileCRC32;
-}
-
-static Error saveNonDebugInfo(const Options &Opts, ObjectFile &InputFile,
- uint32_t GnuDebugLinkCRC32) {
- objcopy::ConfigManager Config;
- Config.Common.InputFilename = Opts.InputFileName;
- Config.Common.OutputFilename = Opts.OutputFileName;
- Config.Common.StripDebug = true;
- std::string SeparateDebugFileName = Opts.getSeparateDebugFileName();
- Config.Common.AddGnuDebugLink = sys::path::filename(SeparateDebugFileName);
- Config.Common.GnuDebugLinkCRC32 = GnuDebugLinkCRC32;
-
- if (Error Err = writeToOutput(
- Config.Common.OutputFilename, [&](raw_ostream &OutFile) -> Error {
- if (Error Err =
- objcopy::executeObjcopyOnBinary(Config, InputFile, OutFile))
- return Err;
-
- return Error::success();
- }))
- return Err;
-
- return Error::success();
-}
-
-static Error splitDebugIntoSeparateFile(const Options &Opts,
- ObjectFile &InputFile) {
- Expected<uint32_t> SeparateDebugFileCRC32OrErr =
- saveSeparateDebugInfo(Opts, InputFile);
- if (!SeparateDebugFileCRC32OrErr)
- return SeparateDebugFileCRC32OrErr.takeError();
-
- if (Error Err =
- saveNonDebugInfo(Opts, InputFile, *SeparateDebugFileCRC32OrErr))
- return Err;
-
- return Error::success();
-}
-
-using DebugInfoBits = SmallString<10000>;
-
-static Error addSectionsFromLinkedData(objcopy::ConfigManager &Config,
- ObjectFile &InputFile,
- DebugInfoBits &LinkedDebugInfoBits) {
- if (dyn_cast<ELFObjectFile<ELF32LE>>(&InputFile)) {
- Expected<ELFObjectFile<ELF32LE>> MemFile = ELFObjectFile<ELF32LE>::create(
- MemoryBufferRef(LinkedDebugInfoBits, ""));
- if (!MemFile)
- return MemFile.takeError();
-
- if (Error Err = setConfigToAddNewDebugSections(Config, *MemFile))
- return Err;
- } else if (dyn_cast<ELFObjectFile<ELF64LE>>(&InputFile)) {
- Expected<ELFObjectFile<ELF64LE>> MemFile = ELFObjectFile<ELF64LE>::create(
- MemoryBufferRef(LinkedDebugInfoBits, ""));
- if (!MemFile)
- return MemFile.takeError();
-
- if (Error Err = setConfigToAddNewDebugSections(Config, *MemFile))
- return Err;
- } else if (dyn_cast<ELFObjectFile<ELF32BE>>(&InputFile)) {
- Expected<ELFObjectFile<ELF32BE>> MemFile = ELFObjectFile<ELF32BE>::create(
- MemoryBufferRef(LinkedDebugInfoBits, ""));
- if (!MemFile)
- return MemFile.takeError();
-
- if (Error Err = setConfigToAddNewDebugSections(Config, *MemFile))
- return Err;
- } else if (dyn_cast<ELFObjectFile<ELF64BE>>(&InputFile)) {
- Expected<ELFObjectFile<ELF64BE>> MemFile = ELFObjectFile<ELF64BE>::create(
- MemoryBufferRef(LinkedDebugInfoBits, ""));
- if (!MemFile)
- return MemFile.takeError();
-
- if (Error Err = setConfigToAddNewDebugSections(Config, *MemFile))
- return Err;
- } else
- return createStringError(std::errc::invalid_argument,
- "unsupported file format");
-
- return Error::success();
-}
-
-static Expected<uint32_t>
-saveSeparateLinkedDebugInfo(const Options &Opts, ObjectFile &InputFile,
- DebugInfoBits LinkedDebugInfoBits) {
- objcopy::ConfigManager Config;
- std::string OutputFilename = Opts.getSeparateDebugFileName();
- Config.Common.InputFilename = Opts.InputFileName;
- Config.Common.OutputFilename = OutputFilename;
- Config.Common.StripDebug = true;
- Config.Common.OnlyKeepDebug = true;
- uint32_t WrittenFileCRC32 = 0;
-
- if (Error Err =
- addSectionsFromLinkedData(Config, InputFile, LinkedDebugInfoBits))
- return std::move(Err);
-
- if (Error Err = writeToOutput(
- Config.Common.OutputFilename, [&](raw_ostream &OutFile) -> Error {
- raw_crc_ostream CRCBuffer(OutFile);
-
- if (Error Err = objcopy::executeObjcopyOnBinary(Config, InputFile,
- CRCBuffer))
- return Err;
-
- WrittenFileCRC32 = CRCBuffer.getCRC32();
- return Error::success();
- }))
- return std::move(Err);
-
- return WrittenFileCRC32;
-}
-
-static Error saveSingleLinkedDebugInfo(const Options &Opts,
- ObjectFile &InputFile,
- DebugInfoBits LinkedDebugInfoBits) {
- objcopy::ConfigManager Config;
-
- Config.Common.InputFilename = Opts.InputFileName;
- Config.Common.OutputFilename = Opts.OutputFileName;
- Config.Common.StripDebug = true;
- if (Error Err =
- addSectionsFromLinkedData(Config, InputFile, LinkedDebugInfoBits))
- return Err;
-
- if (Error Err = writeToOutput(
- Config.Common.OutputFilename, [&](raw_ostream &OutFile) -> Error {
- return objcopy::executeObjcopyOnBinary(Config, InputFile, OutFile);
- }))
- return Err;
-
- return Error::success();
-}
-
-static Error saveLinkedDebugInfo(const Options &Opts, ObjectFile &InputFile,
- DebugInfoBits LinkedDebugInfoBits) {
- if (Opts.BuildSeparateDebugFile) {
- Expected<uint32_t> SeparateDebugFileCRC32OrErr =
- saveSeparateLinkedDebugInfo(Opts, InputFile,
- std::move(LinkedDebugInfoBits));
- if (!SeparateDebugFileCRC32OrErr)
- return SeparateDebugFileCRC32OrErr.takeError();
-
- if (Error Err =
- saveNonDebugInfo(Opts, InputFile, *SeparateDebugFileCRC32OrErr))
- return Err;
- } else {
- if (Error Err = saveSingleLinkedDebugInfo(Opts, InputFile,
- std::move(LinkedDebugInfoBits)))
- return Err;
- }
-
- return Error::success();
-}
-
-static Error saveCopyOfFile(const Options &Opts, ObjectFile &InputFile) {
- objcopy::ConfigManager Config;
-
- Config.Common.InputFilename = Opts.InputFileName;
- Config.Common.OutputFilename = Opts.OutputFileName;
-
- if (Error Err = writeToOutput(
- Config.Common.OutputFilename, [&](raw_ostream &OutFile) -> Error {
- return objcopy::executeObjcopyOnBinary(Config, InputFile, OutFile);
- }))
- return Err;
-
- return Error::success();
-}
-
-static Error applyCLOptions(const struct Options &Opts, ObjectFile &InputFile) {
- if (Opts.DoGarbageCollection) {
- verbose("Do garbage collection for debug info ...", Opts.Verbose);
-
- DebugInfoBits LinkedDebugInfo;
- raw_svector_ostream OutStream(LinkedDebugInfo);
-
- if (linkDebugInfo(InputFile, Opts, OutStream)) {
- if (Error Err =
- saveLinkedDebugInfo(Opts, InputFile, std::move(LinkedDebugInfo)))
- return Err;
-
- return Error::success();
- }
-
- return createStringError(std::errc::invalid_argument,
- "possible broken debug info");
- } else if (Opts.BuildSeparateDebugFile) {
- if (Error Err = splitDebugIntoSeparateFile(Opts, InputFile))
- return Err;
- } else {
- if (Error Err = saveCopyOfFile(Opts, InputFile))
- return Err;
- }
-
- return Error::success();
-}
-
-} // end of namespace dwarfutil
-} // end of namespace llvm
-
-int main(int Argc, char const *Argv[]) {
- using namespace dwarfutil;
-
- InitLLVM X(Argc, Argv);
- ToolName = Argv[0];
-
- // Parse arguments.
- DwarfutilOptTable T;
- unsigned MAI;
- unsigned MAC;
- ArrayRef<const char *> ArgsArr = makeArrayRef(Argv + 1, Argc - 1);
- opt::InputArgList Args = T.ParseArgs(ArgsArr, MAI, MAC);
-
- if (Args.hasArg(OPT_help) || Args.size() == 0) {
- T.printHelp(
- outs(), (ToolName + " [options] <input file> <output file>").c_str(),
- "llvm-dwarfutil is a tool to copy and manipulate debug info", false);
- return EXIT_SUCCESS;
- }
-
- if (Args.hasArg(OPT_version)) {
- cl::PrintVersionMessage();
- return EXIT_SUCCESS;
- }
-
- Options Opts;
- if (Error Err = validateAndSetOptions(Args, Opts))
- error(std::move(Err), dwarfutil::ToolName);
-
- InitializeAllTargets();
- InitializeAllTargetMCs();
- InitializeAllTargetInfos();
- InitializeAllAsmPrinters();
- InitializeAllAsmParsers();
-
- ErrorOr<std::unique_ptr<MemoryBuffer>> BuffOrErr =
- MemoryBuffer::getFileOrSTDIN(Opts.InputFileName);
- if (BuffOrErr.getError())
- error(createFileError(Opts.InputFileName, BuffOrErr.getError()));
-
- Expected<std::unique_ptr<Binary>> BinOrErr =
- object::createBinary(**BuffOrErr);
- if (!BinOrErr)
- error(createFileError(Opts.InputFileName, BinOrErr.takeError()));
-
- Expected<FilePermissionsApplier> PermsApplierOrErr =
- FilePermissionsApplier::create(Opts.InputFileName);
- if (!PermsApplierOrErr)
- error(createFileError(Opts.InputFileName, PermsApplierOrErr.takeError()));
-
- if (!(*BinOrErr)->isObject())
- error(createFileError(Opts.InputFileName,
- createError("unsupported input file")));
-
- if (Error Err =
- applyCLOptions(Opts, *static_cast<ObjectFile *>((*BinOrErr).get())))
- error(createFileError(Opts.InputFileName, std::move(Err)));
-
- BinOrErr->reset();
- BuffOrErr->reset();
-
- if (Error Err = PermsApplierOrErr->apply(Opts.OutputFileName))
- error(std::move(Err));
-
- if (Opts.BuildSeparateDebugFile)
- if (Error Err = PermsApplierOrErr->apply(Opts.getSeparateDebugFileName()))
- error(std::move(Err));
-
- if (Opts.Verify) {
- if (Error Err = verifyOutput(Opts))
- error(std::move(Err));
- }
-
- return EXIT_SUCCESS;
-}
More information about the llvm-commits
mailing list