diff --git a/include/llvm/MC/MCDwarf.h b/include/llvm/MC/MCDwarf.h index 3b604506144..720da188aa8 100644 --- a/include/llvm/MC/MCDwarf.h +++ b/include/llvm/MC/MCDwarf.h @@ -182,7 +182,8 @@ struct MCDwarfLineTableHeader { SmallVector MCDwarfFiles; StringMap SourceIdMap; MCDwarfLineTableHeader() : Label(nullptr) {} - unsigned getFile(StringRef Directory, StringRef FileName, unsigned FileNumber = 0); + unsigned getFile(StringRef &Directory, StringRef &FileName, + unsigned FileNumber = 0); std::pair Emit(MCStreamer *MCOS) const; }; @@ -197,7 +198,8 @@ public: // This emits the Dwarf file and the line tables for a given Compile Unit. const MCSymbol *EmitCU(MCStreamer *MCOS) const; - unsigned getFile(StringRef Directory, StringRef FileName, unsigned FileNumber = 0); + unsigned getFile(StringRef &Directory, StringRef &FileName, + unsigned FileNumber = 0); MCSymbol *getLabel() const { return Header.Label; diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index a03da3c452a..4791e6d5ade 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -171,8 +171,7 @@ static unsigned getDwarfVersionFromModule(const Module *M) { } DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M) - : Asm(A), MMI(Asm->MMI), FirstCU(0), SourceIdMap(DIEValueAllocator), - PrevLabel(NULL), GlobalRangeCount(0), + : Asm(A), MMI(Asm->MMI), FirstCU(0), PrevLabel(NULL), GlobalRangeCount(0), InfoHolder(A, "info_string", DIEValueAllocator), HasCURanges(false), UsedNonDefaultText(false), SkeletonHolder(A, "skel_string", DIEValueAllocator) { @@ -680,36 +679,12 @@ unsigned DwarfDebug::getOrCreateSourceID(StringRef FileName, StringRef DirName, if (Asm->OutStreamer.hasRawTextSupport()) CUID = 0; - // If FE did not provide a file name, then assume stdin. - if (FileName.empty()) { - FileName = ""; - DirName = ""; - } - // TODO: this might not belong here. See if we can factor this better. if (DirName == CompilationDir) DirName = ""; - // FileIDCUMap stores the current ID for the given compile unit. - unsigned SrcId = FileIDCUMap[CUID] + 1; - - // We look up the CUID/file/dir by concatenating them with a zero byte. - SmallString<128> NamePair; - NamePair += utostr(CUID); - NamePair += '\0'; - NamePair += DirName; - NamePair += '\0'; // Zero bytes are not allowed in paths. - NamePair += FileName; - - StringMapEntry &Ent = SourceIdMap.GetOrCreateValue(NamePair, SrcId); - if (Ent.getValue() != SrcId) - return Ent.getValue(); - - FileIDCUMap[CUID] = SrcId; // Print out a .file directive to specify files for .loc directives. - Asm->OutStreamer.EmitDwarfFileDirective(SrcId, DirName, FileName, CUID); - - return SrcId; + return Asm->OutStreamer.EmitDwarfFileDirective(0, DirName, FileName, CUID); } void DwarfDebug::addGnuPubAttributes(DwarfUnit *U, DIE *D) const { @@ -730,8 +705,6 @@ DwarfCompileUnit *DwarfDebug::constructDwarfCompileUnit(DICompileUnit DIUnit) { InfoHolder.getUnits().size(), Die, DIUnit, Asm, this, &InfoHolder); InfoHolder.addUnit(NewCU); - FileIDCUMap[NewCU->getUniqueID()] = 0; - NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer()); NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2, DIUnit.getLanguage()); diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.h b/lib/CodeGen/AsmPrinter/DwarfDebug.h index baf87323178..3ab537037d9 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -356,12 +356,6 @@ class DwarfDebug : public AsmPrinterHandler { // Used to unique C++ member function declarations. StringMap OdrMemberMap; - // Stores the current file ID for a given compile unit. - DenseMap FileIDCUMap; - // Source id map, i.e. CUID, source filename and directory, - // separated by a zero byte, mapped to a unique id. - StringMap SourceIdMap; - // List of all labels used in aranges generation. std::vector ArangeLabels; diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp index b40305d0fc2..85263fec626 100644 --- a/lib/MC/MCAsmStreamer.cpp +++ b/lib/MC/MCAsmStreamer.cpp @@ -848,13 +848,27 @@ unsigned MCAsmStreamer::EmitDwarfFileDirective(unsigned FileNo, StringRef Directory, StringRef Filename, unsigned CUID) { + assert(CUID == 0); + + MCDwarfLineTable &Table = getContext().getMCDwarfLineTable(CUID); + unsigned NumFiles = Table.getMCDwarfFiles().size(); + FileNo = Table.getFile(Directory, Filename, FileNo); + if (FileNo == 0) + return 0; + if (NumFiles == Table.getMCDwarfFiles().size()) + return FileNo; + + SmallString<128> FullPathName; + if (!UseDwarfDirectory && !Directory.empty()) { if (sys::path::is_absolute(Filename)) - return EmitDwarfFileDirective(FileNo, "", Filename, CUID); - - SmallString<128> FullPathName = Directory; - sys::path::append(FullPathName, Filename); - return EmitDwarfFileDirective(FileNo, "", FullPathName, CUID); + Directory = ""; + else { + FullPathName = Directory; + sys::path::append(FullPathName, Filename); + Directory = ""; + Filename = FullPathName; + } } OS << "\t.file\t" << FileNo << ' '; @@ -864,11 +878,8 @@ unsigned MCAsmStreamer::EmitDwarfFileDirective(unsigned FileNo, } PrintQuotedString(Filename, OS); EmitEOL(); - // All .file will belong to a single CUID. - CUID = 0; - return this->MCStreamer::EmitDwarfFileDirective(FileNo, Directory, Filename, - CUID); + return FileNo; } void MCAsmStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line, diff --git a/lib/MC/MCDwarf.cpp b/lib/MC/MCDwarf.cpp index 72ecfa6cb45..edeee20ab47 100644 --- a/lib/MC/MCDwarf.cpp +++ b/lib/MC/MCDwarf.cpp @@ -287,6 +287,7 @@ std::pair MCDwarfLineTableHeader::Emit(MCStreamer *MCOS) // Second the file table. for (unsigned i = 1; i < MCDwarfFiles.size(); i++) { + assert(!MCDwarfFiles[i].Name.empty()); MCOS->EmitBytes(MCDwarfFiles[i].Name); // FileName MCOS->EmitBytes(StringRef("\0", 1)); // the null term. of the string // the Directory num @@ -331,14 +332,19 @@ const MCSymbol *MCDwarfLineTable::EmitCU(MCStreamer *MCOS) const { return LineStartSym; } -unsigned MCDwarfLineTable::getFile(StringRef Directory, StringRef FileName, +unsigned MCDwarfLineTable::getFile(StringRef &Directory, StringRef &FileName, unsigned FileNumber) { return Header.getFile(Directory, FileName, FileNumber); } -unsigned MCDwarfLineTableHeader::getFile(StringRef Directory, - StringRef FileName, +unsigned MCDwarfLineTableHeader::getFile(StringRef &Directory, + StringRef &FileName, unsigned FileNumber) { + if (FileName.empty()) { + FileName = ""; + Directory = ""; + } + assert(!FileName.empty()); if (FileNumber == 0) { FileNumber = SourceIdMap.size() + 1; assert((MCDwarfFiles.empty() || FileNumber == MCDwarfFiles.size()) &&