2015-07-21 15:42:38 +02:00
|
|
|
//===-- ObjDumper.h ---------------------------------------------*- C++ -*-===//
|
2013-04-03 20:31:38 +02:00
|
|
|
//
|
2019-01-19 09:50:56 +01:00
|
|
|
// 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
|
2013-04-03 20:31:38 +02:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2014-08-13 18:26:38 +02:00
|
|
|
#ifndef LLVM_TOOLS_LLVM_READOBJ_OBJDUMPER_H
|
|
|
|
#define LLVM_TOOLS_LLVM_READOBJ_OBJDUMPER_H
|
2013-04-03 20:31:38 +02:00
|
|
|
|
2014-03-06 06:51:42 +01:00
|
|
|
#include <memory>
|
2014-06-12 19:38:55 +02:00
|
|
|
#include <system_error>
|
2014-03-06 06:51:42 +01:00
|
|
|
|
2018-06-15 16:15:02 +02:00
|
|
|
#include "llvm/ADT/StringRef.h"
|
2018-07-18 20:00:41 +02:00
|
|
|
#include "llvm/Object/ObjectFile.h"
|
2018-06-15 16:15:02 +02:00
|
|
|
|
2013-04-03 20:31:38 +02:00
|
|
|
namespace llvm {
|
|
|
|
namespace object {
|
2015-08-28 12:27:50 +02:00
|
|
|
class COFFImportFile;
|
|
|
|
class ObjectFile;
|
2013-04-03 20:31:38 +02:00
|
|
|
}
|
2016-05-14 02:02:53 +02:00
|
|
|
namespace codeview {
|
2017-11-30 19:39:50 +01:00
|
|
|
class MergingTypeTableBuilder;
|
2016-05-17 01:09:32 +02:00
|
|
|
}
|
2013-04-03 20:31:38 +02:00
|
|
|
|
2016-05-03 02:28:04 +02:00
|
|
|
class ScopedPrinter;
|
2013-04-03 20:31:38 +02:00
|
|
|
|
|
|
|
class ObjDumper {
|
|
|
|
public:
|
2016-05-03 02:28:04 +02:00
|
|
|
ObjDumper(ScopedPrinter &Writer);
|
2013-04-03 20:31:38 +02:00
|
|
|
virtual ~ObjDumper();
|
|
|
|
|
|
|
|
virtual void printFileHeaders() = 0;
|
[llvm-readelf] Make llvm-readelf more compatible with GNU readelf.
Summary:
This change adds a bunch of options that GNU readelf supports. There is one breaking change when invoked as `llvm-readobj`, and three breaking changes when invoked as `llvm-readelf`:
- Add --all (implies --file-header, --program-headers, etc.)
- [Breaking] -a is --all instead of --arm-attributes
- Add --file-header as an alias for --file-headers
- Replace --sections with --sections-headers, keeping --sections as an alias for it
- Add --relocs as an alias for --relocations
- Add --dynamic as an alias for --dynamic-table
- Add --segments as an alias for --program-headers
- Add --section-groups as an alias for --elf-section-groups
- Add --dyn-syms as an alias for --dyn-symbols
- Add --syms as an alias for --symbols
- Add --histogram as an alias for --elf-hash-histogram
- [Breaking] When invoked as `llvm-readelf`, -s is --symbols instead of --sections
- [Breaking] When invoked as `llvm-readelf`, -t is no longer an alias for --symbols
Reviewers: MaskRay, phosek, mcgrathr, jhenderson
Reviewed By: MaskRay, jhenderson
Subscribers: sbc100, aheejin, edd, jhenderson, silvas, echristo, compnerd, kristina, javed.absar, kristof.beyls, llvm-commits, Bigcheese
Differential Revision: https://reviews.llvm.org/D54124
llvm-svn: 346685
2018-11-12 19:02:38 +01:00
|
|
|
virtual void printSectionHeaders() = 0;
|
2013-04-03 20:31:38 +02:00
|
|
|
virtual void printRelocations() = 0;
|
2019-01-23 17:15:39 +01:00
|
|
|
virtual void printSymbols(bool PrintSymbols, bool PrintDynamicSymbols) {
|
|
|
|
if (PrintSymbols)
|
|
|
|
printSymbols();
|
|
|
|
if (PrintDynamicSymbols)
|
|
|
|
printDynamicSymbols();
|
|
|
|
}
|
2013-04-03 20:31:38 +02:00
|
|
|
virtual void printUnwindInfo() = 0;
|
|
|
|
|
|
|
|
// Only implemented for ELF at this time.
|
2015-06-25 23:47:32 +02:00
|
|
|
virtual void printDynamicRelocations() { }
|
2013-04-03 20:31:38 +02:00
|
|
|
virtual void printDynamicTable() { }
|
|
|
|
virtual void printNeededLibraries() { }
|
2013-04-12 06:07:39 +02:00
|
|
|
virtual void printProgramHeaders() { }
|
2018-07-11 12:00:29 +02:00
|
|
|
virtual void printSectionAsHex(StringRef SectionName) {}
|
2015-07-10 00:32:24 +02:00
|
|
|
virtual void printHashTable() { }
|
2015-10-14 14:11:50 +02:00
|
|
|
virtual void printGnuHashTable() { }
|
[llvm-readelf]Revert --dyn-symbols behaviour to make it GNU compatible, and add new --hash-symbols switch for old behaviour
In r287786, the behaviour of --dyn-symbols in llvm-readelf (but not
llvm-readobj) was changed to print the dynamic symbols as derived from
the hash table, rather than to print the dynamic symbol table contents
directly. The original change was initially submitted without review,
and some comments were made on the commit mailing list implying that the
new behavious is GNU compatible. I argue that it is not:
1) It does not include a null symbol.
2) It prints the symbols based on an order derived from the hash
table.
3) It prints an extra column indicating which bucket it came from.
This could break parsers that expect a fixed number of columns,
with the first column being the symbol index.
4) If the input happens to have both .hash and .gnu.hash section, it
prints interpretations of them both, resulting in most symbols
being printed twice.
5) There is no way of just printing the raw dynamic symbol table,
because --symbols also prints the static symbol table.
This patch reverts the --dyn-symbols behaviour back to its old behaviour
of just printing the contents of the dynamic symbol table, similar to
what is printed by --symbols. As the hashed interpretation is still
desirable to validate the hash table, it puts it under a new switch
"--hash-symbols". This is a no-op on all output forms except for GNU
output style for ELF. If there is no hash table, it does nothing,
unlike the previous behaviour which printed the raw dynamic symbol
table, since the raw dynsym is available under --dyn-symbols.
The yaml input for the test is based on that in
test/tools/llvm-readobj/demangle.test, but stripped down to the bare
minimum to provide a valid dynamic symbol.
Note: some LLD tests needed updating. I will commit a separate patch for
those.
Reviewed by: grimar, rupprecht
Differential Revision: https://reviews.llvm.org/D56910
llvm-svn: 351789
2019-01-22 10:35:35 +01:00
|
|
|
virtual void printHashSymbols() {}
|
2015-07-21 15:48:41 +02:00
|
|
|
virtual void printLoadName() {}
|
2015-10-17 01:19:01 +02:00
|
|
|
virtual void printVersionInfo() {}
|
2016-01-26 20:46:39 +01:00
|
|
|
virtual void printGroupSections() {}
|
2016-04-11 19:15:30 +02:00
|
|
|
virtual void printHashHistogram() {}
|
[MC] Add assembler support for .cg_profile.
Object FIle Representation
At codegen time this is emitted into the ELF file a pair of symbol indices and a weight. In assembly it looks like:
.cg_profile a, b, 32
.cg_profile freq, a, 11
.cg_profile freq, b, 20
When writing an ELF file these are put into a SHT_LLVM_CALL_GRAPH_PROFILE (0x6fff4c02) section as (uint32_t, uint32_t, uint64_t) tuples as (from symbol index, to symbol index, weight).
Differential Revision: https://reviews.llvm.org/D44965
llvm-svn: 333823
2018-06-02 18:33:01 +02:00
|
|
|
virtual void printCGProfile() {}
|
2018-07-18 00:17:18 +02:00
|
|
|
virtual void printAddrsig() {}
|
2016-08-30 20:52:02 +02:00
|
|
|
virtual void printNotes() {}
|
2018-01-30 17:29:29 +01:00
|
|
|
virtual void printELFLinkerOptions() {}
|
2013-04-03 20:31:38 +02:00
|
|
|
|
2014-01-30 05:46:33 +01:00
|
|
|
// Only implemented for ARM ELF at this time.
|
|
|
|
virtual void printAttributes() { }
|
|
|
|
|
2014-06-18 10:47:09 +02:00
|
|
|
// Only implemented for MIPS ELF at this time.
|
|
|
|
virtual void printMipsPLTGOT() { }
|
2015-05-07 17:40:35 +02:00
|
|
|
virtual void printMipsABIFlags() { }
|
2015-06-16 23:47:43 +02:00
|
|
|
virtual void printMipsReginfo() { }
|
2016-05-04 07:58:57 +02:00
|
|
|
virtual void printMipsOptions() { }
|
2014-06-18 10:47:09 +02:00
|
|
|
|
2014-10-02 19:02:18 +02:00
|
|
|
// Only implemented for PE/COFF.
|
|
|
|
virtual void printCOFFImports() { }
|
2015-01-03 22:35:09 +01:00
|
|
|
virtual void printCOFFExports() { }
|
2014-10-07 21:37:52 +02:00
|
|
|
virtual void printCOFFDirectives() { }
|
2014-11-19 01:18:07 +01:00
|
|
|
virtual void printCOFFBaseReloc() { }
|
2016-06-02 19:10:43 +02:00
|
|
|
virtual void printCOFFDebugDirectory() { }
|
2017-04-27 21:38:38 +02:00
|
|
|
virtual void printCOFFResources() {}
|
2017-06-22 03:10:29 +02:00
|
|
|
virtual void printCOFFLoadConfig() { }
|
2015-12-16 19:28:12 +01:00
|
|
|
virtual void printCodeViewDebugInfo() { }
|
2017-11-30 19:39:50 +01:00
|
|
|
virtual void
|
|
|
|
mergeCodeViewTypes(llvm::codeview::MergingTypeTableBuilder &CVIDs,
|
|
|
|
llvm::codeview::MergingTypeTableBuilder &CVTypes) {}
|
2014-10-02 19:02:18 +02:00
|
|
|
|
2015-08-21 22:28:30 +02:00
|
|
|
// Only implemented for MachO.
|
|
|
|
virtual void printMachODataInCode() { }
|
2015-08-27 17:11:32 +02:00
|
|
|
virtual void printMachOVersionMin() { }
|
2015-08-31 21:32:31 +02:00
|
|
|
virtual void printMachODysymtab() { }
|
2015-09-02 18:24:24 +02:00
|
|
|
virtual void printMachOSegment() { }
|
2015-09-03 20:10:28 +02:00
|
|
|
virtual void printMachOIndirectSymbols() { }
|
2015-09-09 02:21:18 +02:00
|
|
|
virtual void printMachOLinkerOptions() { }
|
2015-08-21 22:28:30 +02:00
|
|
|
|
2015-06-27 01:56:53 +02:00
|
|
|
virtual void printStackMap() const = 0;
|
|
|
|
|
2018-07-18 20:00:41 +02:00
|
|
|
void printSectionAsString(const object::ObjectFile *Obj, StringRef SecName);
|
2018-07-25 12:04:37 +02:00
|
|
|
void printSectionAsHex(const object::ObjectFile *Obj, StringRef SecName);
|
2018-07-18 20:00:41 +02:00
|
|
|
|
2013-04-03 20:31:38 +02:00
|
|
|
protected:
|
2016-05-03 02:28:04 +02:00
|
|
|
ScopedPrinter &W;
|
2019-01-23 17:15:39 +01:00
|
|
|
|
|
|
|
private:
|
|
|
|
virtual void printSymbols() {};
|
|
|
|
virtual void printDynamicSymbols() {};
|
2013-04-03 20:31:38 +02:00
|
|
|
};
|
|
|
|
|
2014-06-13 03:25:41 +02:00
|
|
|
std::error_code createCOFFDumper(const object::ObjectFile *Obj,
|
2016-05-03 02:28:04 +02:00
|
|
|
ScopedPrinter &Writer,
|
2014-06-13 03:25:41 +02:00
|
|
|
std::unique_ptr<ObjDumper> &Result);
|
2013-04-03 20:31:38 +02:00
|
|
|
|
2014-06-13 03:25:41 +02:00
|
|
|
std::error_code createELFDumper(const object::ObjectFile *Obj,
|
2016-05-03 02:28:04 +02:00
|
|
|
ScopedPrinter &Writer,
|
2014-06-13 03:25:41 +02:00
|
|
|
std::unique_ptr<ObjDumper> &Result);
|
2013-04-03 20:31:38 +02:00
|
|
|
|
2014-06-13 03:25:41 +02:00
|
|
|
std::error_code createMachODumper(const object::ObjectFile *Obj,
|
2016-05-03 02:28:04 +02:00
|
|
|
ScopedPrinter &Writer,
|
2014-06-13 03:25:41 +02:00
|
|
|
std::unique_ptr<ObjDumper> &Result);
|
2013-04-03 20:31:38 +02:00
|
|
|
|
2017-01-31 00:30:52 +01:00
|
|
|
std::error_code createWasmDumper(const object::ObjectFile *Obj,
|
|
|
|
ScopedPrinter &Writer,
|
|
|
|
std::unique_ptr<ObjDumper> &Result);
|
|
|
|
|
2018-01-10 01:14:19 +01:00
|
|
|
void dumpCOFFImportFile(const object::COFFImportFile *File,
|
|
|
|
ScopedPrinter &Writer);
|
2015-08-28 12:27:50 +02:00
|
|
|
|
2017-11-30 19:39:50 +01:00
|
|
|
void dumpCodeViewMergedTypes(
|
|
|
|
ScopedPrinter &Writer, llvm::codeview::MergingTypeTableBuilder &IDTable,
|
|
|
|
llvm::codeview::MergingTypeTableBuilder &TypeTable);
|
2016-05-14 02:02:53 +02:00
|
|
|
|
2013-04-03 20:31:38 +02:00
|
|
|
} // namespace llvm
|
|
|
|
|
|
|
|
#endif
|