Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[ELF] - Partial support of --gdb-index command line option (Part 1).
In this patch partial gdb_index section is created. For costructing the .gdb_index section 6 steps should be performed (details are in SplitDebugInfo.cpp file header), this patch do first 3: Creates proper section header. Fills list of compilation units. Types CU list area is not supposed to be supported, so it is ignored and therefore can be treated as implemented either. Differential revision: https://reviews.llvm.org/D24706 llvm-svn: 284708
- Loading branch information
George Rimar
committed
Oct 20, 2016
1 parent
656d821
commit 58fa524
Showing
12 changed files
with
262 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
//===- GdbIndex.cpp -------------------------------------------------------===// | ||
// | ||
// The LLVM Linker | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// File contains classes for implementation of --gdb-index command line option. | ||
// | ||
// If that option is used, linker should emit a .gdb_index section that allows | ||
// debugger to locate and read .dwo files, containing neccessary debug | ||
// information. | ||
// More information about implementation can be found in DWARF specification, | ||
// latest version is available at http://dwarfstd.org. | ||
// | ||
// .gdb_index section format: | ||
// (Information is based on/taken from | ||
// https://sourceware.org/gdb/onlinedocs/gdb/Index-Section-Format.html (*)) | ||
// | ||
// A mapped index consists of several areas, laid out in order: | ||
// 1) The file header. | ||
// 2) "The CU (compilation unit) list. This is a sequence of pairs of 64-bit | ||
// little-endian values, sorted by the CU offset. The first element in each | ||
// pair is the offset of a CU in the .debug_info section. The second element | ||
// in each pair is the length of that CU. References to a CU elsewhere in the | ||
// map are done using a CU index, which is just the 0-based index into this | ||
// table. Note that if there are type CUs, then conceptually CUs and type CUs | ||
// form a single list for the purposes of CU indices."(*) | ||
// 3) The types CU list. Depricated as .debug_types does not appear in the DWARF | ||
// v5 specification. | ||
// 4) The address area. The address area is a sequence of address | ||
// entries, where each entrie contains low address, high address and CU | ||
// index. | ||
// 5) "The symbol table. This is an open-addressed hash table. The size of the | ||
// hash table is always a power of 2. Each slot in the hash table consists of | ||
// a pair of offset_type values. The first value is the offset of the | ||
// symbol's name in the constant pool. The second value is the offset of the | ||
// CU vector in the constant pool."(*) | ||
// 6) "The constant pool. This is simply a bunch of bytes. It is organized so | ||
// that alignment is correct: CU vectors are stored first, followed by | ||
// strings." (*) | ||
// | ||
// For constructing the .gdb_index section following steps should be performed: | ||
// 1) For file header nothing special should be done. It contains the offsets to | ||
// the areas below. | ||
// 2) Scan the compilation unit headers of the .debug_info sections to build a | ||
// list of compilation units. | ||
// 3) CU Types are no longer needed as DWARF skeleton type units never made it | ||
// into the standard. lld does nothing to support parsing of .debug_types | ||
// and generates empty types CU area in .gdb_index section. | ||
// 4) Address area entries are extracted from DW_TAG_compile_unit DIEs of | ||
// .debug_info sections. | ||
// 5) For building the symbol table linker extracts the public names from the | ||
// .debug_gnu_pubnames and .debug_gnu_pubtypes sections. Then it builds the | ||
// hashtable in according to .gdb_index format specification. | ||
// 6) Constant pool is populated at the same time as symbol table. | ||
// | ||
// Current version of implementation has 1, 2, 3 steps. So it writes .gdb_index | ||
// header and list of compilation units. Since we so not plan to support types | ||
// CU list area, it is also empty and so far is "implemented". | ||
// Other data areas are not yet implemented. | ||
//===----------------------------------------------------------------------===// | ||
|
||
#include "GdbIndex.h" | ||
|
||
#include "llvm/DebugInfo/DWARF/DWARFContext.h" | ||
|
||
using namespace llvm; | ||
using namespace llvm::object; | ||
|
||
template <class ELFT> | ||
std::vector<std::pair<typename ELFT::uint, typename ELFT::uint>> | ||
lld::elf::readCuList(InputSection<ELFT> *DebugInfoSec) { | ||
typedef typename ELFT::uint uintX_t; | ||
|
||
std::unique_ptr<DWARFContext> Dwarf; | ||
if (Expected<std::unique_ptr<object::ObjectFile>> Obj = | ||
object::ObjectFile::createObjectFile(DebugInfoSec->getFile()->MB)) | ||
Dwarf.reset(new DWARFContextInMemory(*Obj.get())); | ||
|
||
if (!Dwarf) { | ||
error(getFilename(DebugInfoSec->getFile()) + | ||
": error creating DWARF context"); | ||
return {}; | ||
} | ||
|
||
std::vector<std::pair<uintX_t, uintX_t>> Ret; | ||
for (std::unique_ptr<DWARFCompileUnit> &CU : Dwarf->compile_units()) | ||
Ret.push_back( | ||
{DebugInfoSec->OutSecOff + CU->getOffset(), CU->getLength() + 4}); | ||
return Ret; | ||
} | ||
|
||
template std::vector<std::pair<uint32_t, uint32_t>> | ||
lld::elf::readCuList<ELF32LE>(InputSection<ELF32LE> *); | ||
template std::vector<std::pair<uint32_t, uint32_t>> | ||
lld::elf::readCuList<ELF32BE>(InputSection<ELF32BE> *); | ||
template std::vector<std::pair<uint64_t, uint64_t>> | ||
lld::elf::readCuList<ELF64LE>(InputSection<ELF64LE> *); | ||
template std::vector<std::pair<uint64_t, uint64_t>> | ||
lld::elf::readCuList<ELF64BE>(InputSection<ELF64BE> *); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
//===- GdbIndex.h --------------------------------------------*- C++ -*-===// | ||
// | ||
// The LLVM Linker | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===-------------------------------------------------------------------===// | ||
|
||
#ifndef LLD_ELF_GDB_INDEX_H | ||
#define LLD_ELF_GDB_INDEX_H | ||
|
||
#include "InputFiles.h" | ||
#include "llvm/Object/ELF.h" | ||
|
||
namespace lld { | ||
namespace elf { | ||
|
||
template <class ELFT> class InputSection; | ||
|
||
template <class ELFT> | ||
std::vector<std::pair<typename ELFT::uint, typename ELFT::uint>> | ||
readCuList(InputSection<ELFT> *Sec); | ||
|
||
} // namespace elf | ||
} // namespace lld | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Binary file not shown.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
## gdb-index-a.elf and gdb-index-b.elf are a test.o and test2.o renamed, | ||
## were generated in this way: | ||
## test.cpp: | ||
## int main() { return 0; } | ||
## test2.cpp: | ||
## int main2() { return 0; } | ||
## Compiled with: | ||
## gcc -gsplit-dwarf -c test.cpp test2.cpp | ||
## gcc version 5.3.1 20160413 | ||
## Info about gdb-index: https://sourceware.org/gdb/onlinedocs/gdb/Index-Section-Format.html | ||
|
||
# REQUIRES: x86 | ||
# RUN: ld.lld --gdb-index -e main %p/Inputs/gdb-index-a.elf %p/Inputs/gdb-index-b.elf -o %t | ||
# RUN: llvm-dwarfdump -debug-dump=gdb_index %t | FileCheck %s | ||
# RUN: llvm-objdump -d %t | FileCheck %s --check-prefix=DISASM | ||
|
||
# DISASM: Disassembly of section .text: | ||
# DISASM: main: | ||
# DISASM-CHECK: 11000: 55 pushq %rbp | ||
# DISASM-CHECK: 11001: 48 89 e5 movq %rsp, %rbp | ||
# DISASM-CHECK: 11004: b8 00 00 00 00 movl $0, %eax | ||
# DISASM-CHECK: 11009: 5d popq %rbp | ||
# DISASM-CHECK: 1100a: c3 retq | ||
# DISASM: _Z5main2v: | ||
# DISASM-CHECK: 1100b: 55 pushq %rbp | ||
# DISASM-CHECK: 1100c: 48 89 e5 movq %rsp, %rbp | ||
# DISASM-CHECK: 1100f: b8 00 00 00 00 movl $0, %eax | ||
# DISASM-CHECK: 11014: 5d popq %rbp | ||
# DISASM-CHECK: 11015: c3 retq | ||
|
||
# CHECK: .gnu_index contents: | ||
# CHECK-NEXT: Version = 7 | ||
# CHECK: CU list offset = 0x18, has 2 entries: | ||
# CHECK-NEXT: 0: Offset = 0x0, Length = 0x34 | ||
# CHECK-NEXT: 1: Offset = 0x34, Length = 0x34 | ||
# CHECK: Address area offset = 0x38, has 0 entries: | ||
# CHECK: Symbol table offset = 0x38, size = 0, filled slots: | ||
# CHECK: Constant pool offset = 0x38, has 0 CU vectors: |