1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-18 18:42:46 +02:00

Debug Info: store the files and directories for each compile unit.

We now emit a line table for each compile unit. To reduce the prologue size
of each line table, the files and directories used by each compile unit are
stored in std::map<unsigned, std::vector< > > instead of std::vector< >.

The prologue for a lto'ed image can be as big as 93K. Duplicating 93K for each
compile unit causes a huge increase of debug info. With this patch, each
prologue will only emit the files required by the compile unit.

rdar://problem/13342023

llvm-svn: 176605
This commit is contained in:
Manman Ren 2013-03-07 01:42:00 +00:00
parent 1a77ebbc40
commit 4287c8ee15
12 changed files with 87 additions and 46 deletions

View File

@ -17,6 +17,7 @@
#include "llvm/Support/Allocator.h" #include "llvm/Support/Allocator.h"
#include "llvm/Support/Compiler.h" #include "llvm/Support/Compiler.h"
#include "llvm/Support/raw_ostream.h" #include "llvm/Support/raw_ostream.h"
#include <map>
#include <vector> // FIXME: Shouldn't be needed. #include <vector> // FIXME: Shouldn't be needed.
namespace llvm { namespace llvm {
@ -101,8 +102,12 @@ namespace llvm {
std::string MainFileName; std::string MainFileName;
/// The dwarf file and directory tables from the dwarf .file directive. /// The dwarf file and directory tables from the dwarf .file directive.
std::vector<MCDwarfFile *> MCDwarfFiles; /// We now emit a line table for each compile unit. To reduce the prologue
std::vector<StringRef> MCDwarfDirs; /// size of each line table, the files and directories used by each compile
/// unit are separated.
typedef std::map<unsigned, std::vector<MCDwarfFile *> > MCDwarfFilesMap;
MCDwarfFilesMap MCDwarfFilesCUMap;
std::map<unsigned, std::vector<StringRef> > MCDwarfDirsCUMap;
/// The current dwarf line information from the last dwarf .loc directive. /// The current dwarf line information from the last dwarf .loc directive.
MCDwarfLoc CurrentDwarfLoc; MCDwarfLoc CurrentDwarfLoc;
@ -282,19 +287,25 @@ namespace llvm {
/// GetDwarfFile - creates an entry in the dwarf file and directory tables. /// GetDwarfFile - creates an entry in the dwarf file and directory tables.
unsigned GetDwarfFile(StringRef Directory, StringRef FileName, unsigned GetDwarfFile(StringRef Directory, StringRef FileName,
unsigned FileNumber); unsigned FileNumber, unsigned CUID);
bool isValidDwarfFileNumber(unsigned FileNumber); bool isValidDwarfFileNumber(unsigned FileNumber, unsigned CUID = 0);
bool hasDwarfFiles() const { bool hasDwarfFiles() const {
return !MCDwarfFiles.empty(); // Traverse MCDwarfFilesCUMap and check whether each entry is empty.
MCDwarfFilesMap::const_iterator MapB, MapE;
for (MapB = MCDwarfFilesCUMap.begin(), MapE = MCDwarfFilesCUMap.end();
MapB != MapE; MapB++)
if (!MapB->second.empty())
return true;
return false;
} }
const std::vector<MCDwarfFile *> &getMCDwarfFiles() { const std::vector<MCDwarfFile *> &getMCDwarfFiles(unsigned CUID = 0) {
return MCDwarfFiles; return MCDwarfFilesCUMap[CUID];
} }
const std::vector<StringRef> &getMCDwarfDirs() { const std::vector<StringRef> &getMCDwarfDirs(unsigned CUID = 0) {
return MCDwarfDirs; return MCDwarfDirsCUMap[CUID];
} }
const DenseMap<const MCSection *, MCLineSection *> const DenseMap<const MCSection *, MCLineSection *>

View File

@ -525,7 +525,7 @@ namespace llvm {
/// file number. This implements the DWARF2 '.file 4 "foo.c"' assembler /// file number. This implements the DWARF2 '.file 4 "foo.c"' assembler
/// directive. /// directive.
virtual bool EmitDwarfFileDirective(unsigned FileNo, StringRef Directory, virtual bool EmitDwarfFileDirective(unsigned FileNo, StringRef Directory,
StringRef Filename); StringRef Filename, unsigned CUID = 0);
/// EmitDwarfLocDirective - This implements the DWARF2 /// EmitDwarfLocDirective - This implements the DWARF2
// '.loc fileno lineno ...' assembler directive. // '.loc fileno lineno ...' assembler directive.

View File

@ -241,7 +241,8 @@ void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
if (Line == 0) if (Line == 0)
return; return;
unsigned FileID = DD->getOrCreateSourceID(V.getContext().getFilename(), unsigned FileID = DD->getOrCreateSourceID(V.getContext().getFilename(),
V.getContext().getDirectory()); V.getContext().getDirectory(),
getUniqueID());
assert(FileID && "Invalid file id"); assert(FileID && "Invalid file id");
addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
@ -257,7 +258,8 @@ void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
unsigned Line = G.getLineNumber(); unsigned Line = G.getLineNumber();
if (Line == 0) if (Line == 0)
return; return;
unsigned FileID = DD->getOrCreateSourceID(G.getFilename(), G.getDirectory()); unsigned FileID = DD->getOrCreateSourceID(G.getFilename(), G.getDirectory(),
getUniqueID());
assert(FileID && "Invalid file id"); assert(FileID && "Invalid file id");
addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
@ -276,7 +278,7 @@ void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
return; return;
unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(), unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(),
SP.getDirectory()); SP.getDirectory(), getUniqueID());
assert(FileID && "Invalid file id"); assert(FileID && "Invalid file id");
addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
@ -293,7 +295,7 @@ void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
if (Line == 0) if (Line == 0)
return; return;
unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(), unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(),
Ty.getDirectory()); Ty.getDirectory(), getUniqueID());
assert(FileID && "Invalid file id"); assert(FileID && "Invalid file id");
addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
@ -311,7 +313,7 @@ void CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
return; return;
DIFile File = Ty.getFile(); DIFile File = Ty.getFile();
unsigned FileID = DD->getOrCreateSourceID(File.getFilename(), unsigned FileID = DD->getOrCreateSourceID(File.getFilename(),
File.getDirectory()); File.getDirectory(), getUniqueID());
assert(FileID && "Invalid file id"); assert(FileID && "Invalid file id");
addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
@ -329,7 +331,8 @@ void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
return; return;
StringRef FN = NS.getFilename(); StringRef FN = NS.getFilename();
unsigned FileID = DD->getOrCreateSourceID(FN, NS.getDirectory()); unsigned FileID = DD->getOrCreateSourceID(FN, NS.getDirectory(),
getUniqueID());
assert(FileID && "Invalid file id"); assert(FileID && "Invalid file id");
addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);

View File

@ -528,7 +528,8 @@ DIE *DwarfDebug::constructInlinedScopeDIE(CompileUnit *TheCU,
DILocation DL(Scope->getInlinedAt()); DILocation DL(Scope->getInlinedAt());
TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0,
getOrCreateSourceID(DL.getFilename(), DL.getDirectory())); getOrCreateSourceID(DL.getFilename(), DL.getDirectory(),
TheCU->getUniqueID()));
TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber()); TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
// Add name to the name table, we do this here because we're guaranteed // Add name to the name table, we do this here because we're guaranteed
@ -617,19 +618,28 @@ DIE *DwarfDebug::constructScopeDIE(CompileUnit *TheCU, LexicalScope *Scope) {
// SourceIds map. This can update DirectoryNames and SourceFileNames maps // SourceIds map. This can update DirectoryNames and SourceFileNames maps
// as well. // as well.
unsigned DwarfDebug::getOrCreateSourceID(StringRef FileName, unsigned DwarfDebug::getOrCreateSourceID(StringRef FileName,
StringRef DirName) { StringRef DirName, unsigned CUID) {
// If we use .loc in assembly, we can't separate .file entries according to
// compile units. Thus all files will belong to the default compile unit.
if (Asm->TM.hasMCUseLoc() &&
Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer)
CUID = 0;
// If FE did not provide a file name, then assume stdin. // If FE did not provide a file name, then assume stdin.
if (FileName.empty()) if (FileName.empty())
return getOrCreateSourceID("<stdin>", StringRef()); return getOrCreateSourceID("<stdin>", StringRef(), CUID);
// TODO: this might not belong here. See if we can factor this better. // TODO: this might not belong here. See if we can factor this better.
if (DirName == CompilationDir) if (DirName == CompilationDir)
DirName = ""; DirName = "";
unsigned SrcId = SourceIdMap.size()+1; // FileIDCUMap stores the current ID for the given compile unit.
unsigned SrcId = FileIDCUMap[CUID] + 1;
// We look up the file/dir pair by concatenating them with a zero byte. // We look up the CUID/file/dir by concatenating them with a zero byte.
SmallString<128> NamePair; SmallString<128> NamePair;
NamePair += CUID;
NamePair += '\0';
NamePair += DirName; NamePair += DirName;
NamePair += '\0'; // Zero bytes are not allowed in paths. NamePair += '\0'; // Zero bytes are not allowed in paths.
NamePair += FileName; NamePair += FileName;
@ -638,8 +648,9 @@ unsigned DwarfDebug::getOrCreateSourceID(StringRef FileName,
if (Ent.getValue() != SrcId) if (Ent.getValue() != SrcId)
return Ent.getValue(); return Ent.getValue();
FileIDCUMap[CUID] = SrcId;
// Print out a .file directive to specify files for .loc directives. // Print out a .file directive to specify files for .loc directives.
Asm->OutStreamer.EmitDwarfFileDirective(SrcId, DirName, FileName); Asm->OutStreamer.EmitDwarfFileDirective(SrcId, DirName, FileName, CUID);
return SrcId; return SrcId;
} }
@ -650,14 +661,17 @@ CompileUnit *DwarfDebug::constructCompileUnit(const MDNode *N) {
DICompileUnit DIUnit(N); DICompileUnit DIUnit(N);
StringRef FN = DIUnit.getFilename(); StringRef FN = DIUnit.getFilename();
CompilationDir = DIUnit.getDirectory(); CompilationDir = DIUnit.getDirectory();
// Call this to emit a .file directive if it wasn't emitted for the source
// file this CU comes from yet.
getOrCreateSourceID(FN, CompilationDir);
DIE *Die = new DIE(dwarf::DW_TAG_compile_unit); DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++, CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++,
DIUnit.getLanguage(), Die, Asm, DIUnit.getLanguage(), Die, Asm,
this, &InfoHolder); this, &InfoHolder);
FileIDCUMap[NewCU->getUniqueID()] = 0;
// Call this to emit a .file directive if it wasn't emitted for the source
// file this CU comes from yet.
getOrCreateSourceID(FN, CompilationDir, NewCU->getUniqueID());
NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer()); NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());
NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2, NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
DIUnit.getLanguage()); DIUnit.getLanguage());
@ -1707,7 +1721,8 @@ void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
} else } else
llvm_unreachable("Unexpected scope info"); llvm_unreachable("Unexpected scope info");
Src = getOrCreateSourceID(Fn, Dir); Src = getOrCreateSourceID(Fn, Dir,
Asm->OutStreamer.getContext().getDwarfCompileUnitID());
} }
Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn); Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn);
} }

View File

@ -305,7 +305,9 @@ class DwarfDebug {
// A list of all the unique abbreviations in use. // A list of all the unique abbreviations in use.
std::vector<DIEAbbrev *> Abbreviations; std::vector<DIEAbbrev *> Abbreviations;
// Source id map, i.e. pair of source filename and directory, // Stores the current file ID for a given compile unit.
DenseMap <unsigned, unsigned> FileIDCUMap;
// Source id map, i.e. CUID, source filename and directory,
// separated by a zero byte, mapped to a unique id. // separated by a zero byte, mapped to a unique id.
StringMap<unsigned, BumpPtrAllocator&> SourceIdMap; StringMap<unsigned, BumpPtrAllocator&> SourceIdMap;
@ -626,7 +628,8 @@ public:
/// \brief Look up the source id with the given directory and source file /// \brief Look up the source id with the given directory and source file
/// names. If none currently exists, create a new id and insert it in the /// names. If none currently exists, create a new id and insert it in the
/// SourceIds map. /// SourceIds map.
unsigned getOrCreateSourceID(StringRef DirName, StringRef FullName); unsigned getOrCreateSourceID(StringRef DirName, StringRef FullName,
unsigned CUID);
/// \brief Recursively Emits a debug information entry. /// \brief Recursively Emits a debug information entry.
void emitDIE(DIE *Die, std::vector<DIEAbbrev *> *Abbrevs); void emitDIE(DIE *Die, std::vector<DIEAbbrev *> *Abbrevs);

View File

@ -215,7 +215,7 @@ public:
virtual void EmitFileDirective(StringRef Filename); virtual void EmitFileDirective(StringRef Filename);
virtual bool EmitDwarfFileDirective(unsigned FileNo, StringRef Directory, virtual bool EmitDwarfFileDirective(unsigned FileNo, StringRef Directory,
StringRef Filename); StringRef Filename, unsigned CUID = 0);
virtual void EmitDwarfLocDirective(unsigned FileNo, unsigned Line, virtual void EmitDwarfLocDirective(unsigned FileNo, unsigned Line,
unsigned Column, unsigned Flags, unsigned Column, unsigned Flags,
unsigned Isa, unsigned Discriminator, unsigned Isa, unsigned Discriminator,
@ -828,14 +828,14 @@ void MCAsmStreamer::EmitFileDirective(StringRef Filename) {
} }
bool MCAsmStreamer::EmitDwarfFileDirective(unsigned FileNo, StringRef Directory, bool MCAsmStreamer::EmitDwarfFileDirective(unsigned FileNo, StringRef Directory,
StringRef Filename) { StringRef Filename, unsigned CUID) {
if (!UseDwarfDirectory && !Directory.empty()) { if (!UseDwarfDirectory && !Directory.empty()) {
if (sys::path::is_absolute(Filename)) if (sys::path::is_absolute(Filename))
return EmitDwarfFileDirective(FileNo, "", Filename); return EmitDwarfFileDirective(FileNo, "", Filename, CUID);
SmallString<128> FullPathName = Directory; SmallString<128> FullPathName = Directory;
sys::path::append(FullPathName, Filename); sys::path::append(FullPathName, Filename);
return EmitDwarfFileDirective(FileNo, "", FullPathName); return EmitDwarfFileDirective(FileNo, "", FullPathName, CUID);
} }
if (UseLoc) { if (UseLoc) {
@ -846,8 +846,11 @@ bool MCAsmStreamer::EmitDwarfFileDirective(unsigned FileNo, StringRef Directory,
} }
PrintQuotedString(Filename, OS); PrintQuotedString(Filename, OS);
EmitEOL(); EmitEOL();
// All .file will belong to a single CUID.
CUID = 0;
} }
return this->MCStreamer::EmitDwarfFileDirective(FileNo, Directory, Filename); return this->MCStreamer::EmitDwarfFileDirective(FileNo, Directory, Filename,
CUID);
} }
void MCAsmStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line, void MCAsmStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line,

View File

@ -77,8 +77,8 @@ void MCContext::reset() {
Symbols.clear(); Symbols.clear();
Allocator.Reset(); Allocator.Reset();
Instances.clear(); Instances.clear();
MCDwarfFiles.clear(); MCDwarfFilesCUMap.clear();
MCDwarfDirs.clear(); MCDwarfDirsCUMap.clear();
MCGenDwarfLabelEntries.clear(); MCGenDwarfLabelEntries.clear();
DwarfDebugFlags = StringRef(); DwarfDebugFlags = StringRef();
MCLineSections.clear(); MCLineSections.clear();
@ -299,11 +299,13 @@ const MCSection *MCContext::getCOFFSection(StringRef Section,
/// error and zero is returned and the client reports the error, else the /// error and zero is returned and the client reports the error, else the
/// allocated file number is returned. The file numbers may be in any order. /// allocated file number is returned. The file numbers may be in any order.
unsigned MCContext::GetDwarfFile(StringRef Directory, StringRef FileName, unsigned MCContext::GetDwarfFile(StringRef Directory, StringRef FileName,
unsigned FileNumber) { unsigned FileNumber, unsigned CUID) {
// TODO: a FileNumber of zero says to use the next available file number. // TODO: a FileNumber of zero says to use the next available file number.
// Note: in GenericAsmParser::ParseDirectiveFile() FileNumber was checked // Note: in GenericAsmParser::ParseDirectiveFile() FileNumber was checked
// to not be less than one. This needs to be change to be not less than zero. // to not be less than one. This needs to be change to be not less than zero.
std::vector<MCDwarfFile *>& MCDwarfFiles = MCDwarfFilesCUMap[CUID];
std::vector<StringRef>& MCDwarfDirs = MCDwarfDirsCUMap[CUID];
// Make space for this FileNumber in the MCDwarfFiles vector if needed. // Make space for this FileNumber in the MCDwarfFiles vector if needed.
if (FileNumber >= MCDwarfFiles.size()) { if (FileNumber >= MCDwarfFiles.size()) {
MCDwarfFiles.resize(FileNumber + 1); MCDwarfFiles.resize(FileNumber + 1);
@ -363,7 +365,8 @@ unsigned MCContext::GetDwarfFile(StringRef Directory, StringRef FileName,
/// isValidDwarfFileNumber - takes a dwarf file number and returns true if it /// isValidDwarfFileNumber - takes a dwarf file number and returns true if it
/// currently is assigned and false otherwise. /// currently is assigned and false otherwise.
bool MCContext::isValidDwarfFileNumber(unsigned FileNumber) { bool MCContext::isValidDwarfFileNumber(unsigned FileNumber, unsigned CUID) {
std::vector<MCDwarfFile *>& MCDwarfFiles = MCDwarfFilesCUMap[CUID];
if(FileNumber == 0 || FileNumber >= MCDwarfFiles.size()) if(FileNumber == 0 || FileNumber >= MCDwarfFiles.size())
return false; return false;

View File

@ -299,7 +299,7 @@ const MCSymbol *MCDwarfFileTable::EmitCU(MCStreamer *MCOS, unsigned CUID) {
// First the directory table. // First the directory table.
const std::vector<StringRef> &MCDwarfDirs = const std::vector<StringRef> &MCDwarfDirs =
context.getMCDwarfDirs(); context.getMCDwarfDirs(CUID);
for (unsigned i = 0; i < MCDwarfDirs.size(); i++) { for (unsigned i = 0; i < MCDwarfDirs.size(); i++) {
MCOS->EmitBytes(MCDwarfDirs[i]); // the DirectoryName MCOS->EmitBytes(MCDwarfDirs[i]); // the DirectoryName
MCOS->EmitBytes(StringRef("\0", 1)); // the null term. of the string MCOS->EmitBytes(StringRef("\0", 1)); // the null term. of the string
@ -308,7 +308,7 @@ const MCSymbol *MCDwarfFileTable::EmitCU(MCStreamer *MCOS, unsigned CUID) {
// Second the file table. // Second the file table.
const std::vector<MCDwarfFile *> &MCDwarfFiles = const std::vector<MCDwarfFile *> &MCDwarfFiles =
MCOS->getContext().getMCDwarfFiles(); MCOS->getContext().getMCDwarfFiles(CUID);
for (unsigned i = 1; i < MCDwarfFiles.size(); i++) { for (unsigned i = 1; i < MCDwarfFiles.size(); i++) {
MCOS->EmitBytes(MCDwarfFiles[i]->getName()); // FileName MCOS->EmitBytes(MCDwarfFiles[i]->getName()); // FileName
MCOS->EmitBytes(StringRef("\0", 1)); // the null term. of the string MCOS->EmitBytes(StringRef("\0", 1)); // the null term. of the string

View File

@ -89,7 +89,7 @@ namespace {
virtual void EmitFileDirective(StringRef Filename) {} virtual void EmitFileDirective(StringRef Filename) {}
virtual bool EmitDwarfFileDirective(unsigned FileNo, StringRef Directory, virtual bool EmitDwarfFileDirective(unsigned FileNo, StringRef Directory,
StringRef Filename) { StringRef Filename, unsigned CUID = 0) {
return false; return false;
} }
virtual void EmitDwarfLocDirective(unsigned FileNo, unsigned Line, virtual void EmitDwarfLocDirective(unsigned FileNo, unsigned Line,

View File

@ -95,7 +95,7 @@ public:
report_fatal_error("unsupported directive in pure streamer"); report_fatal_error("unsupported directive in pure streamer");
} }
virtual bool EmitDwarfFileDirective(unsigned FileNo, StringRef Directory, virtual bool EmitDwarfFileDirective(unsigned FileNo, StringRef Directory,
StringRef Filename) { StringRef Filename, unsigned CUID = 0) {
report_fatal_error("unsupported directive in pure streamer"); report_fatal_error("unsupported directive in pure streamer");
} }

View File

@ -157,8 +157,8 @@ void MCStreamer::EmitFill(uint64_t NumBytes, uint8_t FillValue,
bool MCStreamer::EmitDwarfFileDirective(unsigned FileNo, bool MCStreamer::EmitDwarfFileDirective(unsigned FileNo,
StringRef Directory, StringRef Directory,
StringRef Filename) { StringRef Filename, unsigned CUID) {
return getContext().GetDwarfFile(Directory, Filename, FileNo) == 0; return getContext().GetDwarfFile(Directory, Filename, FileNo, CUID) == 0;
} }
void MCStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line, void MCStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line,

View File

@ -9,13 +9,16 @@
; CHECK: DW_TAG_compile_unit ; CHECK: DW_TAG_compile_unit
; CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) ; CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000)
; CHECK: DW_AT_stmt_list [DW_FORM_data4] (0x00000049) ; CHECK: DW_AT_stmt_list [DW_FORM_data4] (0x0000003c)
; CHECK: .debug_line contents: ; CHECK: .debug_line contents:
; CHECK-NEXT: Line table prologue: ; CHECK-NEXT: Line table prologue:
; CHECK-NEXT: total_length: 0x00000045 ; CHECK-NEXT: total_length: 0x00000038
; CHECK: file_names[ 1] 0 0x00000000 0x00000000 simple.c
; CHECK: Line table prologue: ; CHECK: Line table prologue:
; CHECK: total_length: 0x00000047 ; CHECK-NEXT: total_length: 0x00000039
; CHECK: file_names[ 1] 0 0x00000000 0x00000000 simple2.c
; CHECK-NOT: file_names
define i32 @test(i32 %a) nounwind uwtable ssp { define i32 @test(i32 %a) nounwind uwtable ssp {
entry: entry: