mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-21 06:30:16 +00:00
MCDwarf: Sink file/directory creation down into MCDwarfFileTable form MCContext
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203836 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ac01874f19
commit
b60d2ba5c4
@ -190,6 +190,8 @@ public:
|
||||
//
|
||||
const MCSymbol *EmitCU(MCStreamer *MCOS) const;
|
||||
|
||||
unsigned getFile(StringRef Directory, StringRef FileName, unsigned FileNumber);
|
||||
|
||||
const SmallVectorImpl<std::string> &getMCDwarfDirs() const {
|
||||
return MCDwarfDirs;
|
||||
}
|
||||
|
@ -338,56 +338,7 @@ const MCSectionCOFF *MCContext::getCOFFSection(StringRef Section) {
|
||||
unsigned MCContext::GetDwarfFile(StringRef Directory, StringRef FileName,
|
||||
unsigned FileNumber, unsigned CUID) {
|
||||
MCDwarfFileTable &Table = MCDwarfFileTablesCUMap[CUID];
|
||||
SmallVectorImpl<MCDwarfFile>& MCDwarfFiles = Table.getMCDwarfFiles();
|
||||
SmallVectorImpl<std::string>& MCDwarfDirs = Table.getMCDwarfDirs();
|
||||
// Make space for this FileNumber in the MCDwarfFiles vector if needed.
|
||||
if (FileNumber >= MCDwarfFiles.size()) {
|
||||
MCDwarfFiles.resize(FileNumber + 1);
|
||||
}
|
||||
|
||||
// Get the new MCDwarfFile slot for this FileNumber.
|
||||
MCDwarfFile &File = MCDwarfFiles[FileNumber];
|
||||
|
||||
// It is an error to use see the same number more than once.
|
||||
if (!File.Name.empty())
|
||||
return 0;
|
||||
|
||||
if (Directory.empty()) {
|
||||
// Separate the directory part from the basename of the FileName.
|
||||
StringRef tFileName = sys::path::filename(FileName);
|
||||
if (!tFileName.empty()) {
|
||||
Directory = sys::path::parent_path(FileName);
|
||||
if (!Directory.empty())
|
||||
FileName = tFileName;
|
||||
}
|
||||
}
|
||||
|
||||
// Find or make an entry in the MCDwarfDirs vector for this Directory.
|
||||
// Capture directory name.
|
||||
unsigned DirIndex;
|
||||
if (Directory.empty()) {
|
||||
// For FileNames with no directories a DirIndex of 0 is used.
|
||||
DirIndex = 0;
|
||||
} else {
|
||||
DirIndex = 0;
|
||||
for (unsigned End = MCDwarfDirs.size(); DirIndex < End; DirIndex++) {
|
||||
if (Directory == MCDwarfDirs[DirIndex])
|
||||
break;
|
||||
}
|
||||
if (DirIndex >= MCDwarfDirs.size())
|
||||
MCDwarfDirs.push_back(Directory);
|
||||
// The DirIndex is one based, as DirIndex of 0 is used for FileNames with
|
||||
// no directories. MCDwarfDirs[] is unlike MCDwarfFiles[] in that the
|
||||
// directory names are stored at MCDwarfDirs[DirIndex-1] where FileNames
|
||||
// are stored at MCDwarfFiles[FileNumber].Name .
|
||||
DirIndex++;
|
||||
}
|
||||
|
||||
File.Name = FileName;
|
||||
File.DirIndex = DirIndex;
|
||||
|
||||
// return the allocated FileNumber.
|
||||
return FileNumber;
|
||||
return Table.getFile(Directory, FileName, FileNumber);
|
||||
}
|
||||
|
||||
/// isValidDwarfFileNumber - takes a dwarf file number and returns true if it
|
||||
|
@ -325,6 +325,55 @@ const MCSymbol *MCDwarfFileTable::EmitCU(MCStreamer *MCOS) const {
|
||||
return LineStartSym;
|
||||
}
|
||||
|
||||
unsigned MCDwarfFileTable::getFile(StringRef Directory, StringRef FileName, unsigned FileNumber) {
|
||||
// Make space for this FileNumber in the MCDwarfFiles vector if needed.
|
||||
MCDwarfFiles.resize(FileNumber + 1);
|
||||
|
||||
// Get the new MCDwarfFile slot for this FileNumber.
|
||||
MCDwarfFile &File = MCDwarfFiles[FileNumber];
|
||||
|
||||
// It is an error to use see the same number more than once.
|
||||
if (!File.Name.empty())
|
||||
return 0;
|
||||
|
||||
if (Directory.empty()) {
|
||||
// Separate the directory part from the basename of the FileName.
|
||||
StringRef tFileName = sys::path::filename(FileName);
|
||||
if (!tFileName.empty()) {
|
||||
Directory = sys::path::parent_path(FileName);
|
||||
if (!Directory.empty())
|
||||
FileName = tFileName;
|
||||
}
|
||||
}
|
||||
|
||||
// Find or make an entry in the MCDwarfDirs vector for this Directory.
|
||||
// Capture directory name.
|
||||
unsigned DirIndex;
|
||||
if (Directory.empty()) {
|
||||
// For FileNames with no directories a DirIndex of 0 is used.
|
||||
DirIndex = 0;
|
||||
} else {
|
||||
DirIndex = 0;
|
||||
for (unsigned End = MCDwarfDirs.size(); DirIndex < End; DirIndex++) {
|
||||
if (Directory == MCDwarfDirs[DirIndex])
|
||||
break;
|
||||
}
|
||||
if (DirIndex >= MCDwarfDirs.size())
|
||||
MCDwarfDirs.push_back(Directory);
|
||||
// The DirIndex is one based, as DirIndex of 0 is used for FileNames with
|
||||
// no directories. MCDwarfDirs[] is unlike MCDwarfFiles[] in that the
|
||||
// directory names are stored at MCDwarfDirs[DirIndex-1] where FileNames
|
||||
// are stored at MCDwarfFiles[FileNumber].Name .
|
||||
DirIndex++;
|
||||
}
|
||||
|
||||
File.Name = FileName;
|
||||
File.DirIndex = DirIndex;
|
||||
|
||||
// return the allocated FileNumber.
|
||||
return FileNumber;
|
||||
}
|
||||
|
||||
/// Utility function to emit the encoding to a streamer.
|
||||
void MCDwarfLineAddr::Emit(MCStreamer *MCOS, int64_t LineDelta,
|
||||
uint64_t AddrDelta) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user