summaryrefslogtreecommitdiff
path: root/tools/llvm-dwp/llvm-dwp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/llvm-dwp/llvm-dwp.cpp')
-rw-r--r--tools/llvm-dwp/llvm-dwp.cpp61
1 files changed, 41 insertions, 20 deletions
diff --git a/tools/llvm-dwp/llvm-dwp.cpp b/tools/llvm-dwp/llvm-dwp.cpp
index 70bad7565be..9fa22dcae3e 100644
--- a/tools/llvm-dwp/llvm-dwp.cpp
+++ b/tools/llvm-dwp/llvm-dwp.cpp
@@ -122,10 +122,19 @@ static uint32_t getCUAbbrev(StringRef Abbrev, uint64_t AbbrCode) {
struct CompileUnitIdentifiers {
uint64_t Signature = 0;
- const char *Name = nullptr;
- const char *DWOName = nullptr;
+ const char *Name = "";
+ const char *DWOName = "";
};
+static const char *getIndexedString(uint32_t StrIndex, StringRef StrOffsets,
+ StringRef Str) {
+ DataExtractor StrOffsetsData(StrOffsets, true, 0);
+ uint32_t StrOffsetsOffset = 4 * StrIndex;
+ uint32_t StrOffset = StrOffsetsData.getU32(&StrOffsetsOffset);
+ DataExtractor StrData(Str, true, 0);
+ return StrData.getCStr(&StrOffset);
+}
+
static CompileUnitIdentifiers getCUIdentifiers(StringRef Abbrev, StringRef Info,
StringRef StrOffsets,
StringRef Str) {
@@ -154,13 +163,12 @@ static CompileUnitIdentifiers getCUIdentifiers(StringRef Abbrev, StringRef Info,
(Name != 0 || Form != 0)) {
switch (Name) {
case dwarf::DW_AT_name: {
- auto StrIndex = InfoData.getULEB128(&Offset);
-
- DataExtractor StrOffsetsData(StrOffsets, true, 0);
- uint32_t StrOffsetsOffset = 4 * StrIndex;
- uint32_t StrOffset = StrOffsetsData.getU32(&StrOffsetsOffset);
- DataExtractor StrData(Str, true, 0);
- ID.Name = StrData.getCStr(&StrOffset);
+ ID.Name = getIndexedString(InfoData.getULEB128(&Offset), StrOffsets, Str);
+ break;
+ }
+ case dwarf::DW_AT_GNU_dwo_name: {
+ ID.DWOName =
+ getIndexedString(InfoData.getULEB128(&Offset), StrOffsets, Str);
break;
}
case dwarf::DW_AT_GNU_dwo_id:
@@ -176,6 +184,7 @@ static CompileUnitIdentifiers getCUIdentifiers(StringRef Abbrev, StringRef Info,
struct UnitIndexEntry {
DWARFUnitIndex::Entry::SectionContribution Contributions[8];
std::string Name;
+ std::string DWOName;
StringRef DWPName;
};
@@ -331,6 +340,25 @@ static bool consumeCompressedDebugSectionHeader(StringRef &data,
return true;
}
+void printDuplicateError(const std::pair<uint64_t, UnitIndexEntry> &PrevE,
+ const CompileUnitIdentifiers &ID, StringRef DWPName) {
+ errs() << "Duplicate DWO ID (" << PrevE.first << ") in '" << PrevE.second.Name
+ << '\'';
+ if (!PrevE.second.DWPName.empty()) {
+ errs() << " (from ";
+ if (!PrevE.second.DWOName.empty())
+ errs() << '\'' << PrevE.second.DWOName << "' in ";
+ errs() << "'" << PrevE.second.DWPName.str() << "')";
+ }
+ errs() << " and '" << ID.Name << '\'';
+ if (!DWPName.empty()) {
+ errs() << " (from ";
+ if (*ID.DWOName)
+ errs() << '\'' << ID.DWOName << "\' in ";
+ errs() << '\'' << DWPName << "')";
+ }
+ errs() << '\n';
+}
static std::error_code write(MCStreamer &Out, ArrayRef<std::string> Inputs) {
const auto &MCOFI = *Out.getContext().getObjectFileInfo();
MCSection *const StrSection = MCOFI.getDwarfStrDWOSection();
@@ -468,15 +496,12 @@ static std::error_code write(MCStreamer &Out, ArrayRef<std::string> Inputs) {
getSubsection(CurStrOffsetSection, E, DW_SECT_STR_OFFSETS),
CurStrSection);
if (!P.second) {
- auto &PrevE = *P.first;
- std::cerr << "Duplicate DWO ID (" << PrevE.first << ") in '" << PrevE.second.Name << "' ";
- if (!PrevE.second.DWPName.empty())
- std::cerr << "(from '" << PrevE.second.DWPName.str() << "') ";
- std::cerr << "and '" << ID.Name << "' (from '" << Input << "')\n";
+ printDuplicateError(*P.first, ID, Input);
return make_error_code(std::errc::invalid_argument);
}
auto &NewEntry = P.first->second;
NewEntry.Name = ID.Name;
+ NewEntry.DWOName = ID.DWOName;
NewEntry.DWPName = Input;
for (auto Kind : CUIndex.getColumnKinds()) {
auto &C = NewEntry.Contributions[Kind - DW_SECT_INFO];
@@ -503,15 +528,11 @@ static std::error_code write(MCStreamer &Out, ArrayRef<std::string> Inputs) {
AbbrevSection, InfoSection, CurStrOffsetSection, CurStrSection);
auto P = IndexEntries.insert(std::make_pair(ID.Signature, CurEntry));
if (!P.second) {
- auto &E = *P.first;
- std::cerr << "Duplicate DWO ID (" << E.first << ") in '" << ID.Name
- << "' ";
- if (!E.second.DWPName.empty())
- std::cerr << "(from '" << E.second.DWPName.str() << "') ";
- std::cerr << "and '" << E.second.Name << "'\n";
+ printDuplicateError(*P.first, ID, "");
return make_error_code(std::errc::invalid_argument);
}
P.first->second.Name = ID.Name;
+ P.first->second.DWOName = ID.DWOName;
addAllTypes(Out, TypeIndexEntries, TypesSection, CurTypesSection,
CurEntry, ContributionOffsets[DW_SECT_TYPES - DW_SECT_INFO]);
}