summaryrefslogtreecommitdiff
path: root/tools/llvm-dwp
diff options
context:
space:
mode:
authorDavid Blaikie <dblaikie@gmail.com>2016-03-26 20:32:14 +0000
committerDavid Blaikie <dblaikie@gmail.com>2016-03-26 20:32:14 +0000
commit3bcdc18cae6e67fc250b753c1f40d8b0c4fd3124 (patch)
tree2b444a13ebf2766deac2d47f8edfb2f2ee48ef1a /tools/llvm-dwp
parentdef1cb057588ffa3ac6ebcb87161f53767a666f3 (diff)
llvm-dwp: Include the dwo name (if available) when diagnosing duplicate CU IDs from dwp input files
If you're building dwps from other dwps, it can be hard to track down a duplicate CU ID if it comes from two compilations of the same file in different modes, etc. By including the .dwo path (which is hopefully more unique than the file path) it can help track down where the duplicates came from. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@264520 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/llvm-dwp')
-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]);
}