[llvm] r328805 - Reapply "[DWARFv5] Emit file 0 to the line table."
David Blaikie via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 25 18:26:48 PST 2019
On Thu, Mar 29, 2018 at 10:19 AM Paul Robinson via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: probinson
> Date: Thu Mar 29 10:16:41 2018
> New Revision: 328805
>
> URL: http://llvm.org/viewvc/llvm-project?rev=328805&view=rev
> Log:
> Reapply "[DWARFv5] Emit file 0 to the line table."
>
> DWARF v5 specifies that the root file (also given in the DW_AT_name
> attribute of the compilation unit DIE) should be emitted explicitly to
> the line table's list of files. This makes the line table more
> independent of the .debug_info section.
> We emit the new syntax only for DWARF v5 and later.
>
> Fixes the bug found by asan. Also XFAIL the new test for Darwin, which
> is stuck on DWARF v2, and fix up other tests so they stop failing on
> Windows. Last but not least, don't break "clang -g" of an assembler
> file that has .file directives in it.
>
> Differential Revision: https://reviews.llvm.org/D44054
>
> Added:
> llvm/trunk/test/MC/ELF/dwarf-file0.s
> Modified:
> llvm/trunk/include/llvm/MC/MCContext.h
> llvm/trunk/include/llvm/MC/MCDwarf.h
> llvm/trunk/include/llvm/MC/MCStreamer.h
> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h
> llvm/trunk/lib/MC/MCAsmStreamer.cpp
> llvm/trunk/lib/MC/MCDwarf.cpp
> llvm/trunk/lib/MC/MCParser/AsmParser.cpp
> llvm/trunk/lib/MC/MCStreamer.cpp
> llvm/trunk/test/CodeGen/Generic/dwarf-md5.ll
> llvm/trunk/test/CodeGen/Generic/dwarf-source.ll
> llvm/trunk/test/DebugInfo/X86/dbg-file-name.ll
> llvm/trunk/test/DebugInfo/X86/inline-asm-locs.ll
> llvm/trunk/test/MC/ARM/dwarf-asm-multiple-sections.s
> llvm/trunk/test/MC/ELF/debug-file-options.s
> llvm/trunk/test/MC/ELF/debug-md5.s
> llvm/trunk/test/MC/ELF/debug-source.s
> llvm/trunk/tools/llvm-mc/llvm-mc.cpp
>
> Modified: llvm/trunk/include/llvm/MC/MCContext.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCContext.h?rev=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCContext.h (original)
> +++ llvm/trunk/include/llvm/MC/MCContext.h Thu Mar 29 10:16:41 2018
> @@ -537,8 +537,13 @@ namespace llvm {
> DwarfCompileUnitID = CUIndex;
> }
>
> - void setMCLineTableCompilationDir(unsigned CUID, StringRef
> CompilationDir) {
> - getMCDwarfLineTable(CUID).setCompilationDir(CompilationDir);
> + /// Specifies the "root" file and directory of the compilation unit.
> + /// These are "file 0" and "directory 0" in DWARF v5.
> + void setMCLineTableRootFile(unsigned CUID, StringRef CompilationDir,
> + StringRef Filename, MD5::MD5Result
> *Checksum,
> + Optional<StringRef> Source) {
> + getMCDwarfLineTable(CUID).setRootFile(CompilationDir, Filename,
> Checksum,
> + Source);
> }
>
> /// Saves the information from the currently parsed dwarf .loc
> directive
>
> Modified: llvm/trunk/include/llvm/MC/MCDwarf.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCDwarf.h?rev=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCDwarf.h (original)
> +++ llvm/trunk/include/llvm/MC/MCDwarf.h Thu Mar 29 10:16:41 2018
> @@ -214,6 +214,7 @@ struct MCDwarfLineTableHeader {
> SmallVector<MCDwarfFile, 3> MCDwarfFiles;
> StringMap<unsigned> SourceIdMap;
> StringRef CompilationDir;
> + MCDwarfFile RootFile;
> bool HasMD5 = false;
> bool HasSource = false;
>
> @@ -241,8 +242,17 @@ class MCDwarfDwoLineTable {
> MCDwarfLineTableHeader Header;
>
> public:
> - void setCompilationDir(StringRef CompilationDir) {
> - Header.CompilationDir = CompilationDir;
> + void maybeSetRootFile(StringRef Directory, StringRef FileName,
> + MD5::MD5Result *Checksum, Optional<StringRef>
> Source) {
> + if (!Header.RootFile.Name.empty())
> + return;
> + Header.CompilationDir = Directory;
> + Header.RootFile.Name = FileName;
> + Header.RootFile.DirIndex = 0;
> + Header.RootFile.Checksum = Checksum;
> + Header.RootFile.Source = Source;
> + Header.HasMD5 = (Checksum != nullptr);
> + Header.HasSource = Source.hasValue();
> }
>
> unsigned getFile(StringRef Directory, StringRef FileName,
> @@ -277,6 +287,17 @@ public:
> FileNumber));
> }
>
> + void setRootFile(StringRef Directory, StringRef FileName,
> + MD5::MD5Result *Checksum, Optional<StringRef> Source) {
> + Header.CompilationDir = Directory;
> + Header.RootFile.Name = FileName;
> + Header.RootFile.DirIndex = 0;
> + Header.RootFile.Checksum = Checksum;
> + Header.RootFile.Source = Source;
> + Header.HasMD5 = (Checksum != nullptr);
> + Header.HasSource = Source.hasValue();
> + }
> +
> MCSymbol *getLabel() const {
> return Header.Label;
> }
> @@ -285,10 +306,6 @@ public:
> Header.Label = Label;
> }
>
> - void setCompilationDir(StringRef CompilationDir) {
> - Header.CompilationDir = CompilationDir;
> - }
> -
> const SmallVectorImpl<std::string> &getMCDwarfDirs() const {
> return Header.MCDwarfDirs;
> }
>
> Modified: llvm/trunk/include/llvm/MC/MCStreamer.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCStreamer.h?rev=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCStreamer.h (original)
> +++ llvm/trunk/include/llvm/MC/MCStreamer.h Thu Mar 29 10:16:41 2018
> @@ -775,6 +775,12 @@ public:
> MD5::MD5Result *Checksum = nullptr, Optional<StringRef> Source =
> None,
> unsigned CUID = 0);
>
> + /// Specify the "root" file of the compilation, using the ".file 0"
> extension.
> + virtual void emitDwarfFile0Directive(StringRef Directory, StringRef
> Filename,
> + MD5::MD5Result *Checksum,
> + Optional<StringRef> Source,
> + unsigned CUID = 0);
> +
> /// \brief This implements the DWARF2 '.loc fileno lineno ...' assembler
> /// directive.
> virtual void EmitDwarfLocDirective(unsigned FileNo, unsigned Line,
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Thu Mar 29 10:16:41
> 2018
> @@ -499,8 +499,9 @@ DwarfDebug::getOrCreateDwarfCompileUnit(
> // explicitly describe the directory of all files, never relying on the
> // compilation directory.
> if (!Asm->OutStreamer->hasRawTextSupport() || SingleCU)
> - Asm->OutStreamer->getContext().setMCLineTableCompilationDir(
> - NewCU.getUniqueID(), CompilationDir);
> + Asm->OutStreamer->emitDwarfFile0Directive(
> + CompilationDir, FN, NewCU.getMD5AsBytes(DIUnit->getFile()),
> + DIUnit->getSource(), NewCU.getUniqueID());
>
> StringRef Producer = DIUnit->getProducer();
> StringRef Flags = DIUnit->getFlags();
> @@ -2148,8 +2149,10 @@ void DwarfDebug::emitDebugStrDWO() {
> MCDwarfDwoLineTable *DwarfDebug::getDwoLineTable(const DwarfCompileUnit
> &CU) {
> if (!useSplitDwarf())
> return nullptr;
> - if (SingleCU)
> -
> SplitTypeUnitFileTable.setCompilationDir(CU.getCUNode()->getDirectory());
> + const DICompileUnit *DIUnit = CU.getCUNode();
> + SplitTypeUnitFileTable.maybeSetRootFile(
> + DIUnit->getDirectory(), DIUnit->getFilename(),
> + CU.getMD5AsBytes(DIUnit->getFile()), DIUnit->getSource());
> return &SplitTypeUnitFileTable;
> }
>
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp?rev=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp Thu Mar 29 10:16:41
> 2018
> @@ -282,8 +282,10 @@ void DwarfUnit::addSectionOffset(DIE &Di
> addUInt(Die, Attribute, dwarf::DW_FORM_data4, Integer);
> }
>
> -MD5::MD5Result *DwarfUnit::getMD5AsBytes(const DIFile *File) {
> +MD5::MD5Result *DwarfUnit::getMD5AsBytes(const DIFile *File) const {
> assert(File);
> + if (DD->getDwarfVersion() < 5)
> + return nullptr;
> Optional<DIFile::ChecksumInfo<StringRef>> Checksum =
> File->getChecksum();
> if (!Checksum || Checksum->Kind != DIFile::CSK_MD5)
> return nullptr;
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h?rev=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h Thu Mar 29 10:16:41 2018
> @@ -306,6 +306,10 @@ public:
> const MCSymbol *Label,
> const MCSymbol *Sec);
>
> + /// If the \p File has an MD5 checksum, return it as an MD5Result
> + /// allocated in the MCContext.
> + MD5::MD5Result *getMD5AsBytes(const DIFile *File) const;
> +
> protected:
> ~DwarfUnit();
>
> @@ -316,10 +320,6 @@ protected:
> /// create a new ID and insert it in the line table.
> virtual unsigned getOrCreateSourceID(const DIFile *File) = 0;
>
> - /// If the \p File has an MD5 checksum, return it as an MD5Result
> - /// allocated in the MCContext.
> - MD5::MD5Result *getMD5AsBytes(const DIFile *File);
> -
> /// Look in the DwarfDebug map for the MDNode that corresponds to the
> /// reference.
> template <typename T> T *resolve(TypedDINodeRef<T> Ref) const {
>
> Modified: llvm/trunk/lib/MC/MCAsmStreamer.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmStreamer.cpp?rev=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/MC/MCAsmStreamer.cpp (original)
> +++ llvm/trunk/lib/MC/MCAsmStreamer.cpp Thu Mar 29 10:16:41 2018
> @@ -219,6 +219,10 @@ public:
> MD5::MD5Result *Checksum =
> 0,
> Optional<StringRef> Source
> = None,
> unsigned CUID = 0)
> override;
> + void emitDwarfFile0Directive(StringRef Directory, StringRef Filename,
> + MD5::MD5Result *Checksum,
> + Optional<StringRef> Source,
> + unsigned CUID = 0) override;
> void EmitDwarfLocDirective(unsigned FileNo, unsigned Line,
> unsigned Column, unsigned Flags,
> unsigned Isa, unsigned Discriminator,
> @@ -1077,21 +1081,12 @@ void MCAsmStreamer::EmitFileDirective(St
> EmitEOL();
> }
>
> -Expected<unsigned> MCAsmStreamer::tryEmitDwarfFileDirective(
> - unsigned FileNo, StringRef Directory, StringRef Filename,
> - MD5::MD5Result *Checksum, Optional<StringRef> Source, unsigned CUID) {
> - assert(CUID == 0);
> -
> - MCDwarfLineTable &Table = getContext().getMCDwarfLineTable(CUID);
> - unsigned NumFiles = Table.getMCDwarfFiles().size();
> - Expected<unsigned> FileNoOrErr =
> - Table.tryGetFile(Directory, Filename, Checksum, Source, FileNo);
> - if (!FileNoOrErr)
> - return FileNoOrErr.takeError();
> - FileNo = FileNoOrErr.get();
> - if (NumFiles == Table.getMCDwarfFiles().size())
> - return FileNo;
> -
> +static void printDwarfFileDirective(unsigned FileNo, StringRef Directory,
> + StringRef Filename,
> + MD5::MD5Result *Checksum,
> + Optional<StringRef> Source,
> + bool UseDwarfDirectory,
> + raw_svector_ostream &OS) {
> SmallString<128> FullPathName;
>
> if (!UseDwarfDirectory && !Directory.empty()) {
> @@ -1105,31 +1100,71 @@ Expected<unsigned> MCAsmStreamer::tryEmi
> }
> }
>
> - SmallString<128> Str;
> - raw_svector_ostream OS1(Str);
> - OS1 << "\t.file\t" << FileNo << ' ';
> + OS << "\t.file\t" << FileNo << ' ';
> if (!Directory.empty()) {
> - PrintQuotedString(Directory, OS1);
> - OS1 << ' ';
> + PrintQuotedString(Directory, OS);
> + OS << ' ';
> }
> - PrintQuotedString(Filename, OS1);
> + PrintQuotedString(Filename, OS);
> if (Checksum) {
> - OS1 << " md5 ";
> - PrintQuotedString(Checksum->digest(), OS1);
> + OS << " md5 ";
> + PrintQuotedString(Checksum->digest(), OS);
> }
> if (Source) {
> - OS1 << " source ";
> - PrintQuotedString(*Source, OS1);
> + OS << " source ";
> + PrintQuotedString(*Source, OS);
> }
> - if (MCTargetStreamer *TS = getTargetStreamer()) {
> +}
> +
> +Expected<unsigned> MCAsmStreamer::tryEmitDwarfFileDirective(
> + unsigned FileNo, StringRef Directory, StringRef Filename,
> + MD5::MD5Result *Checksum, Optional<StringRef> Source, unsigned CUID) {
> + assert(CUID == 0 && "multiple CUs not supported by MCAsmStreamer");
> +
> + MCDwarfLineTable &Table = getContext().getMCDwarfLineTable(CUID);
> + unsigned NumFiles = Table.getMCDwarfFiles().size();
> + Expected<unsigned> FileNoOrErr =
> + Table.tryGetFile(Directory, Filename, Checksum, Source, FileNo);
> + if (!FileNoOrErr)
> + return FileNoOrErr.takeError();
> + FileNo = FileNoOrErr.get();
> + if (NumFiles == Table.getMCDwarfFiles().size())
> + return FileNo;
> +
> + SmallString<128> Str;
> + raw_svector_ostream OS1(Str);
> + printDwarfFileDirective(FileNo, Directory, Filename, Checksum, Source,
> + UseDwarfDirectory, OS1);
> +
> + if (MCTargetStreamer *TS = getTargetStreamer())
> TS->emitDwarfFileDirective(OS1.str());
> - } else {
> + else
> EmitRawText(OS1.str());
> - }
>
> return FileNo;
> }
>
> +void MCAsmStreamer::emitDwarfFile0Directive(StringRef Directory,
> + StringRef Filename,
> + MD5::MD5Result *Checksum,
> + Optional<StringRef> Source,
> + unsigned CUID) {
> + assert(CUID == 0);
> + // .file 0 is new for DWARF v5.
> + if (getContext().getDwarfVersion() < 5)
> + return;
> +
> + SmallString<128> Str;
> + raw_svector_ostream OS1(Str);
> + printDwarfFileDirective(0, Directory, Filename, Checksum, Source,
> + UseDwarfDirectory, OS1);
> +
> + if (MCTargetStreamer *TS = getTargetStreamer())
> + TS->emitDwarfFileDirective(OS1.str());
> + else
> + EmitRawText(OS1.str());
> +}
> +
> void MCAsmStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line,
> unsigned Column, unsigned Flags,
> unsigned Isa,
>
> Modified: llvm/trunk/lib/MC/MCDwarf.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCDwarf.cpp?rev=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/MC/MCDwarf.cpp (original)
> +++ llvm/trunk/lib/MC/MCDwarf.cpp Thu Mar 29 10:16:41 2018
> @@ -349,6 +349,34 @@ void MCDwarfLineTableHeader::emitV2FileD
> MCOS->EmitIntValue(0, 1); // Terminate the file list.
> }
>
> +static void emitOneV5FileEntry(MCStreamer *MCOS, const MCDwarfFile
> &DwarfFile,
> + bool HasMD5, bool HasSource,
> + Optional<MCDwarfLineStr> &LineStr) {
> + assert(!DwarfFile.Name.empty());
> + if (LineStr)
> + LineStr->emitRef(MCOS, DwarfFile.Name);
> + else {
> + MCOS->EmitBytes(DwarfFile.Name); // FileName and...
> + MCOS->EmitBytes(StringRef("\0", 1)); // its null terminator.
> + }
> + MCOS->EmitULEB128IntValue(DwarfFile.DirIndex); // Directory number.
> + if (HasMD5) {
> + MD5::MD5Result *Cksum = DwarfFile.Checksum;
> + MCOS->EmitBinaryData(
> + StringRef(reinterpret_cast<const char *>(Cksum->Bytes.data()),
> + Cksum->Bytes.size()));
> + }
> + if (HasSource) {
> + if (LineStr)
> + LineStr->emitRef(MCOS, DwarfFile.Source.getValueOr(StringRef()));
> + else {
> + MCOS->EmitBytes(
> + DwarfFile.Source.getValueOr(StringRef())); // Source and...
> + MCOS->EmitBytes(StringRef("\0", 1)); // its null
> terminator.
> + }
> + }
> +}
> +
> void MCDwarfLineTableHeader::emitV5FileDirTables(
> MCStreamer *MCOS, Optional<MCDwarfLineStr> &LineStr) const {
> // The directory format, which is just a list of the directory paths.
> In a
> @@ -397,33 +425,12 @@ void MCDwarfLineTableHeader::emitV5FileD
> MCOS->EmitULEB128IntValue(LineStr ? dwarf::DW_FORM_line_strp
> : dwarf::DW_FORM_string);
> }
> - // Then the list of file names. These start at 1.
> - MCOS->EmitULEB128IntValue(MCDwarfFiles.size() - 1);
> - for (unsigned i = 1; i < MCDwarfFiles.size(); ++i) {
> - assert(!MCDwarfFiles[i].Name.empty());
> - if (LineStr)
> - LineStr->emitRef(MCOS, MCDwarfFiles[i].Name);
> - else {
> - MCOS->EmitBytes(MCDwarfFiles[i].Name); // FileName and...
> - MCOS->EmitBytes(StringRef("\0", 1)); // its null terminator.
> - }
> - MCOS->EmitULEB128IntValue(MCDwarfFiles[i].DirIndex); // Directory
> number.
> - if (HasMD5) {
> - MD5::MD5Result *Cksum = MCDwarfFiles[i].Checksum;
> - MCOS->EmitBinaryData(
> - StringRef(reinterpret_cast<const char *>(Cksum->Bytes.data()),
> - Cksum->Bytes.size()));
> - }
> - if (HasSource) {
> - if (LineStr)
> - LineStr->emitRef(MCOS,
> MCDwarfFiles[i].Source.getValueOr(StringRef()));
> - else {
> - MCOS->EmitBytes(
> - MCDwarfFiles[i].Source.getValueOr(StringRef())); // Source
> and...
> - MCOS->EmitBytes(StringRef("\0", 1)); // its null terminator.
> - }
> - }
> - }
> + // Then the counted list of files. The root file is file #0, then emit
> the
> + // files as provide by .file directives.
> + MCOS->EmitULEB128IntValue(MCDwarfFiles.size());
> + emitOneV5FileEntry(MCOS, RootFile, HasMD5, HasSource, LineStr);
> + for (unsigned i = 1; i < MCDwarfFiles.size(); ++i)
> + emitOneV5FileEntry(MCOS, MCDwarfFiles[i], HasMD5, HasSource, LineStr);
> }
>
> std::pair<MCSymbol *, MCSymbol *>
>
> Modified: llvm/trunk/lib/MC/MCParser/AsmParser.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/AsmParser.cpp?rev=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/MC/MCParser/AsmParser.cpp (original)
> +++ llvm/trunk/lib/MC/MCParser/AsmParser.cpp Thu Mar 29 10:16:41 2018
> @@ -3276,8 +3276,8 @@ bool AsmParser::parseDirectiveFile(SMLoc
> FileNumber = getTok().getIntVal();
> Lex();
>
> - if (FileNumber < 1)
> - return TokError("file number less than one");
> + if (FileNumber < 0)
> + return TokError("negative file number");
> }
>
> std::string Path = getTok().getString();
> @@ -3356,11 +3356,15 @@ bool AsmParser::parseDirectiveFile(SMLoc
> memcpy(SourceBuf, SourceString.data(), SourceString.size());
> Source = StringRef(SourceBuf, SourceString.size());
> }
> - Expected<unsigned> FileNumOrErr =
> getStreamer().tryEmitDwarfFileDirective(
> - FileNumber, Directory, Filename, CKMem, Source);
> - if (!FileNumOrErr)
> - return Error(DirectiveLoc, toString(FileNumOrErr.takeError()));
> - FileNumber = FileNumOrErr.get();
> + if (FileNumber == 0)
> + getStreamer().emitDwarfFile0Directive(Directory, Filename, CKMem,
> Source);
> + else {
> + Expected<unsigned> FileNumOrErr =
> getStreamer().tryEmitDwarfFileDirective(
> + FileNumber, Directory, Filename, CKMem, Source);
> + if (!FileNumOrErr)
> + return Error(DirectiveLoc, toString(FileNumOrErr.takeError()));
> + FileNumber = FileNumOrErr.get();
> + }
> }
>
> return false;
>
> Modified: llvm/trunk/lib/MC/MCStreamer.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCStreamer.cpp?rev=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/MC/MCStreamer.cpp (original)
> +++ llvm/trunk/lib/MC/MCStreamer.cpp Thu Mar 29 10:16:41 2018
> @@ -199,6 +199,15 @@ MCStreamer::tryEmitDwarfFileDirective(un
> Source, CUID);
> }
>
> +void MCStreamer::emitDwarfFile0Directive(StringRef Directory,
> + StringRef Filename,
> + MD5::MD5Result *Checksum,
> + Optional<StringRef> Source,
> + unsigned CUID) {
> + getContext().setMCLineTableRootFile(CUID, Directory, Filename, Checksum,
> + Source);
> +}
> +
> void MCStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line,
> unsigned Column, unsigned Flags,
> unsigned Isa,
>
> Modified: llvm/trunk/test/CodeGen/Generic/dwarf-md5.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Generic/dwarf-md5.ll?rev=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/Generic/dwarf-md5.ll (original)
> +++ llvm/trunk/test/CodeGen/Generic/dwarf-md5.ll Thu Mar 29 10:16:41 2018
> @@ -5,31 +5,33 @@
> ; XFAIL: darwin
>
> ; REQUIRES: object-emission
> -; RUN: %llc_dwarf -dwarf-version 4 -filetype=asm -o - %s | FileCheck %s
> --check-prefix=ASM
> -; RUN: %llc_dwarf -dwarf-version 5 -filetype=asm -o - %s | FileCheck %s
> --check-prefix=ASM
> +; RUN: %llc_dwarf -dwarf-version 4 -filetype=asm -o - %s | FileCheck %s
> --check-prefixes=ASM,ASM-4
> +; RUN: %llc_dwarf -dwarf-version 5 -filetype=asm -o - %s | FileCheck %s
> --check-prefixes=ASM,ASM-5
> ; RUN: %llc_dwarf -dwarf-version 4 -filetype=obj -o %t4.o %s
> -; RUN: llvm-dwarfdump -debug-line %t4.o | FileCheck %s
> --check-prefix=OBJ-4
> +; RUN: llvm-dwarfdump -debug-line %t4.o | FileCheck %s --check-prefix=OBJ
> ; RUN: %llc_dwarf -dwarf-version 5 -filetype=obj -o %t5.o %s
> -; RUN: llvm-dwarfdump -debug-line %t5.o | FileCheck %s
> --check-prefix=OBJ-5
> +; RUN: llvm-dwarfdump -debug-line %t5.o | FileCheck %s
> --check-prefixes=OBJ,OBJ-5
>
> -; FIXME: Need to convey the MD5 for the primary source file.
> -; ASM: .file 1 ".{{/|\\\\}}t1.h" md5 "11111111111111111111111111111111"
> -; ASM: .file 2 ".{{/|\\\\}}t2.h" md5 "22222222222222222222222222222222"
> -
> -; OBJ-4: file_names[ 1]:
> -; OBJ-4-NEXT: name: "t1.h"
> -; OBJ-4-NEXT: dir_index: 1
> -; OBJ-4: file_names[ 2]:
> -; OBJ-4-NEXT: name: "t2.h"
> -; OBJ-4-NEXT: dir_index: 1
> +; ASM-4-NOT: .file 0
> +; ASM-5: .file 0 "/scratch{{[/\\]}}t.c" md5
> "00000000000000000000000000000000"
> +; ASM: .file 1 "/scratch{{[/\\]}}t1.h"
> +; ASM-4-NOT: md5
> +; ASM-5-SAME: md5 "11111111111111111111111111111111"
> +; ASM: .file 2 "/scratch{{[/\\]}}t2.h"
> +; ASM-4-NOT: md5
> +; ASM-5-SAME: md5 "22222222222222222222222222222222"
>
> ; OBJ-5: file_names[ 0]:
> -; OBJ-5-NEXT: name: "t1.h"
> -; OBJ-5-NEXT: dir_index: 1
> +; OBJ-5-NEXT: name: "t.c"
> +; OBJ-5-NEXT: dir_index: 0
> +; OBJ-5-NEXT: md5_checksum: 00000000000000000000000000000000
> +; OBJ: file_names[ 1]:
> +; OBJ-NEXT: name: "t1.h"
> +; OBJ-NEXT: dir_index: 0
> ; OBJ-5-NEXT: md5_checksum: 11111111111111111111111111111111
> -; OBJ-5: file_names[ 1]:
> -; OBJ-5-NEXT: name: "t2.h"
> -; OBJ-5-NEXT: dir_index: 1
> +; OBJ: file_names[ 2]:
> +; OBJ-NEXT: name: "t2.h"
> +; OBJ-NEXT: dir_index: 0
> ; OBJ-5-NEXT: md5_checksum: 22222222222222222222222222222222
>
> ; ModuleID = 't.c'
> @@ -45,14 +47,14 @@ source_filename = "t.c"
> !0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())
> !1 = distinct !DIGlobalVariable(name: "t1", scope: !2, file: !10, line:
> 1, type: !9, isLocal: false, isDefinition: true)
> !2 = distinct !DICompileUnit(language: DW_LANG_C99, file: !3, producer:
> "clang version 7.0.0 (trunk 322159)", isOptimized: false, runtimeVersion:
> 0, emissionKind: FullDebug, enums: !4, globals: !5)
> -!3 = !DIFile(filename: "t.c", directory:
> "/home/probinson/projects/scratch", checksumkind: CSK_MD5, checksum:
> "00000000000000000000000000000000")
> +!3 = !DIFile(filename: "t.c", directory: "/scratch", checksumkind:
> CSK_MD5, checksum: "00000000000000000000000000000000")
> !4 = !{}
> !5 = !{!0, !6}
> !6 = !DIGlobalVariableExpression(var: !7, expr: !DIExpression())
> !7 = distinct !DIGlobalVariable(name: "t2", scope: !2, file: !8, line: 1,
> type: !9, isLocal: false, isDefinition: true)
> -!8 = !DIFile(filename: "./t2.h", directory:
> "/home/probinson/projects/scratch", checksumkind: CSK_MD5, checksum:
> "22222222222222222222222222222222")
> +!8 = !DIFile(filename: "t2.h", directory: "/scratch", checksumkind:
> CSK_MD5, checksum: "22222222222222222222222222222222")
> !9 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
> -!10 = !DIFile(filename: "./t1.h", directory:
> "/home/probinson/projects/scratch", checksumkind: CSK_MD5, checksum:
> "11111111111111111111111111111111")
> +!10 = !DIFile(filename: "t1.h", directory: "/scratch", checksumkind:
> CSK_MD5, checksum: "11111111111111111111111111111111")
> !11 = !{i32 2, !"Dwarf Version", i32 4}
> !12 = !{i32 2, !"Debug Info Version", i32 3}
> !13 = !{i32 1, !"wchar_size", i32 4}
>
> Modified: llvm/trunk/test/CodeGen/Generic/dwarf-source.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Generic/dwarf-source.ll?rev=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/Generic/dwarf-source.ll (original)
> +++ llvm/trunk/test/CodeGen/Generic/dwarf-source.ll Thu Mar 29 10:16:41
> 2018
> @@ -6,32 +6,29 @@
>
> ; REQUIRES: object-emission
> ; RUN: %llc_dwarf -dwarf-version 4 -filetype=asm -o - %s | FileCheck %s
> --check-prefix=ASM
> -; RUN: %llc_dwarf -dwarf-version 5 -filetype=asm -o - %s | FileCheck %s
> --check-prefix=ASM
> +; RUN: %llc_dwarf -dwarf-version 5 -filetype=asm -o - %s | FileCheck %s
> --check-prefixes=ASM,ASM-5
> ; RUN: %llc_dwarf -dwarf-version 4 -filetype=obj -o %t4.o %s
> -; RUN: llvm-dwarfdump -debug-line %t4.o | FileCheck %s
> --check-prefix=OBJ-4
> +; RUN: llvm-dwarfdump -debug-line %t4.o | FileCheck %s
> --check-prefixes=OBJ,OBJ-4
> ; RUN: %llc_dwarf -dwarf-version 5 -filetype=obj -o %t5.o %s
> -; RUN: llvm-dwarfdump -debug-line %t5.o | FileCheck %s
> --check-prefix=OBJ-5
> +; RUN: llvm-dwarfdump -debug-line %t5.o | FileCheck %s
> --check-prefixes=OBJ,OBJ-5
>
> -; FIXME: Need to convey the source for the primary source file.
> -; ASM: .file 1 ".{{/|\\\\}}t1.h" source "11111111111111111111111111111111"
> -; ASM: .file 2 ".{{/|\\\\}}t2.h" source "22222222222222222222222222222222"
> -
> -; OBJ-4: file_names[ 1]:
> -; OBJ-4-NEXT: name: "t1.h"
> -; OBJ-4-NEXT: dir_index: 1
> -; OBJ-4-NOT: 11111111111111111111111111111111
> -; OBJ-4: file_names[ 2]:
> -; OBJ-4-NEXT: name: "t2.h"
> -; OBJ-4-NEXT: dir_index: 1
> -; OBJ-4-NOT: 22222222222222222222222222222222
> +; ASM-5: .file 0 "/test{{[/\\]}}t.c" source
> "00000000000000000000000000000000"
> +; ASM: .file 1 "/test{{[/\\]}}t1.h" source
> "11111111111111111111111111111111"
> +; ASM: .file 2 "/test{{[/\\]}}t2.h" source
> "22222222222222222222222222222222"
>
> ; OBJ-5: file_names[ 0]:
> -; OBJ-5-NEXT: name: "t1.h"
> -; OBJ-5-NEXT: dir_index: 1
> +; OBJ-5-NEXT: name: "t.c"
> +; OBJ-5-NEXT: dir_index: 0
> +; OBJ-5-NEXT: source: "00000000000000000000000000000000"
> +; OBJ: file_names[ 1]:
> +; OBJ-NEXT: name: "t1.h"
> +; OBJ-NEXT: dir_index: 0
> +; OBJ-4-NOT: 11111111111111111111111111111111
> ; OBJ-5-NEXT: source: "11111111111111111111111111111111"
> -; OBJ-5: file_names[ 1]:
> -; OBJ-5-NEXT: name: "t2.h"
> -; OBJ-5-NEXT: dir_index: 1
> +; OBJ: file_names[ 2]:
> +; OBJ-NEXT: name: "t2.h"
> +; OBJ-NEXT: dir_index: 0
> +; OBJ-4-NOT: 22222222222222222222222222222222
> ; OBJ-5-NEXT: source: "22222222222222222222222222222222"
>
> ; ModuleID = 't.c'
> @@ -52,9 +49,9 @@ source_filename = "t.c"
> !5 = !{!0, !6}
> !6 = !DIGlobalVariableExpression(var: !7, expr: !DIExpression())
> !7 = distinct !DIGlobalVariable(name: "t2", scope: !2, file: !8, line: 1,
> type: !9, isLocal: false, isDefinition: true)
> -!8 = !DIFile(filename: "./t2.h", directory: "/test", source:
> "22222222222222222222222222222222")
> +!8 = !DIFile(filename: "t2.h", directory: "/test", source:
> "22222222222222222222222222222222")
> !9 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
> -!10 = !DIFile(filename: "./t1.h", directory: "/test", source:
> "11111111111111111111111111111111")
> +!10 = !DIFile(filename: "t1.h", directory: "/test", source:
> "11111111111111111111111111111111")
> !11 = !{i32 2, !"Dwarf Version", i32 4}
> !12 = !{i32 2, !"Debug Info Version", i32 3}
> !13 = !{i32 1, !"wchar_size", i32 4}
>
> Modified: llvm/trunk/test/DebugInfo/X86/dbg-file-name.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/dbg-file-name.ll?rev=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/DebugInfo/X86/dbg-file-name.ll (original)
> +++ llvm/trunk/test/DebugInfo/X86/dbg-file-name.ll Thu Mar 29 10:16:41 2018
> @@ -2,7 +2,7 @@
>
> ; Verify that the file name is relative to the directory.
> ; rdar://problem/8884898
> -; CHECK: file 1 "simple.c"
> +; CHECK: file 1 "/Users/manav/one/two" "simple.c"
>
> declare i32 @printf(i8*, ...) nounwind
>
>
> Modified: llvm/trunk/test/DebugInfo/X86/inline-asm-locs.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/inline-asm-locs.ll?rev=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/DebugInfo/X86/inline-asm-locs.ll (original)
> +++ llvm/trunk/test/DebugInfo/X86/inline-asm-locs.ll Thu Mar 29 10:16:41
> 2018
> @@ -22,7 +22,7 @@
> ; CHECK: .file 2 "B.asm"
> ; CHECK: .loc 1 111
> ; CHECK: .loc 2 222
> -; CHECK: .file 3 "test.c"
> +; CHECK: .file 3 "{{.*[/\\]}}test.c"
> ; CHECK: .loc 3 14 0
>
> target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
>
> Modified: llvm/trunk/test/MC/ARM/dwarf-asm-multiple-sections.s
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/dwarf-asm-multiple-sections.s?rev=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/MC/ARM/dwarf-asm-multiple-sections.s (original)
> +++ llvm/trunk/test/MC/ARM/dwarf-asm-multiple-sections.s Thu Mar 29
> 10:16:41 2018
> @@ -54,9 +54,9 @@ b:
> // DWARF-DL: .debug_line contents:
> // DWARF-DL: version: [[DWVER]]
> // DWARF-DL-5: address_size: 4
> -// DWARF-DL-5: include_directories[ 0] = ""
> +// DWARF-DL-5: include_directories[ 0] = "/tmp"
> // DWARF-DL: file_names[ [[DWFILE]]]:
> -// DWARF-DL: name: "<stdin>"
> +// DWARF-DL: name: "{{(<stdin>|-)}}"
> // DWARF-DL: 0x0000000000000000 17 0 1 0 0 is_stmt
> // DWARF-DL-NEXT: 0x0000000000000004 17 0 1 0 0
> is_stmt end_sequence
> // DWARF-DL-NEXT: 0x0000000000000000 21 0 1 0 0 is_stmt
>
> Modified: llvm/trunk/test/MC/ELF/debug-file-options.s
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ELF/debug-file-options.s?rev=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/MC/ELF/debug-file-options.s (original)
> +++ llvm/trunk/test/MC/ELF/debug-file-options.s Thu Mar 29 10:16:41 2018
> @@ -11,25 +11,32 @@
>
> # CHECK: debug_line[0x00000000]
> # CHECK: version: 5
> -# CHECK: include_directories[ 0] = .debug_line_str[0x[[DIR0:[0-9a-f]+]]]
> = ""
> +# CHECK: include_directories[ 0] = .debug_line_str[0x[[DIR0:[0-9a-f]+]]]
> = "{{.+}}"
> # CHECK: include_directories[ 1] = .debug_line_str[0x[[DIR1:[0-9a-f]+]]]
> = "dir1"
> # CHECK: include_directories[ 2] = .debug_line_str[0x[[DIR2:[0-9a-f]+]]]
> = "dir2"
> # CHECK-NOT: include_directories
> # CHECK: file_names[ 0]:
> +# CHECK-NEXT: name: .debug_line_str[0x[[FILE0:[0-9a-f]+]]] = "{{.+}}"
> +# CHECK-NEXT: dir_index: 0
> +# CHECK-NEXT: md5_checksum:
> +# CHECK-NEXT: source: .debug_line_str[0x[[FILE0SRC:[0-9a-f]+]]] = ""
> +# CHECK: file_names[ 1]:
> # CHECK-NEXT: name: .debug_line_str[0x[[FILE1:[0-9a-f]+]]] = "foo"
> # CHECK-NEXT: dir_index: 1
> # CHECK-NEXT: md5_checksum: ee87e05688663173cd6043a3a15bba6e
> # CHECK-NEXT: source: .debug_line_str[0x[[FILE1SRC:[0-9a-f]+]]] = "void
> foo() {}"
> -# CHECK: file_names[ 1]:
> +# CHECK: file_names[ 2]:
> # CHECK-NEXT: name: .debug_line_str[0x[[FILE2:[0-9a-f]+]]] = "bar"
> # CHECK-NEXT: dir_index: 2
> # CHECK-NEXT: md5_checksum: 816225a0c90ca8948b70eb58be4d522f
> # CHECK-NEXT: source: .debug_line_str[0x[[FILE2SRC:[0-9a-f]+]]] = "void
> bar() {}"
>
> # CHECK: .debug_line_str contents:
> -# CHECK-NEXT: 0x[[DIR0]]: ""
> +# CHECK-NEXT: 0x[[DIR0]]: "{{.+}}"
> # CHECK-NEXT: 0x[[DIR1]]: "dir1"
> # CHECK-NEXT: 0x[[DIR2]]: "dir2"
> +# CHECK-NEXT: 0x[[FILE0]]: "{{.+}}"
> +# CHECK-NEXT: 0x[[FILE0SRC]]: ""
> # CHECK-NEXT: 0x[[FILE1]]: "foo"
> # CHECK-NEXT: 0x[[FILE1SRC]]: "void foo() {}"
> # CHECK-NEXT: 0x[[FILE2]]: "bar"
>
> Modified: llvm/trunk/test/MC/ELF/debug-md5.s
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ELF/debug-md5.s?rev=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/MC/ELF/debug-md5.s (original)
> +++ llvm/trunk/test/MC/ELF/debug-md5.s Thu Mar 29 10:16:41 2018
> @@ -1,4 +1,4 @@
> -// RUN: llvm-mc -triple x86_64-unknown-unknown -dwarf-version 5
> -filetype=obj %s -o - | llvm-dwarfdump --debug-line --debug-line-str -v - |
> FileCheck %s
> +// RUN: llvm-mc -triple x86_64-unknown-unknown -dwarf-version 5
> -fdebug-compilation-dir=/tmp -filetype=obj %s -o - | llvm-dwarfdump
> --debug-line --debug-line-str -v - | FileCheck %s
>
> .file 1 "dir1/foo" md5 "00112233445566778899aabbccddeeff"
> .file 2 "dir2" "bar" md5 "ffeeddccbbaa99887766554433221100"
> @@ -9,22 +9,26 @@
>
> # CHECK: debug_line[0x00000000]
> # CHECK: version: 5
> -# CHECK: include_directories[ 0] = .debug_line_str[0x[[DIR0:[0-9a-f]+]]]
> = ""
> +# CHECK: include_directories[ 0] = .debug_line_str[0x[[DIR0:[0-9a-f]+]]]
> = "/tmp"
> # CHECK: include_directories[ 1] = .debug_line_str[0x[[DIR1:[0-9a-f]+]]]
> = "dir1"
> # CHECK: include_directories[ 2] = .debug_line_str[0x[[DIR2:[0-9a-f]+]]]
> = "dir2"
> # CHECK-NOT: include_directories
> # CHECK: file_names[ 0]:
> +# CHECK-NEXT: name: .debug_line_str[0x[[FILE0:[0-9a-f]+]]] = "{{.+}}"
> +# CHECK-NEXT: dir_index: 0
> +# CHECK: file_names[ 1]:
> # CHECK-NEXT: name: .debug_line_str[0x[[FILE1:[0-9a-f]+]]] = "foo"
> # CHECK-NEXT: dir_index: 1
> # CHECK-NEXT: md5_checksum: 00112233445566778899aabbccddeeff
> -# CHECK: file_names[ 1]:
> +# CHECK: file_names[ 2]:
> # CHECK-NEXT: name: .debug_line_str[0x[[FILE2:[0-9a-f]+]]] = "bar"
> # CHECK-NEXT: dir_index: 2
> # CHECK-NEXT: md5_checksum: ffeeddccbbaa99887766554433221100
>
> # CHECK: .debug_line_str contents:
> -# CHECK-NEXT: 0x[[DIR0]]: ""
> +# CHECK-NEXT: 0x[[DIR0]]: "/tmp"
> # CHECK-NEXT: 0x[[DIR1]]: "dir1"
> # CHECK-NEXT: 0x[[DIR2]]: "dir2"
> +# CHECK-NEXT: 0x[[FILE0]]: "{{.+}}"
> # CHECK-NEXT: 0x[[FILE1]]: "foo"
> # CHECK-NEXT: 0x[[FILE2]]: "bar"
>
> Modified: llvm/trunk/test/MC/ELF/debug-source.s
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ELF/debug-source.s?rev=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/MC/ELF/debug-source.s (original)
> +++ llvm/trunk/test/MC/ELF/debug-source.s Thu Mar 29 10:16:41 2018
> @@ -9,23 +9,29 @@
>
> # CHECK: debug_line[0x00000000]
> # CHECK: version: 5
> -# CHECK: include_directories[ 0] = .debug_line_str[0x[[DIR0:[0-9a-f]+]]]
> = ""
> +# CHECK: include_directories[ 0] = .debug_line_str[0x[[DIR0:[0-9a-f]+]]]
> = "{{.+}}"
> # CHECK: include_directories[ 1] = .debug_line_str[0x[[DIR1:[0-9a-f]+]]]
> = "dir1"
> # CHECK: include_directories[ 2] = .debug_line_str[0x[[DIR2:[0-9a-f]+]]]
> = "dir2"
> # CHECK-NOT: include_directories
> # CHECK: file_names[ 0]:
> +# CHECK-NEXT: name: .debug_line_str[0x[[FILE0:[0-9a-f]+]]] = "{{.+}}"
> +# CHECK-NEXT: dir_index: 0
> +# CHECK-NEXT: source: .debug_line_str[0x[[FILE0SRC:[0-9a-f]+]]] = ""
> +# CHECK: file_names[ 1]:
> # CHECK-NEXT: name: .debug_line_str[0x[[FILE1:[0-9a-f]+]]] = "foo"
> # CHECK-NEXT: dir_index: 1
> # CHECK-NEXT: source: .debug_line_str[0x[[FILE1SRC:[0-9a-f]+]]] = "void
> foo() {}"
> -# CHECK: file_names[ 1]:
> +# CHECK: file_names[ 2]:
> # CHECK-NEXT: name: .debug_line_str[0x[[FILE2:[0-9a-f]+]]] = "bar"
> # CHECK-NEXT: dir_index: 2
> # CHECK-NEXT: source: .debug_line_str[0x[[FILE2SRC:[0-9a-f]+]]] = "void
> bar()\n{\n}"
>
> # CHECK: .debug_line_str contents:
> -# CHECK-NEXT: 0x[[DIR0]]: ""
> +# CHECK-NEXT: 0x[[DIR0]]: "{{.+}}"
> # CHECK-NEXT: 0x[[DIR1]]: "dir1"
> # CHECK-NEXT: 0x[[DIR2]]: "dir2"
> +# CHECK-NEXT: 0x[[FILE0]]: "{{.+}}"
> +# CHECK-NEXT: 0x[[FILE0SRC]]: ""
> # CHECK-NEXT: 0x[[FILE1]]: "foo"
> # CHECK-NEXT: 0x[[FILE1SRC]]: "void foo() {}"
> # CHECK-NEXT: 0x[[FILE2]]: "bar"
>
> Added: llvm/trunk/test/MC/ELF/dwarf-file0.s
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ELF/dwarf-file0.s?rev=328805&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/MC/ELF/dwarf-file0.s (added)
> +++ llvm/trunk/test/MC/ELF/dwarf-file0.s Thu Mar 29 10:16:41 2018
> @@ -0,0 +1,19 @@
> +# RUN: llvm-mc -dwarf-version 4 %s -filetype=obj -o - | llvm-dwarfdump
> -debug-line - | FileCheck %s --check-prefixes=CHECK,CHECK-4
> +# RUN: llvm-mc -dwarf-version 5 %s -filetype=obj -o - | llvm-dwarfdump
> -debug-line - | FileCheck %s --check-prefixes=CHECK,CHECK-5
> +# Darwin is stuck on DWARF v2.
> +# XFAIL: darwin
> + .file 0 "root.cpp"
> + .file 1 "header.h"
> + .file 2 "root.cpp"
> +# CHECK-5: include_directories[ 0] = ""
> +# CHECK-4-NOT: include_directories
> +# CHECK-4-NOT: file_names[ 0]
> +# CHECK-5: file_names[ 0]:
> +# CHECK-5-NEXT: name: "root.cpp"
> +# CHECK-5-NEXT: dir_index: 0
> +# CHECK: file_names[ 1]:
> +# CHECK-NEXT: name: "header.h"
> +# CHECK-NEXT: dir_index: 0
> +# CHECK: file_names[ 2]:
> +# CHECK-NEXT: name: "root.cpp"
> +# CHECK-NEXT: dir_index: 0
>
> Modified: llvm/trunk/tools/llvm-mc/llvm-mc.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-mc/llvm-mc.cpp?rev=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/llvm-mc/llvm-mc.cpp (original)
> +++ llvm/trunk/tools/llvm-mc/llvm-mc.cpp Thu Mar 29 10:16:41 2018
> @@ -390,6 +390,18 @@ int main(int argc, char **argv) {
> }
> if (!MainFileName.empty())
> Ctx.setMainFileName(MainFileName);
> + if (DwarfVersion >= 5) {
> + // DWARF v5 needs the root file as well as the compilation directory.
> + // If we find a '.file 0' directive that will supersede these values.
> + MD5 Hash;
> + MD5::MD5Result *Cksum =
> + (MD5::MD5Result *)Ctx.allocate(sizeof(MD5::MD5Result), 1);
> + Hash.update(Buffer->getBuffer());
> + Hash.final(*Cksum);
> + Ctx.setMCLineTableRootFile(
> + /*CUID=*/0, Ctx.getCompilationDir(),
> + !MainFileName.empty() ? MainFileName : InputFilename, Cksum,
> None);
> + }
>
Hey Paul,
I've been experimenting with DWARFv5 broadly applied to some code at Google
& found that clang crashes when trying to emit DWARFv5 on an empty assembly
file. Turns out llvm-mc does not because of the above code block.
Seems this support is here for llvm-mc, but missing from clang's
initialization of MCContext for cc1as.
Could you refactor/common/add equivalent functionality to Clang's cc1as?
(looks like somewhere near clang/tools/driver/cc1as_main.cpp:400? (since
that is where "setMainFileName" is, which is near this block in llvm-mc
too))
- Dave
>
> // Package up features to be passed to target/subtarget
> std::string FeaturesStr;
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190125/e6b34122/attachment-0001.html>
More information about the llvm-commits
mailing list