forked from OSchip/llvm-project
[llvm-dwarfdump] - Refactor section name/uniqueness gathering.
As was requested in D36313 thread, with this patch section names and uniqueness calculated once, and not every time when a range is dumped. Differential revision: https://reviews.llvm.org/D36740 llvm-svn: 310923
This commit is contained in:
parent
eb2f5f3256
commit
e1c30f74f7
|
@ -29,6 +29,7 @@ public:
|
|||
virtual ~DWARFObject() = default;
|
||||
virtual StringRef getFileName() const { llvm_unreachable("unimplemented"); }
|
||||
virtual const object::ObjectFile *getFile() const { return nullptr; }
|
||||
virtual ArrayRef<SectionName> getSectionNames() const { return {}; }
|
||||
virtual bool isLittleEndian() const = 0;
|
||||
virtual uint8_t getAddressSize() const { llvm_unreachable("unimplemented"); }
|
||||
virtual const DWARFSection &getInfoSection() const { return Dummy; }
|
||||
|
|
|
@ -19,6 +19,11 @@ struct DWARFSection {
|
|||
StringRef Data;
|
||||
};
|
||||
|
||||
struct SectionName {
|
||||
StringRef Name;
|
||||
bool IsNameUnique;
|
||||
};
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
#endif // LLVM_DEBUGINFO_DWARF_DWARFSECTION_H
|
||||
|
|
|
@ -934,6 +934,7 @@ class DWARFObjInMemory final : public DWARFObject {
|
|||
uint8_t AddressSize;
|
||||
StringRef FileName;
|
||||
const object::ObjectFile *Obj = nullptr;
|
||||
std::vector<SectionName> SectionNames;
|
||||
|
||||
using TypeSectionMap = MapVector<object::SectionRef, DWARFSectionMap,
|
||||
std::map<object::SectionRef, unsigned>>;
|
||||
|
@ -1055,9 +1056,13 @@ public:
|
|||
AddressSize(Obj.getBytesInAddress()), FileName(Obj.getFileName()),
|
||||
Obj(&Obj) {
|
||||
|
||||
StringMap<unsigned> SectionAmountMap;
|
||||
for (const SectionRef &Section : Obj.sections()) {
|
||||
StringRef Name;
|
||||
Section.getName(Name);
|
||||
++SectionAmountMap[Name];
|
||||
SectionNames.push_back({ Name, true });
|
||||
|
||||
// Skip BSS and Virtual sections, they aren't interesting.
|
||||
if (Section.isBSS() || Section.isVirtual())
|
||||
continue;
|
||||
|
@ -1179,6 +1184,10 @@ public:
|
|||
Map->insert({Reloc.getOffset(), Rel});
|
||||
}
|
||||
}
|
||||
|
||||
for (SectionName &S : SectionNames)
|
||||
if (SectionAmountMap[S.Name] > 1)
|
||||
S.IsNameUnique = false;
|
||||
}
|
||||
|
||||
Optional<RelocAddrEntry> find(const DWARFSection &S,
|
||||
|
@ -1192,6 +1201,10 @@ public:
|
|||
|
||||
const object::ObjectFile *getFile() const override { return Obj; }
|
||||
|
||||
ArrayRef<SectionName> getSectionNames() const override {
|
||||
return SectionNames;
|
||||
}
|
||||
|
||||
bool isLittleEndian() const override { return IsLittleEndian; }
|
||||
StringRef getAbbrevDWOSection() const override { return AbbrevDWOSection; }
|
||||
const DWARFSection &getLineDWOSection() const override {
|
||||
|
|
|
@ -57,18 +57,9 @@ static void dumpRanges(const DWARFObject &Obj, raw_ostream &OS,
|
|||
const DWARFAddressRangesVector &Ranges,
|
||||
unsigned AddressSize, unsigned Indent,
|
||||
const DIDumpOptions &DumpOpts) {
|
||||
StringMap<unsigned> SectionAmountMap;
|
||||
std::vector<StringRef> SectionNames;
|
||||
if (Obj.getFile() && !DumpOpts.Brief) {
|
||||
for (const SectionRef &Section : Obj.getFile()->sections()) {
|
||||
StringRef Name;
|
||||
if (Section.getName(Name))
|
||||
Name = "<error>";
|
||||
|
||||
++SectionAmountMap[Name];
|
||||
SectionNames.push_back(Name);
|
||||
}
|
||||
}
|
||||
ArrayRef<SectionName> SectionNames;
|
||||
if (!DumpOpts.Brief)
|
||||
SectionNames = Obj.getSectionNames();
|
||||
|
||||
for (size_t I = 0; I < Ranges.size(); ++I) {
|
||||
const DWARFAddressRange &R = Ranges[I];
|
||||
|
@ -81,13 +72,11 @@ static void dumpRanges(const DWARFObject &Obj, raw_ostream &OS,
|
|||
if (SectionNames.empty() || R.SectionIndex == -1ULL)
|
||||
continue;
|
||||
|
||||
StringRef Name = R.SectionIndex < SectionNames.size()
|
||||
? SectionNames[R.SectionIndex]
|
||||
: "<error>";
|
||||
OS << format(" \"%s\"", Name.str().c_str());
|
||||
StringRef Name = SectionNames[R.SectionIndex].Name;
|
||||
OS << " \"" << Name << '\"';
|
||||
|
||||
// Print section index if there is more than one section with this name.
|
||||
if (SectionAmountMap[Name] > 1)
|
||||
// Print section index if name is not unique.
|
||||
if (!SectionNames[R.SectionIndex].IsNameUnique)
|
||||
OS << format(" [%u]", R.SectionIndex);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue