mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
Re-land "[dwarfdump] Add -lookup option"
Add the option to lookup an address in the debug information and print out the file, function, block and line table details. Differential revision: https://reviews.llvm.org/D38409 llvm-svn: 316619
This commit is contained in:
parent
0857f0ce1e
commit
e7361cd27e
@ -17,6 +17,7 @@
|
||||
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/Object/ObjectFile.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include <cassert>
|
||||
#include <cstdint>
|
||||
#include <memory>
|
||||
@ -26,8 +27,6 @@
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class raw_ostream;
|
||||
|
||||
/// A format-neutral container for source line information.
|
||||
struct DILineInfo {
|
||||
std::string FileName;
|
||||
@ -46,15 +45,30 @@ struct DILineInfo {
|
||||
FileName == RHS.FileName && FunctionName == RHS.FunctionName &&
|
||||
StartLine == RHS.StartLine && Discriminator == RHS.Discriminator;
|
||||
}
|
||||
|
||||
bool operator!=(const DILineInfo &RHS) const {
|
||||
return !(*this == RHS);
|
||||
}
|
||||
|
||||
bool operator<(const DILineInfo &RHS) const {
|
||||
return std::tie(FileName, FunctionName, Line, Column, StartLine,
|
||||
Discriminator) <
|
||||
std::tie(RHS.FileName, RHS.FunctionName, RHS.Line, RHS.Column,
|
||||
RHS.StartLine, RHS.Discriminator);
|
||||
}
|
||||
|
||||
explicit operator bool() const { return *this != DILineInfo(); }
|
||||
|
||||
void dump(raw_ostream &OS) {
|
||||
OS << "Line info: ";
|
||||
if (FileName != "<invalid>")
|
||||
OS << "file '" << FileName << "', ";
|
||||
if (FunctionName != "<invalid>")
|
||||
OS << "function '" << FunctionName << "', ";
|
||||
OS << "line " << Line << ", ";
|
||||
OS << "column " << Column << ", ";
|
||||
OS << "start line " << StartLine << '\n';
|
||||
}
|
||||
};
|
||||
|
||||
using DILineInfoTable = SmallVector<std::pair<uint64_t, DILineInfo>, 16>;
|
||||
|
@ -257,6 +257,18 @@ public:
|
||||
/// Get a pointer to a parsed line table corresponding to a compile unit.
|
||||
const DWARFDebugLine::LineTable *getLineTableForUnit(DWARFUnit *cu);
|
||||
|
||||
/// Wraps the returned DIEs for a given address.
|
||||
struct DIEsForAddress {
|
||||
DWARFCompileUnit *CompileUnit = nullptr;
|
||||
DWARFDie FunctionDIE;
|
||||
DWARFDie BlockDIE;
|
||||
explicit operator bool() const { return CompileUnit != nullptr; }
|
||||
};
|
||||
|
||||
/// Get the compilation unit, the function DIE and lexical block DIE for the
|
||||
/// given address where applicable.
|
||||
DIEsForAddress getDIEsForAddress(uint64_t Address);
|
||||
|
||||
DILineInfo getLineInfoForAddress(uint64_t Address,
|
||||
DILineInfoSpecifier Specifier = DILineInfoSpecifier()) override;
|
||||
DILineInfoTable getLineInfoForAddressRange(uint64_t Address, uint64_t Size,
|
||||
|
@ -338,6 +338,11 @@ public:
|
||||
|
||||
void collectAddressRanges(DWARFAddressRangesVector &CURanges);
|
||||
|
||||
/// Returns subprogram DIE with address range encompassing the provided
|
||||
/// address. The pointer is alive as long as parsed compile unit DIEs are not
|
||||
/// cleared.
|
||||
DWARFDie getSubroutineForAddress(uint64_t Address);
|
||||
|
||||
/// getInlinedChainForAddress - fetches inlined chain for a given address.
|
||||
/// Returns empty chain if there is no subprogram containing address. The
|
||||
/// chain is valid as long as parsed compile unit DIEs are not cleared.
|
||||
@ -421,11 +426,6 @@ private:
|
||||
/// parseDWO - Parses .dwo file for current compile unit. Returns true if
|
||||
/// it was actually constructed.
|
||||
bool parseDWO();
|
||||
|
||||
/// getSubroutineForAddress - Returns subprogram DIE with address range
|
||||
/// encompassing the provided address. The pointer is alive as long as parsed
|
||||
/// compile unit DIEs are not cleared.
|
||||
DWARFDie getSubroutineForAddress(uint64_t Address);
|
||||
};
|
||||
|
||||
} // end namespace llvm
|
||||
|
@ -48,7 +48,6 @@
|
||||
#include <cstdint>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <tuple>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
@ -723,6 +722,35 @@ DWARFCompileUnit *DWARFContext::getCompileUnitForAddress(uint64_t Address) {
|
||||
return getCompileUnitForOffset(CUOffset);
|
||||
}
|
||||
|
||||
DWARFContext::DIEsForAddress DWARFContext::getDIEsForAddress(uint64_t Address) {
|
||||
DIEsForAddress Result;
|
||||
|
||||
DWARFCompileUnit *CU = getCompileUnitForAddress(Address);
|
||||
if (!CU)
|
||||
return Result;
|
||||
|
||||
Result.CompileUnit = CU;
|
||||
Result.FunctionDIE = CU->getSubroutineForAddress(Address);
|
||||
|
||||
std::vector<DWARFDie> Worklist;
|
||||
Worklist.push_back(Result.FunctionDIE);
|
||||
while (!Worklist.empty()) {
|
||||
DWARFDie DIE = Worklist.back();
|
||||
Worklist.pop_back();
|
||||
|
||||
if (DIE.getTag() == DW_TAG_lexical_block &&
|
||||
DIE.addressRangeContainsAddress(Address)) {
|
||||
Result.BlockDIE = DIE;
|
||||
break;
|
||||
}
|
||||
|
||||
for (auto Child : DIE)
|
||||
Worklist.push_back(Child);
|
||||
}
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
static bool getFunctionNameAndStartLineForAddress(DWARFCompileUnit *CU,
|
||||
uint64_t Address,
|
||||
FunctionNameKind Kind,
|
||||
|
@ -440,7 +440,7 @@ DWARFDie DWARFUnit::getSibling(const DWARFDebugInfoEntry *Die) {
|
||||
// NULL DIEs don't have siblings.
|
||||
if (Die->getAbbreviationDeclarationPtr() == nullptr)
|
||||
return DWARFDie();
|
||||
|
||||
|
||||
// Find the next DIE whose depth is the same as the Die's depth.
|
||||
for (size_t I = getDIEIndex(Die) + 1, EndIdx = DieArray.size(); I < EndIdx;
|
||||
++I) {
|
||||
|
285
test/tools/llvm-dwarfdump/X86/lookup.s
Normal file
285
test/tools/llvm-dwarfdump/X86/lookup.s
Normal file
@ -0,0 +1,285 @@
|
||||
# RUN: llvm-mc %s -filetype obj -triple x86_64-apple-darwin -o - \
|
||||
# RUN: | llvm-dwarfdump -lookup=0x7fffffff - | \
|
||||
# RUN: FileCheck %s --check-prefix=EMPTY --allow-empty
|
||||
# EMPTY: {{^$}}
|
||||
|
||||
# RUN: llvm-mc %s -filetype obj -triple x86_64-apple-darwin -o - \
|
||||
# RUN: | llvm-dwarfdump -lookup=0x4 - | \
|
||||
# RUN: FileCheck %s -check-prefixes=CHECK,LEX,A
|
||||
|
||||
# RUN: llvm-mc %s -filetype obj -triple x86_64-apple-darwin -o - \
|
||||
# RUN: | llvm-dwarfdump -lookup=0xb - | \
|
||||
# RUN: FileCheck %s -check-prefixes=CHECK,LEX,B
|
||||
|
||||
# RUN: llvm-mc %s -filetype obj -triple x86_64-apple-darwin -o - \
|
||||
# RUN: | llvm-dwarfdump -lookup=0x14 - | \
|
||||
# RUN: FileCheck %s -check-prefixes=CHECK,C
|
||||
|
||||
# CHECK: Compile Unit: length = 0x00000060 version = 0x0004 abbr_offset = 0x0000 addr_size = 0x08 (next unit at 0x00000064)
|
||||
|
||||
# CHECK: DW_TAG_compile_unit
|
||||
# CHECK: DW_AT_name ("foo.c")
|
||||
# CHECK: DW_AT_stmt_list (0x00000000)
|
||||
# CHECK: DW_AT_low_pc (0x0000000000000000)
|
||||
# CHECK: DW_AT_high_pc (0x00000016)
|
||||
|
||||
# CHECK: DW_TAG_subprogram
|
||||
# CHECK: DW_AT_low_pc (0x0000000000000000)
|
||||
# CHECK: DW_AT_high_pc (0x00000016)
|
||||
# CHECK: DW_AT_name ("foo")
|
||||
|
||||
# LEX: DW_TAG_lexical_block
|
||||
# LEX: DW_AT_low_pc (0x0000000000000004)
|
||||
# LEX: DW_AT_high_pc (0x00000010)
|
||||
|
||||
# A: Line info: file 'foo.c', line 3, column 9, start line 1
|
||||
# B: Line info: file 'foo.c', line 4, column 6, start line 1
|
||||
# C: Line info: file 'foo.c', line 6, column 1, start line 1
|
||||
|
||||
.section __TEXT,__text,regular,pure_instructions
|
||||
.macosx_version_min 10, 13
|
||||
.globl _foo ## -- Begin function foo
|
||||
.p2align 4, 0x90
|
||||
_foo: ## @foo
|
||||
Lfunc_begin0:
|
||||
.file 1 "foo.c"
|
||||
.loc 1 1 0 ## foo.c:1:0
|
||||
.cfi_startproc
|
||||
## BB#0: ## %entry
|
||||
pushq %rbp
|
||||
Lcfi0:
|
||||
.cfi_def_cfa_offset 16
|
||||
Lcfi1:
|
||||
.cfi_offset %rbp, -16
|
||||
movq %rsp, %rbp
|
||||
Lcfi2:
|
||||
.cfi_def_cfa_register %rbp
|
||||
Ltmp0:
|
||||
.loc 1 3 9 prologue_end ## foo.c:3:9
|
||||
movl $1, -4(%rbp)
|
||||
.loc 1 4 6 ## foo.c:4:6
|
||||
movl -4(%rbp), %eax
|
||||
addl $1, %eax
|
||||
movl %eax, -4(%rbp)
|
||||
Ltmp1:
|
||||
.loc 1 6 1 ## foo.c:6:1
|
||||
popq %rbp
|
||||
retq
|
||||
Ltmp2:
|
||||
Lfunc_end0:
|
||||
.cfi_endproc
|
||||
## -- End function
|
||||
.section __DWARF,__debug_str,regular,debug
|
||||
Linfo_string:
|
||||
.asciz "clang version 6.0.0 (trunk 314509) (llvm/trunk 314517)" ## string offset=0
|
||||
.asciz "foo.c" ## string offset=55
|
||||
.asciz "/private/tmp" ## string offset=61
|
||||
.asciz "foo" ## string offset=74
|
||||
.asciz "i" ## string offset=78
|
||||
.asciz "int" ## string offset=80
|
||||
.section __DWARF,__debug_abbrev,regular,debug
|
||||
Lsection_abbrev:
|
||||
.byte 1 ## Abbreviation Code
|
||||
.byte 17 ## DW_TAG_compile_unit
|
||||
.byte 1 ## DW_CHILDREN_yes
|
||||
.byte 37 ## DW_AT_producer
|
||||
.byte 14 ## DW_FORM_strp
|
||||
.byte 19 ## DW_AT_language
|
||||
.byte 5 ## DW_FORM_data2
|
||||
.byte 3 ## DW_AT_name
|
||||
.byte 14 ## DW_FORM_strp
|
||||
.byte 16 ## DW_AT_stmt_list
|
||||
.byte 23 ## DW_FORM_sec_offset
|
||||
.byte 27 ## DW_AT_comp_dir
|
||||
.byte 14 ## DW_FORM_strp
|
||||
.byte 17 ## DW_AT_low_pc
|
||||
.byte 1 ## DW_FORM_addr
|
||||
.byte 18 ## DW_AT_high_pc
|
||||
.byte 6 ## DW_FORM_data4
|
||||
.byte 0 ## EOM(1)
|
||||
.byte 0 ## EOM(2)
|
||||
.byte 2 ## Abbreviation Code
|
||||
.byte 46 ## DW_TAG_subprogram
|
||||
.byte 1 ## DW_CHILDREN_yes
|
||||
.byte 17 ## DW_AT_low_pc
|
||||
.byte 1 ## DW_FORM_addr
|
||||
.byte 18 ## DW_AT_high_pc
|
||||
.byte 6 ## DW_FORM_data4
|
||||
.byte 64 ## DW_AT_frame_base
|
||||
.byte 24 ## DW_FORM_exprloc
|
||||
.byte 3 ## DW_AT_name
|
||||
.byte 14 ## DW_FORM_strp
|
||||
.byte 58 ## DW_AT_decl_file
|
||||
.byte 11 ## DW_FORM_data1
|
||||
.byte 59 ## DW_AT_decl_line
|
||||
.byte 11 ## DW_FORM_data1
|
||||
.byte 63 ## DW_AT_external
|
||||
.byte 25 ## DW_FORM_flag_present
|
||||
.byte 0 ## EOM(1)
|
||||
.byte 0 ## EOM(2)
|
||||
.byte 3 ## Abbreviation Code
|
||||
.byte 11 ## DW_TAG_lexical_block
|
||||
.byte 1 ## DW_CHILDREN_yes
|
||||
.byte 17 ## DW_AT_low_pc
|
||||
.byte 1 ## DW_FORM_addr
|
||||
.byte 18 ## DW_AT_high_pc
|
||||
.byte 6 ## DW_FORM_data4
|
||||
.byte 0 ## EOM(1)
|
||||
.byte 0 ## EOM(2)
|
||||
.byte 4 ## Abbreviation Code
|
||||
.byte 52 ## DW_TAG_variable
|
||||
.byte 0 ## DW_CHILDREN_no
|
||||
.byte 2 ## DW_AT_location
|
||||
.byte 24 ## DW_FORM_exprloc
|
||||
.byte 3 ## DW_AT_name
|
||||
.byte 14 ## DW_FORM_strp
|
||||
.byte 58 ## DW_AT_decl_file
|
||||
.byte 11 ## DW_FORM_data1
|
||||
.byte 59 ## DW_AT_decl_line
|
||||
.byte 11 ## DW_FORM_data1
|
||||
.byte 73 ## DW_AT_type
|
||||
.byte 19 ## DW_FORM_ref4
|
||||
.byte 0 ## EOM(1)
|
||||
.byte 0 ## EOM(2)
|
||||
.byte 5 ## Abbreviation Code
|
||||
.byte 36 ## DW_TAG_base_type
|
||||
.byte 0 ## DW_CHILDREN_no
|
||||
.byte 3 ## DW_AT_name
|
||||
.byte 14 ## DW_FORM_strp
|
||||
.byte 62 ## DW_AT_encoding
|
||||
.byte 11 ## DW_FORM_data1
|
||||
.byte 11 ## DW_AT_byte_size
|
||||
.byte 11 ## DW_FORM_data1
|
||||
.byte 0 ## EOM(1)
|
||||
.byte 0 ## EOM(2)
|
||||
.byte 0 ## EOM(3)
|
||||
.section __DWARF,__debug_info,regular,debug
|
||||
Lsection_info:
|
||||
Lcu_begin0:
|
||||
.long 96 ## Length of Unit
|
||||
.short 4 ## DWARF version number
|
||||
Lset0 = Lsection_abbrev-Lsection_abbrev ## Offset Into Abbrev. Section
|
||||
.long Lset0
|
||||
.byte 8 ## Address Size (in bytes)
|
||||
.byte 1 ## Abbrev [1] 0xb:0x59 DW_TAG_compile_unit
|
||||
.long 0 ## DW_AT_producer
|
||||
.short 12 ## DW_AT_language
|
||||
.long 55 ## DW_AT_name
|
||||
Lset1 = Lline_table_start0-Lsection_line ## DW_AT_stmt_list
|
||||
.long Lset1
|
||||
.long 61 ## DW_AT_comp_dir
|
||||
.quad Lfunc_begin0 ## DW_AT_low_pc
|
||||
Lset2 = Lfunc_end0-Lfunc_begin0 ## DW_AT_high_pc
|
||||
.long Lset2
|
||||
.byte 2 ## Abbrev [2] 0x2a:0x32 DW_TAG_subprogram
|
||||
.quad Lfunc_begin0 ## DW_AT_low_pc
|
||||
Lset3 = Lfunc_end0-Lfunc_begin0 ## DW_AT_high_pc
|
||||
.long Lset3
|
||||
.byte 1 ## DW_AT_frame_base
|
||||
.byte 86
|
||||
.long 74 ## DW_AT_name
|
||||
.byte 1 ## DW_AT_decl_file
|
||||
.byte 1 ## DW_AT_decl_line
|
||||
## DW_AT_external
|
||||
.byte 3 ## Abbrev [3] 0x3f:0x1c DW_TAG_lexical_block
|
||||
.quad Ltmp0 ## DW_AT_low_pc
|
||||
Lset4 = Ltmp1-Ltmp0 ## DW_AT_high_pc
|
||||
.long Lset4
|
||||
.byte 4 ## Abbrev [4] 0x4c:0xe DW_TAG_variable
|
||||
.byte 2 ## DW_AT_location
|
||||
.byte 145
|
||||
.byte 124
|
||||
.long 78 ## DW_AT_name
|
||||
.byte 1 ## DW_AT_decl_file
|
||||
.byte 3 ## DW_AT_decl_line
|
||||
.long 92 ## DW_AT_type
|
||||
.byte 0 ## End Of Children Mark
|
||||
.byte 0 ## End Of Children Mark
|
||||
.byte 5 ## Abbrev [5] 0x5c:0x7 DW_TAG_base_type
|
||||
.long 80 ## DW_AT_name
|
||||
.byte 5 ## DW_AT_encoding
|
||||
.byte 4 ## DW_AT_byte_size
|
||||
.byte 0 ## End Of Children Mark
|
||||
.section __DWARF,__debug_ranges,regular,debug
|
||||
Ldebug_range:
|
||||
.section __DWARF,__debug_macinfo,regular,debug
|
||||
Ldebug_macinfo:
|
||||
Lcu_macro_begin0:
|
||||
.byte 0 ## End Of Macro List Mark
|
||||
.section __DWARF,__apple_names,regular,debug
|
||||
Lnames_begin:
|
||||
.long 1212240712 ## Header Magic
|
||||
.short 1 ## Header Version
|
||||
.short 0 ## Header Hash Function
|
||||
.long 1 ## Header Bucket Count
|
||||
.long 1 ## Header Hash Count
|
||||
.long 12 ## Header Data Length
|
||||
.long 0 ## HeaderData Die Offset Base
|
||||
.long 1 ## HeaderData Atom Count
|
||||
.short 1 ## DW_ATOM_die_offset
|
||||
.short 6 ## DW_FORM_data4
|
||||
.long 0 ## Bucket 0
|
||||
.long 193491849 ## Hash in Bucket 0
|
||||
.long LNames0-Lnames_begin ## Offset in Bucket 0
|
||||
LNames0:
|
||||
.long 74 ## foo
|
||||
.long 1 ## Num DIEs
|
||||
.long 42
|
||||
.long 0
|
||||
.section __DWARF,__apple_objc,regular,debug
|
||||
Lobjc_begin:
|
||||
.long 1212240712 ## Header Magic
|
||||
.short 1 ## Header Version
|
||||
.short 0 ## Header Hash Function
|
||||
.long 1 ## Header Bucket Count
|
||||
.long 0 ## Header Hash Count
|
||||
.long 12 ## Header Data Length
|
||||
.long 0 ## HeaderData Die Offset Base
|
||||
.long 1 ## HeaderData Atom Count
|
||||
.short 1 ## DW_ATOM_die_offset
|
||||
.short 6 ## DW_FORM_data4
|
||||
.long -1 ## Bucket 0
|
||||
.section __DWARF,__apple_namespac,regular,debug
|
||||
Lnamespac_begin:
|
||||
.long 1212240712 ## Header Magic
|
||||
.short 1 ## Header Version
|
||||
.short 0 ## Header Hash Function
|
||||
.long 1 ## Header Bucket Count
|
||||
.long 0 ## Header Hash Count
|
||||
.long 12 ## Header Data Length
|
||||
.long 0 ## HeaderData Die Offset Base
|
||||
.long 1 ## HeaderData Atom Count
|
||||
.short 1 ## DW_ATOM_die_offset
|
||||
.short 6 ## DW_FORM_data4
|
||||
.long -1 ## Bucket 0
|
||||
.section __DWARF,__apple_types,regular,debug
|
||||
Ltypes_begin:
|
||||
.long 1212240712 ## Header Magic
|
||||
.short 1 ## Header Version
|
||||
.short 0 ## Header Hash Function
|
||||
.long 1 ## Header Bucket Count
|
||||
.long 1 ## Header Hash Count
|
||||
.long 20 ## Header Data Length
|
||||
.long 0 ## HeaderData Die Offset Base
|
||||
.long 3 ## HeaderData Atom Count
|
||||
.short 1 ## DW_ATOM_die_offset
|
||||
.short 6 ## DW_FORM_data4
|
||||
.short 3 ## DW_ATOM_die_tag
|
||||
.short 5 ## DW_FORM_data2
|
||||
.short 4 ## DW_ATOM_type_flags
|
||||
.short 11 ## DW_FORM_data1
|
||||
.long 0 ## Bucket 0
|
||||
.long 193495088 ## Hash in Bucket 0
|
||||
.long Ltypes0-Ltypes_begin ## Offset in Bucket 0
|
||||
Ltypes0:
|
||||
.long 80 ## int
|
||||
.long 1 ## Num DIEs
|
||||
.long 92
|
||||
.short 36
|
||||
.byte 0
|
||||
.long 0
|
||||
|
||||
.subsections_via_symbols
|
||||
.section __DWARF,__debug_line,regular,debug
|
||||
Lsection_line:
|
||||
Lline_table_start0:
|
@ -8,6 +8,7 @@ HELP: -eh-frame
|
||||
HELP: Specific Options
|
||||
HELP: -find
|
||||
HELP: -ignore-case
|
||||
HELP: -lookup
|
||||
HELP: -name
|
||||
HELP: -recurse-depth=<N>
|
||||
HELP: -regex
|
||||
|
@ -157,6 +157,11 @@ static list<std::string> Name(
|
||||
"the -regex option <pattern> is interpreted as a regular expression."),
|
||||
value_desc("pattern"), cat(DwarfDumpCategory));
|
||||
static alias NameAlias("n", desc("Alias for -name"), aliasopt(Name));
|
||||
static opt<unsigned>
|
||||
Lookup("lookup",
|
||||
desc("Lookup <address> in the debug information and print out any"
|
||||
"available file, function, block and line table details."),
|
||||
value_desc("address"), cat(DwarfDumpCategory));
|
||||
static opt<std::string>
|
||||
OutputFilename("out-file", cl::init(""),
|
||||
cl::desc("Redirect output to the specified file."),
|
||||
@ -303,6 +308,30 @@ static void filterByName(const StringSet<> &Names,
|
||||
Die.dump(OS, 0, getDumpOpts());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// Handle the --lookup option and dump the DIEs and line info for the given
|
||||
/// address.
|
||||
static bool lookup(DWARFContext &DICtx, uint64_t Address, raw_ostream &OS) {
|
||||
auto DIEsForAddr = DICtx.getDIEsForAddress(Lookup);
|
||||
|
||||
if (!DIEsForAddr)
|
||||
return false;
|
||||
|
||||
DIDumpOptions DumpOpts = getDumpOpts();
|
||||
DumpOpts.RecurseDepth = 0;
|
||||
DIEsForAddr.CompileUnit->dump(OS, DumpOpts);
|
||||
if (DIEsForAddr.FunctionDIE) {
|
||||
DIEsForAddr.FunctionDIE.dump(OS, 2, DumpOpts);
|
||||
if (DIEsForAddr.BlockDIE)
|
||||
DIEsForAddr.BlockDIE.dump(OS, 4, DumpOpts);
|
||||
}
|
||||
|
||||
if (DILineInfo LineInfo = DICtx.getLineInfoForAddress(Lookup))
|
||||
LineInfo.dump(OS);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool collectStatsForObjectFile(ObjectFile &Obj, DWARFContext &DICtx,
|
||||
@ -312,11 +341,14 @@ static bool dumpObjectFile(ObjectFile &Obj, DWARFContext &DICtx, Twine Filename,
|
||||
raw_ostream &OS) {
|
||||
logAllUnhandledErrors(DICtx.loadRegisterInfo(Obj), errs(),
|
||||
Filename.str() + ": ");
|
||||
|
||||
// The UUID dump already contains all the same information.
|
||||
if (!(DumpType & DIDT_UUID) || DumpType == DIDT_All)
|
||||
OS << Filename << ":\tfile format " << Obj.getFileFormatName() << '\n';
|
||||
|
||||
// Handle the --lookup option.
|
||||
if (Lookup)
|
||||
return lookup(DICtx, Lookup, OS);
|
||||
|
||||
// Handle the --name option.
|
||||
if (!Name.empty()) {
|
||||
StringSet<> Names;
|
||||
|
Loading…
Reference in New Issue
Block a user