mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00: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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@176605 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -215,7 +215,7 @@ public:
|
||||
|
||||
virtual void EmitFileDirective(StringRef Filename);
|
||||
virtual bool EmitDwarfFileDirective(unsigned FileNo, StringRef Directory,
|
||||
StringRef Filename);
|
||||
StringRef Filename, unsigned CUID = 0);
|
||||
virtual void EmitDwarfLocDirective(unsigned FileNo, unsigned Line,
|
||||
unsigned Column, unsigned Flags,
|
||||
unsigned Isa, unsigned Discriminator,
|
||||
@@ -828,14 +828,14 @@ void MCAsmStreamer::EmitFileDirective(StringRef Filename) {
|
||||
}
|
||||
|
||||
bool MCAsmStreamer::EmitDwarfFileDirective(unsigned FileNo, StringRef Directory,
|
||||
StringRef Filename) {
|
||||
StringRef Filename, unsigned CUID) {
|
||||
if (!UseDwarfDirectory && !Directory.empty()) {
|
||||
if (sys::path::is_absolute(Filename))
|
||||
return EmitDwarfFileDirective(FileNo, "", Filename);
|
||||
return EmitDwarfFileDirective(FileNo, "", Filename, CUID);
|
||||
|
||||
SmallString<128> FullPathName = Directory;
|
||||
sys::path::append(FullPathName, Filename);
|
||||
return EmitDwarfFileDirective(FileNo, "", FullPathName);
|
||||
return EmitDwarfFileDirective(FileNo, "", FullPathName, CUID);
|
||||
}
|
||||
|
||||
if (UseLoc) {
|
||||
@@ -846,8 +846,11 @@ bool MCAsmStreamer::EmitDwarfFileDirective(unsigned FileNo, StringRef Directory,
|
||||
}
|
||||
PrintQuotedString(Filename, OS);
|
||||
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,
|
||||
|
@@ -77,8 +77,8 @@ void MCContext::reset() {
|
||||
Symbols.clear();
|
||||
Allocator.Reset();
|
||||
Instances.clear();
|
||||
MCDwarfFiles.clear();
|
||||
MCDwarfDirs.clear();
|
||||
MCDwarfFilesCUMap.clear();
|
||||
MCDwarfDirsCUMap.clear();
|
||||
MCGenDwarfLabelEntries.clear();
|
||||
DwarfDebugFlags = StringRef();
|
||||
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
|
||||
/// allocated file number is returned. The file numbers may be in any order.
|
||||
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.
|
||||
// Note: in GenericAsmParser::ParseDirectiveFile() FileNumber was checked
|
||||
// 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.
|
||||
if (FileNumber >= MCDwarfFiles.size()) {
|
||||
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
|
||||
/// 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())
|
||||
return false;
|
||||
|
||||
|
@@ -299,7 +299,7 @@ const MCSymbol *MCDwarfFileTable::EmitCU(MCStreamer *MCOS, unsigned CUID) {
|
||||
|
||||
// First the directory table.
|
||||
const std::vector<StringRef> &MCDwarfDirs =
|
||||
context.getMCDwarfDirs();
|
||||
context.getMCDwarfDirs(CUID);
|
||||
for (unsigned i = 0; i < MCDwarfDirs.size(); i++) {
|
||||
MCOS->EmitBytes(MCDwarfDirs[i]); // the DirectoryName
|
||||
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.
|
||||
const std::vector<MCDwarfFile *> &MCDwarfFiles =
|
||||
MCOS->getContext().getMCDwarfFiles();
|
||||
MCOS->getContext().getMCDwarfFiles(CUID);
|
||||
for (unsigned i = 1; i < MCDwarfFiles.size(); i++) {
|
||||
MCOS->EmitBytes(MCDwarfFiles[i]->getName()); // FileName
|
||||
MCOS->EmitBytes(StringRef("\0", 1)); // the null term. of the string
|
||||
|
@@ -89,7 +89,7 @@ namespace {
|
||||
|
||||
virtual void EmitFileDirective(StringRef Filename) {}
|
||||
virtual bool EmitDwarfFileDirective(unsigned FileNo, StringRef Directory,
|
||||
StringRef Filename) {
|
||||
StringRef Filename, unsigned CUID = 0) {
|
||||
return false;
|
||||
}
|
||||
virtual void EmitDwarfLocDirective(unsigned FileNo, unsigned Line,
|
||||
|
@@ -95,7 +95,7 @@ public:
|
||||
report_fatal_error("unsupported directive in pure streamer");
|
||||
}
|
||||
virtual bool EmitDwarfFileDirective(unsigned FileNo, StringRef Directory,
|
||||
StringRef Filename) {
|
||||
StringRef Filename, unsigned CUID = 0) {
|
||||
report_fatal_error("unsupported directive in pure streamer");
|
||||
}
|
||||
|
||||
|
@@ -157,8 +157,8 @@ void MCStreamer::EmitFill(uint64_t NumBytes, uint8_t FillValue,
|
||||
|
||||
bool MCStreamer::EmitDwarfFileDirective(unsigned FileNo,
|
||||
StringRef Directory,
|
||||
StringRef Filename) {
|
||||
return getContext().GetDwarfFile(Directory, Filename, FileNo) == 0;
|
||||
StringRef Filename, unsigned CUID) {
|
||||
return getContext().GetDwarfFile(Directory, Filename, FileNo, CUID) == 0;
|
||||
}
|
||||
|
||||
void MCStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line,
|
||||
|
Reference in New Issue
Block a user