Skip to content

Commit

Permalink
Reapply "[DWARFv5] Emit file 0 to the line table."
Browse files Browse the repository at this point in the history
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

llvm-svn: 328805
pogo59 committed Mar 29, 2018
1 parent 1b20416 commit b271f31
Showing 20 changed files with 272 additions and 137 deletions.
9 changes: 7 additions & 2 deletions llvm/include/llvm/MC/MCContext.h
Original file line number Diff line number Diff line change
@@ -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
29 changes: 23 additions & 6 deletions llvm/include/llvm/MC/MCDwarf.h
Original file line number Diff line number Diff line change
@@ -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 @@ class MCDwarfLineTable {
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 @@ class MCDwarfLineTable {
Header.Label = Label;
}

void setCompilationDir(StringRef CompilationDir) {
Header.CompilationDir = CompilationDir;
}

const SmallVectorImpl<std::string> &getMCDwarfDirs() const {
return Header.MCDwarfDirs;
}
6 changes: 6 additions & 0 deletions llvm/include/llvm/MC/MCStreamer.h
Original file line number Diff line number Diff line change
@@ -775,6 +775,12 @@ class MCStreamer {
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,
11 changes: 7 additions & 4 deletions llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
Original file line number Diff line number Diff line change
@@ -499,8 +499,9 @@ DwarfDebug::getOrCreateDwarfCompileUnit(const DICompileUnit *DIUnit) {
// 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;
}

4 changes: 3 additions & 1 deletion llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
Original file line number Diff line number Diff line change
@@ -282,8 +282,10 @@ void DwarfUnit::addSectionOffset(DIE &Die, dwarf::Attribute Attribute,
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;
8 changes: 4 additions & 4 deletions llvm/lib/CodeGen/AsmPrinter/DwarfUnit.h
Original file line number Diff line number Diff line change
@@ -306,6 +306,10 @@ class DwarfUnit : public DIEUnit {
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 @@ class DwarfUnit : public DIEUnit {
/// 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 {
91 changes: 63 additions & 28 deletions llvm/lib/MC/MCAsmStreamer.cpp
Original file line number Diff line number Diff line change
@@ -219,6 +219,10 @@ class MCAsmStreamer final : public MCStreamer {
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(StringRef Filename) {
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::tryEmitDwarfFileDirective(
}
}

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,
61 changes: 34 additions & 27 deletions llvm/lib/MC/MCDwarf.cpp
Original file line number Diff line number Diff line change
@@ -349,6 +349,34 @@ void MCDwarfLineTableHeader::emitV2FileDirTables(MCStreamer *MCOS) const {
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::emitV5FileDirTables(
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 *>
18 changes: 11 additions & 7 deletions llvm/lib/MC/MCParser/AsmParser.cpp
Original file line number Diff line number Diff line change
@@ -3276,8 +3276,8 @@ bool AsmParser::parseDirectiveFile(SMLoc DirectiveLoc) {
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 DirectiveLoc) {
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;
9 changes: 9 additions & 0 deletions llvm/lib/MC/MCStreamer.cpp
Original file line number Diff line number Diff line change
@@ -199,6 +199,15 @@ MCStreamer::tryEmitDwarfFileDirective(unsigned FileNo, StringRef Directory,
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,
46 changes: 24 additions & 22 deletions llvm/test/CodeGen/Generic/dwarf-md5.ll
Original file line number Diff line number Diff line change
@@ -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}
41 changes: 19 additions & 22 deletions llvm/test/CodeGen/Generic/dwarf-source.ll
Original file line number Diff line number Diff line change
@@ -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}
2 changes: 1 addition & 1 deletion llvm/test/DebugInfo/X86/dbg-file-name.ll
Original file line number Diff line number Diff line change
@@ -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

2 changes: 1 addition & 1 deletion llvm/test/DebugInfo/X86/inline-asm-locs.ll
Original file line number Diff line number Diff line change
@@ -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"
4 changes: 2 additions & 2 deletions llvm/test/MC/ARM/dwarf-asm-multiple-sections.s
Original file line number Diff line number Diff line change
@@ -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
13 changes: 10 additions & 3 deletions llvm/test/MC/ELF/debug-file-options.s
Original file line number Diff line number Diff line change
@@ -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"
12 changes: 8 additions & 4 deletions llvm/test/MC/ELF/debug-md5.s
Original file line number Diff line number Diff line change
@@ -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"
12 changes: 9 additions & 3 deletions llvm/test/MC/ELF/debug-source.s
Original file line number Diff line number Diff line change
@@ -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"
19 changes: 19 additions & 0 deletions llvm/test/MC/ELF/dwarf-file0.s
Original file line number Diff line number Diff line change
@@ -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
12 changes: 12 additions & 0 deletions llvm/tools/llvm-mc/llvm-mc.cpp
Original file line number Diff line number Diff line change
@@ -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);
}

// Package up features to be passed to target/subtarget
std::string FeaturesStr;

0 comments on commit b271f31

Please sign in to comment.