summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHemant Kulkarni <khemant@codeaurora.org>2016-03-09 19:16:13 +0000
committerHemant Kulkarni <khemant@codeaurora.org>2016-03-09 19:16:13 +0000
commit206ba844135e0462661371bb8bcf6652f4e360e9 (patch)
tree9bf77e3f3b943c2a7bf228eafdfaa8aa94dc983d
parent2411167fb566b9669d94b5eed6c3a78757531d3b (diff)
downloadbcm5719-llvm-206ba844135e0462661371bb8bcf6652f4e360e9.tar.gz
bcm5719-llvm-206ba844135e0462661371bb8bcf6652f4e360e9.zip
[llvm-readobj] Enable GNU style section group print
Differential Revision: http://reviews.llvm.org/D17822 llvm-svn: 263050
-rw-r--r--llvm/test/tools/llvm-readobj/elf-groups.test13
-rw-r--r--llvm/tools/llvm-readobj/ELFDumper.cpp121
2 files changed, 100 insertions, 34 deletions
diff --git a/llvm/test/tools/llvm-readobj/elf-groups.test b/llvm/test/tools/llvm-readobj/elf-groups.test
index e41b9dd977d..cf2779765b5 100644
--- a/llvm/test/tools/llvm-readobj/elf-groups.test
+++ b/llvm/test/tools/llvm-readobj/elf-groups.test
@@ -15,6 +15,8 @@
RUN: llvm-readobj -g %p/Inputs/elf-groups.x86_64 \
RUN: | FileCheck %s
+RUN: llvm-readobj -g -elf-output-style=GNU %p/Inputs/elf-groups.x86_64 \
+RUN: | FileCheck --check-prefix="GNU" %s
CHECK: Groups {
CHECK-NEXT: Group {
CHECK-NEXT: Name: .group (92)
@@ -37,3 +39,14 @@ CHECK-NEXT: .rela.text._Z3fooIiEvT_ (13)
CHECK-NEXT: ]
CHECK-NEXT: }
+GNU:COMDAT group section [ 1] `.group' [_Z3fooIcEvT_] contains 2 sections:
+GNU-NEXT: [Index] Name
+GNU-NEXT: [ 10] .text._Z3fooIcEvT_
+GNU-NEXT: [ 11] .rela.text._Z3fooIcEvT_
+GNU:COMDAT group section [ 2] `.group' [_Z3fooIiEvT_] contains 2 sections:
+GNU-NEXT: [Index] Name
+GNU-NEXT: [ 12] .text._Z3fooIiEvT_
+GNU-NEXT: [ 13] .rela.text._Z3fooIiEvT_
+GNU:COMDAT group section [ 3] `.group' [_ZNKSt9type_info4nameEv] contains 1 sections:
+GNU-NEXT: [Index] Name
+GNU-NEXT: [ 14] .text._ZNKSt9type_info4nameEv
diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp
index fbfd6d1b797..40ca14564e9 100644
--- a/llvm/tools/llvm-readobj/ELFDumper.cpp
+++ b/llvm/tools/llvm-readobj/ELFDumper.cpp
@@ -44,6 +44,21 @@ using namespace ELF;
#define ENUM_ENT_1(enum) \
{ #enum, #enum, ELF::enum }
+#define TYPEDEF_ELF_TYPES(ELFT) \
+ typedef ELFFile<ELFT> ELFO; \
+ typedef typename ELFO::Elf_Shdr Elf_Shdr; \
+ typedef typename ELFO::Elf_Sym Elf_Sym; \
+ typedef typename ELFO::Elf_Dyn Elf_Dyn; \
+ typedef typename ELFO::Elf_Dyn_Range Elf_Dyn_Range; \
+ typedef typename ELFO::Elf_Rel Elf_Rel; \
+ typedef typename ELFO::Elf_Rela Elf_Rela; \
+ typedef typename ELFO::Elf_Rela_Range Elf_Rela_Range; \
+ typedef typename ELFO::Elf_Phdr Elf_Phdr; \
+ typedef typename ELFO::Elf_Half Elf_Half; \
+ typedef typename ELFO::Elf_Ehdr Elf_Ehdr; \
+ typedef typename ELFO::Elf_Word Elf_Word; \
+ typedef typename ELFO::uintX_t uintX_t;
+
namespace {
template <class ELFT> class DumpStyle;
@@ -222,15 +237,17 @@ template <typename ELFT> class DumpStyle {
public:
virtual void printFileHeaders(const ELFFile<ELFT> *Obj) = 0;
virtual ~DumpStyle() { }
+ virtual void printGroupSections(const ELFFile<ELFT> *Obj) = 0;
};
template <typename ELFT> class GNUStyle : public DumpStyle<ELFT> {
formatted_raw_ostream OS;
public:
- typedef typename ELFFile<ELFT>::Elf_Ehdr Elf_Ehdr;
+ TYPEDEF_ELF_TYPES(ELFT)
GNUStyle(StreamWriter &W) : OS(W.getOStream()) {}
void printFileHeaders(const ELFFile<ELFT> *Obj) override;
+ void printGroupSections(const ELFFile<ELFT> *Obj) override;
private:
template <typename T, typename TEnum>
@@ -244,10 +261,10 @@ private:
template <typename ELFT> class LLVMStyle : public DumpStyle<ELFT> {
public:
- typedef typename ELFFile<ELFT>::Elf_Ehdr Elf_Ehdr;
+ TYPEDEF_ELF_TYPES(ELFT)
LLVMStyle(StreamWriter &W) : W(W) {}
-
void printFileHeaders(const ELFFile<ELFT> *Obj) override;
+ void printGroupSections(const ELFFile<ELFT> *Obj) override;
private:
StreamWriter &W;
@@ -2251,37 +2268,7 @@ template <class ELFT> void ELFDumper<ELFT>::printStackMap() const {
}
template <class ELFT> void ELFDumper<ELFT>::printGroupSections() {
- DictScope Lists(W, "Groups");
- uint32_t SectionIndex = 0;
- bool HasGroups = false;
- for (const Elf_Shdr &Sec : Obj->sections()) {
- if (Sec.sh_type == ELF::SHT_GROUP) {
- HasGroups = true;
- const Elf_Shdr *Symtab = unwrapOrError(Obj->getSection(Sec.sh_link));
- StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*Symtab));
- const Elf_Sym *Sym = Obj->template getEntry<Elf_Sym>(Symtab, Sec.sh_info);
- auto Data = unwrapOrError(
- Obj->template getSectionContentsAsArray<Elf_Word>(&Sec));
- DictScope D(W, "Group");
- StringRef Name = unwrapOrError(Obj->getSectionName(&Sec));
- W.printNumber("Name", Name, Sec.sh_name);
- W.printNumber("Index", SectionIndex);
- W.printHex("Type", getGroupType(Data[0]), Data[0]);
- W.startLine() << "Signature: " << StrTable.data() + Sym->st_name << "\n";
- {
- ListScope L(W, "Section(s) in group");
- size_t Member = 1;
- while (Member < Data.size()) {
- auto Sec = unwrapOrError(Obj->getSection(Data[Member]));
- const StringRef Name = unwrapOrError(Obj->getSectionName(Sec));
- W.startLine() << Name << " (" << Data[Member++] << ")\n";
- }
- }
- }
- ++SectionIndex;
- }
- if (!HasGroups)
- W.startLine() << "There are no group sections in the file.\n";
+ ELFDumperStyle->printGroupSections(Obj);
}
static inline void printFields(formatted_raw_ostream &OS, StringRef Str1,
@@ -2346,6 +2333,37 @@ void GNUStyle<ELFT>::printFileHeaders(const ELFFile<ELFT> *Obj) {
printFields(OS, "Section header string table index:", Str);
}
+template <class ELFT> void GNUStyle<ELFT>::printGroupSections(const ELFO *Obj) {
+ uint32_t SectionIndex = 0;
+ bool HasGroups = false;
+ for (const Elf_Shdr &Sec : Obj->sections()) {
+ if (Sec.sh_type == ELF::SHT_GROUP) {
+ HasGroups = true;
+ const Elf_Shdr *Symtab = unwrapOrError(Obj->getSection(Sec.sh_link));
+ StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*Symtab));
+ const Elf_Sym *Signature =
+ Obj->template getEntry<Elf_Sym>(Symtab, Sec.sh_info);
+ ArrayRef<Elf_Word> Data = unwrapOrError(
+ Obj->template getSectionContentsAsArray<Elf_Word>(&Sec));
+ StringRef Name = unwrapOrError(Obj->getSectionName(&Sec));
+ OS << "\n" << getGroupType(Data[0]) << " group section ["
+ << format_decimal(SectionIndex, 5) << "] `" << Name << "' ["
+ << StrTable.data() + Signature->st_name << "] contains "
+ << (Data.size() - 1) << " sections:\n"
+ << " [Index] Name\n";
+ for (auto &Ndx : Data.slice(1)) {
+ auto Sec = unwrapOrError(Obj->getSection(Ndx));
+ const StringRef Name = unwrapOrError(Obj->getSectionName(Sec));
+ OS << " [" << format_decimal(Ndx, 5) << "] " << Name
+ << "\n";
+ }
+ }
+ ++SectionIndex;
+ }
+ if (!HasGroups)
+ OS << "There are no section groups in this file.\n";
+}
+
template <class ELFT>
void LLVMStyle<ELFT>::printFileHeaders(const ELFFile<ELFT> *Obj) {
const Elf_Ehdr *e = Obj->getHeader();
@@ -2390,3 +2408,38 @@ void LLVMStyle<ELFT>::printFileHeaders(const ELFFile<ELFT> *Obj) {
W.printNumber("StringTableSectionIndex", e->e_shstrndx);
}
}
+
+template <class ELFT>
+void LLVMStyle<ELFT>::printGroupSections(const ELFO *Obj) {
+ DictScope Lists(W, "Groups");
+ uint32_t SectionIndex = 0;
+ bool HasGroups = false;
+ for (const Elf_Shdr &Sec : Obj->sections()) {
+ if (Sec.sh_type == ELF::SHT_GROUP) {
+ HasGroups = true;
+ const Elf_Shdr *Symtab = unwrapOrError(Obj->getSection(Sec.sh_link));
+ StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*Symtab));
+ const Elf_Sym *Sym = Obj->template getEntry<Elf_Sym>(Symtab, Sec.sh_info);
+ auto Data = unwrapOrError(
+ Obj->template getSectionContentsAsArray<Elf_Word>(&Sec));
+ DictScope D(W, "Group");
+ StringRef Name = unwrapOrError(Obj->getSectionName(&Sec));
+ W.printNumber("Name", Name, Sec.sh_name);
+ W.printNumber("Index", SectionIndex);
+ W.printHex("Type", getGroupType(Data[0]), Data[0]);
+ W.startLine() << "Signature: " << StrTable.data() + Sym->st_name << "\n";
+ {
+ ListScope L(W, "Section(s) in group");
+ size_t Member = 1;
+ while (Member < Data.size()) {
+ auto Sec = unwrapOrError(Obj->getSection(Data[Member]));
+ const StringRef Name = unwrapOrError(Obj->getSectionName(Sec));
+ W.startLine() << Name << " (" << Data[Member++] << ")\n";
+ }
+ }
+ }
+ ++SectionIndex;
+ }
+ if (!HasGroups)
+ W.startLine() << "There are no group sections in the file.\n";
+}
OpenPOWER on IntegriCloud