mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-03 13:31:05 +00:00
DebugInfo: Use MC line table file entry uniquing for non-asm input as well.
See r204027 for the precursor to this that applied to asm debug info. This required some non-obvious API changes to handle the case of asm output (we never go asm->asm so this didn't come up in r204027): the modification of the file/directory name by MCDwarfLineTableHeader needed to be reflected in the MCAsmStreamer caller so it could print the appropriate .file directive, so those StringRef parameters are now non-const ref (in/out) parameters rather than just const. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@204069 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
03a3f643b1
commit
daeeb37373
@ -182,7 +182,8 @@ struct MCDwarfLineTableHeader {
|
||||
SmallVector<MCDwarfFile, 3> MCDwarfFiles;
|
||||
StringMap<unsigned> SourceIdMap;
|
||||
MCDwarfLineTableHeader() : Label(nullptr) {}
|
||||
unsigned getFile(StringRef Directory, StringRef FileName, unsigned FileNumber = 0);
|
||||
unsigned getFile(StringRef &Directory, StringRef &FileName,
|
||||
unsigned FileNumber = 0);
|
||||
std::pair<MCSymbol *, MCSymbol *> Emit(MCStreamer *MCOS) const;
|
||||
};
|
||||
|
||||
@ -197,7 +198,8 @@ public:
|
||||
// This emits the Dwarf file and the line tables for a given Compile Unit.
|
||||
const MCSymbol *EmitCU(MCStreamer *MCOS) const;
|
||||
|
||||
unsigned getFile(StringRef Directory, StringRef FileName, unsigned FileNumber = 0);
|
||||
unsigned getFile(StringRef &Directory, StringRef &FileName,
|
||||
unsigned FileNumber = 0);
|
||||
|
||||
MCSymbol *getLabel() const {
|
||||
return Header.Label;
|
||||
|
@ -171,8 +171,7 @@ static unsigned getDwarfVersionFromModule(const Module *M) {
|
||||
}
|
||||
|
||||
DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
|
||||
: Asm(A), MMI(Asm->MMI), FirstCU(0), SourceIdMap(DIEValueAllocator),
|
||||
PrevLabel(NULL), GlobalRangeCount(0),
|
||||
: Asm(A), MMI(Asm->MMI), FirstCU(0), PrevLabel(NULL), GlobalRangeCount(0),
|
||||
InfoHolder(A, "info_string", DIEValueAllocator), HasCURanges(false),
|
||||
UsedNonDefaultText(false),
|
||||
SkeletonHolder(A, "skel_string", DIEValueAllocator) {
|
||||
@ -680,36 +679,12 @@ unsigned DwarfDebug::getOrCreateSourceID(StringRef FileName, StringRef DirName,
|
||||
if (Asm->OutStreamer.hasRawTextSupport())
|
||||
CUID = 0;
|
||||
|
||||
// If FE did not provide a file name, then assume stdin.
|
||||
if (FileName.empty()) {
|
||||
FileName = "<stdin>";
|
||||
DirName = "";
|
||||
}
|
||||
|
||||
// TODO: this might not belong here. See if we can factor this better.
|
||||
if (DirName == CompilationDir)
|
||||
DirName = "";
|
||||
|
||||
// FileIDCUMap stores the current ID for the given compile unit.
|
||||
unsigned SrcId = FileIDCUMap[CUID] + 1;
|
||||
|
||||
// We look up the CUID/file/dir by concatenating them with a zero byte.
|
||||
SmallString<128> NamePair;
|
||||
NamePair += utostr(CUID);
|
||||
NamePair += '\0';
|
||||
NamePair += DirName;
|
||||
NamePair += '\0'; // Zero bytes are not allowed in paths.
|
||||
NamePair += FileName;
|
||||
|
||||
StringMapEntry<unsigned> &Ent = SourceIdMap.GetOrCreateValue(NamePair, SrcId);
|
||||
if (Ent.getValue() != SrcId)
|
||||
return Ent.getValue();
|
||||
|
||||
FileIDCUMap[CUID] = SrcId;
|
||||
// Print out a .file directive to specify files for .loc directives.
|
||||
Asm->OutStreamer.EmitDwarfFileDirective(SrcId, DirName, FileName, CUID);
|
||||
|
||||
return SrcId;
|
||||
return Asm->OutStreamer.EmitDwarfFileDirective(0, DirName, FileName, CUID);
|
||||
}
|
||||
|
||||
void DwarfDebug::addGnuPubAttributes(DwarfUnit *U, DIE *D) const {
|
||||
@ -730,8 +705,6 @@ DwarfCompileUnit *DwarfDebug::constructDwarfCompileUnit(DICompileUnit DIUnit) {
|
||||
InfoHolder.getUnits().size(), Die, DIUnit, Asm, this, &InfoHolder);
|
||||
InfoHolder.addUnit(NewCU);
|
||||
|
||||
FileIDCUMap[NewCU->getUniqueID()] = 0;
|
||||
|
||||
NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());
|
||||
NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
|
||||
DIUnit.getLanguage());
|
||||
|
@ -356,12 +356,6 @@ class DwarfDebug : public AsmPrinterHandler {
|
||||
// Used to unique C++ member function declarations.
|
||||
StringMap<const MDNode *> OdrMemberMap;
|
||||
|
||||
// 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.
|
||||
StringMap<unsigned, BumpPtrAllocator &> SourceIdMap;
|
||||
|
||||
// List of all labels used in aranges generation.
|
||||
std::vector<SymbolCU> ArangeLabels;
|
||||
|
||||
|
@ -848,13 +848,27 @@ unsigned MCAsmStreamer::EmitDwarfFileDirective(unsigned FileNo,
|
||||
StringRef Directory,
|
||||
StringRef Filename,
|
||||
unsigned CUID) {
|
||||
assert(CUID == 0);
|
||||
|
||||
MCDwarfLineTable &Table = getContext().getMCDwarfLineTable(CUID);
|
||||
unsigned NumFiles = Table.getMCDwarfFiles().size();
|
||||
FileNo = Table.getFile(Directory, Filename, FileNo);
|
||||
if (FileNo == 0)
|
||||
return 0;
|
||||
if (NumFiles == Table.getMCDwarfFiles().size())
|
||||
return FileNo;
|
||||
|
||||
SmallString<128> FullPathName;
|
||||
|
||||
if (!UseDwarfDirectory && !Directory.empty()) {
|
||||
if (sys::path::is_absolute(Filename))
|
||||
return EmitDwarfFileDirective(FileNo, "", Filename, CUID);
|
||||
|
||||
SmallString<128> FullPathName = Directory;
|
||||
sys::path::append(FullPathName, Filename);
|
||||
return EmitDwarfFileDirective(FileNo, "", FullPathName, CUID);
|
||||
Directory = "";
|
||||
else {
|
||||
FullPathName = Directory;
|
||||
sys::path::append(FullPathName, Filename);
|
||||
Directory = "";
|
||||
Filename = FullPathName;
|
||||
}
|
||||
}
|
||||
|
||||
OS << "\t.file\t" << FileNo << ' ';
|
||||
@ -864,11 +878,8 @@ unsigned MCAsmStreamer::EmitDwarfFileDirective(unsigned FileNo,
|
||||
}
|
||||
PrintQuotedString(Filename, OS);
|
||||
EmitEOL();
|
||||
// All .file will belong to a single CUID.
|
||||
CUID = 0;
|
||||
|
||||
return this->MCStreamer::EmitDwarfFileDirective(FileNo, Directory, Filename,
|
||||
CUID);
|
||||
return FileNo;
|
||||
}
|
||||
|
||||
void MCAsmStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line,
|
||||
|
@ -287,6 +287,7 @@ std::pair<MCSymbol *, MCSymbol *> MCDwarfLineTableHeader::Emit(MCStreamer *MCOS)
|
||||
|
||||
// Second the file table.
|
||||
for (unsigned i = 1; i < MCDwarfFiles.size(); i++) {
|
||||
assert(!MCDwarfFiles[i].Name.empty());
|
||||
MCOS->EmitBytes(MCDwarfFiles[i].Name); // FileName
|
||||
MCOS->EmitBytes(StringRef("\0", 1)); // the null term. of the string
|
||||
// the Directory num
|
||||
@ -331,14 +332,19 @@ const MCSymbol *MCDwarfLineTable::EmitCU(MCStreamer *MCOS) const {
|
||||
return LineStartSym;
|
||||
}
|
||||
|
||||
unsigned MCDwarfLineTable::getFile(StringRef Directory, StringRef FileName,
|
||||
unsigned MCDwarfLineTable::getFile(StringRef &Directory, StringRef &FileName,
|
||||
unsigned FileNumber) {
|
||||
return Header.getFile(Directory, FileName, FileNumber);
|
||||
}
|
||||
|
||||
unsigned MCDwarfLineTableHeader::getFile(StringRef Directory,
|
||||
StringRef FileName,
|
||||
unsigned MCDwarfLineTableHeader::getFile(StringRef &Directory,
|
||||
StringRef &FileName,
|
||||
unsigned FileNumber) {
|
||||
if (FileName.empty()) {
|
||||
FileName = "<stdin>";
|
||||
Directory = "";
|
||||
}
|
||||
assert(!FileName.empty());
|
||||
if (FileNumber == 0) {
|
||||
FileNumber = SourceIdMap.size() + 1;
|
||||
assert((MCDwarfFiles.empty() || FileNumber == MCDwarfFiles.size()) &&
|
||||
|
Loading…
Reference in New Issue
Block a user