diff options
Diffstat (limited to 'llvm/lib/MC')
-rw-r--r-- | llvm/lib/MC/MCContext.cpp | 5 | ||||
-rw-r--r-- | llvm/lib/MC/MCDwarf.cpp | 11 |
2 files changed, 14 insertions, 2 deletions
diff --git a/llvm/lib/MC/MCContext.cpp b/llvm/lib/MC/MCContext.cpp index 49fad131a2c..348436f4bd0 100644 --- a/llvm/lib/MC/MCContext.cpp +++ b/llvm/lib/MC/MCContext.cpp @@ -603,7 +603,8 @@ Expected<unsigned> MCContext::getDwarfFile(StringRef Directory, MD5::MD5Result *Checksum, Optional<StringRef> Source, unsigned CUID) { - MCDwarfLineTable &Table = MCDwarfLineTablesCUMap[CUID]; + MCDwarfLineTable &Table = + MCDwarfLineTablesCUMap.emplace(CUID, DwarfVersion).first->second; return Table.tryGetFile(Directory, FileName, Checksum, Source, FileNumber); } @@ -612,7 +613,7 @@ Expected<unsigned> MCContext::getDwarfFile(StringRef Directory, bool MCContext::isValidDwarfFileNumber(unsigned FileNumber, unsigned CUID) { const MCDwarfLineTable &LineTable = getMCDwarfLineTable(CUID); if (FileNumber == 0) - return getDwarfVersion() >= 5 && LineTable.hasRootFile(); + return getDwarfVersion() >= 5; if (FileNumber >= LineTable.getMCDwarfFiles().size()) return false; diff --git a/llvm/lib/MC/MCDwarf.cpp b/llvm/lib/MC/MCDwarf.cpp index 83b6b4f1aa3..73b4d4bcd19 100644 --- a/llvm/lib/MC/MCDwarf.cpp +++ b/llvm/lib/MC/MCDwarf.cpp @@ -542,6 +542,15 @@ Expected<unsigned> MCDwarfLineTable::tryGetFile(StringRef &Directory, return Header.tryGetFile(Directory, FileName, Checksum, Source, FileNumber); } +bool isRootFile(const MCDwarfFile &RootFile, StringRef &Directory, + StringRef &FileName, MD5::MD5Result *Checksum) { + if (RootFile.Name.empty() || RootFile.Name != FileName.data()) + return false; + if (!RootFile.Checksum) + return !Checksum; + return *RootFile.Checksum == *Checksum; +} + Expected<unsigned> MCDwarfLineTableHeader::tryGetFile(StringRef &Directory, StringRef &FileName, @@ -561,6 +570,8 @@ MCDwarfLineTableHeader::tryGetFile(StringRef &Directory, trackMD5Usage(Checksum); HasSource = (Source != None); } + if (isRootFile(RootFile, Directory, FileName, Checksum) && DwarfVersion >= 5) + return 0; if (FileNumber == 0) { // File numbers start with 1 and/or after any file numbers // allocated by inline-assembler .file directives. |