1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 19:52:54 +01:00

Reorder functions in WinCodeViewLineTables.cpp [NFC]

This helps read the comments and understand the code in a natural order

llvm-svn: 219508
This commit is contained in:
Timur Iskhodzhanov 2014-10-10 16:05:32 +00:00
parent 4fb56689c8
commit c1bf6e5e98

View File

@ -116,6 +116,57 @@ WinCodeViewLineTables::WinCodeViewLineTables(AsmPrinter *AP)
Asm = AP;
}
void WinCodeViewLineTables::endModule() {
if (FnDebugInfo.empty())
return;
assert(Asm != nullptr);
Asm->OutStreamer.SwitchSection(
Asm->getObjFileLowering().getCOFFDebugSymbolsSection());
Asm->EmitInt32(COFF::DEBUG_SECTION_MAGIC);
// The COFF .debug$S section consists of several subsections, each starting
// with a 4-byte control code (e.g. 0xF1, 0xF2, etc) and then a 4-byte length
// of the payload followed by the payload itself. The subsections are 4-byte
// aligned.
// Emit per-function debug information. This code is extracted into a
// separate function for readability.
for (size_t I = 0, E = VisitedFunctions.size(); I != E; ++I)
emitDebugInfoForFunction(VisitedFunctions[I]);
// This subsection holds a file index to offset in string table table.
Asm->OutStreamer.AddComment("File index to string table offset subsection");
Asm->EmitInt32(COFF::DEBUG_INDEX_SUBSECTION);
size_t NumFilenames = FileNameRegistry.Infos.size();
Asm->EmitInt32(8 * NumFilenames);
for (size_t I = 0, E = FileNameRegistry.Filenames.size(); I != E; ++I) {
StringRef Filename = FileNameRegistry.Filenames[I];
// For each unique filename, just write its offset in the string table.
Asm->EmitInt32(FileNameRegistry.Infos[Filename].StartOffset);
// The function name offset is not followed by any additional data.
Asm->EmitInt32(0);
}
// This subsection holds the string table.
Asm->OutStreamer.AddComment("String table");
Asm->EmitInt32(COFF::DEBUG_STRING_TABLE_SUBSECTION);
Asm->EmitInt32(FileNameRegistry.LastOffset);
// The payload starts with a null character.
Asm->EmitInt8(0);
for (size_t I = 0, E = FileNameRegistry.Filenames.size(); I != E; ++I) {
// Just emit unique filenames one by one, separated by a null character.
Asm->OutStreamer.EmitBytes(FileNameRegistry.Filenames[I]);
Asm->EmitInt8(0);
}
// No more subsections. Fill with zeros to align the end of the section by 4.
Asm->OutStreamer.EmitFill((-FileNameRegistry.LastOffset) % 4, 0);
clear();
}
static void EmitLabelDiff(MCStreamer &Streamer,
const MCSymbol *From, const MCSymbol *To) {
MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None;
@ -154,9 +205,9 @@ void WinCodeViewLineTables::emitDebugInfoForFunction(const Function *GV) {
}
FilenameSegmentLengths[LastSegmentEnd] = FI.Instrs.size() - LastSegmentEnd;
// Emit the control code of the subsection followed by the payload size.
// Emit a line table subsection, requred to do PC-to-file:line lookup.
Asm->OutStreamer.AddComment(
"Linetable subsection for " + Twine(Fn->getName()));
"Line table subsection for " + Twine(Fn->getName()));
Asm->EmitInt32(COFF::DEBUG_LINE_TABLE_SUBSECTION);
MCSymbol *SubsectionBegin = Asm->MMI->getContext().CreateTempSymbol(),
*SubsectionEnd = Asm->MMI->getContext().CreateTempSymbol();
@ -214,55 +265,6 @@ void WinCodeViewLineTables::emitDebugInfoForFunction(const Function *GV) {
Asm->OutStreamer.EmitLabel(SubsectionEnd);
}
void WinCodeViewLineTables::endModule() {
if (FnDebugInfo.empty())
return;
assert(Asm != nullptr);
Asm->OutStreamer.SwitchSection(
Asm->getObjFileLowering().getCOFFDebugSymbolsSection());
Asm->EmitInt32(COFF::DEBUG_SECTION_MAGIC);
// The COFF .debug$S section consists of several subsections, each starting
// with a 4-byte control code (e.g. 0xF1, 0xF2, etc) and then a 4-byte length
// of the payload followed by the payload itself. The subsections are 4-byte
// aligned.
for (size_t I = 0, E = VisitedFunctions.size(); I != E; ++I)
emitDebugInfoForFunction(VisitedFunctions[I]);
// This subsection holds a file index to offset in string table table.
Asm->OutStreamer.AddComment("File index to string table offset subsection");
Asm->EmitInt32(COFF::DEBUG_INDEX_SUBSECTION);
size_t NumFilenames = FileNameRegistry.Infos.size();
Asm->EmitInt32(8 * NumFilenames);
for (size_t I = 0, E = FileNameRegistry.Filenames.size(); I != E; ++I) {
StringRef Filename = FileNameRegistry.Filenames[I];
// For each unique filename, just write its offset in the string table.
Asm->EmitInt32(FileNameRegistry.Infos[Filename].StartOffset);
// The function name offset is not followed by any additional data.
Asm->EmitInt32(0);
}
// This subsection holds the string table.
Asm->OutStreamer.AddComment("String table");
Asm->EmitInt32(COFF::DEBUG_STRING_TABLE_SUBSECTION);
Asm->EmitInt32(FileNameRegistry.LastOffset);
// The payload starts with a null character.
Asm->EmitInt8(0);
for (size_t I = 0, E = FileNameRegistry.Filenames.size(); I != E; ++I) {
// Just emit unique filenames one by one, separated by a null character.
Asm->OutStreamer.EmitBytes(FileNameRegistry.Filenames[I]);
Asm->EmitInt8(0);
}
// No more subsections. Fill with zeros to align the end of the section by 4.
Asm->OutStreamer.EmitFill((-FileNameRegistry.LastOffset) % 4, 0);
clear();
}
void WinCodeViewLineTables::beginFunction(const MachineFunction *MF) {
assert(!CurFn && "Can't process two functions at once!");