diff options
Diffstat (limited to 'llvm/lib/MC')
-rw-r--r-- | llvm/lib/MC/MCAsmStreamer.cpp | 29 | ||||
-rw-r--r-- | llvm/lib/MC/MCDwarf.cpp | 12 |
2 files changed, 29 insertions, 12 deletions
diff --git a/llvm/lib/MC/MCAsmStreamer.cpp b/llvm/lib/MC/MCAsmStreamer.cpp index b40305d0fc2..85263fec626 100644 --- a/llvm/lib/MC/MCAsmStreamer.cpp +++ b/llvm/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/llvm/lib/MC/MCDwarf.cpp b/llvm/lib/MC/MCDwarf.cpp index 72ecfa6cb45..edeee20ab47 100644 --- a/llvm/lib/MC/MCDwarf.cpp +++ b/llvm/lib/MC/MCDwarf.cpp @@ -287,6 +287,7 @@ std::pair<MCSymbol *, MCSymbol *> 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 = "<stdin>"; + Directory = ""; + } + assert(!FileName.empty()); if (FileNumber == 0) { FileNumber = SourceIdMap.size() + 1; assert((MCDwarfFiles.empty() || FileNumber == MCDwarfFiles.size()) && |