Hello All,
I have created a set of patches that get dwarf debugging support working for the COFF object file. I also believe I have fixed what appears to be a bug in how line info sections are referred to from the DW_TAG_compile_unit DIE. I have run some basic tests, analyzed dumps of both the objects files and the final executables, and run a test program against mingw-gdb and everything looks to be in order.
Here is a short description of what the patches accomplish
die.patch:
adds a new DIEValue type to represent a section relative label. (their was already a type id specified so I provided a class modeled after DIELabel)
secrel-fixup.patch:
creats a new target specific fixup type (reloc_coff_secrel32) to represent COFF Section Relative relocations and updats the COFF object writer to write it as COFF_IMAGE_REL_AMD64_SREL32
secrel-streamer.patch
adds a new directive in the MCStreamer interface to allow the AsmPrinter to emit a section relative label and provides implementations for all existings Streamer (all but WinCOFF either forward or error on it)
secrel-dwarf.patch
updates dwarf printing code to make use of the new directive & DIE value where appropriate (this is where the bug fix is)
coff-debug.patch
turns the dwarf output on in the X86/COFF AsmInfo classes
die.patch (2.33 KB)
secrel-fixup.patch (2.07 KB)
secrel-streamer.patch (6.15 KB)
secrel-dwarf.patch (2.29 KB)
coff-debug.patch (822 Bytes)
Hi Nathan,
Thanks for these patches. I will review them and get back to you.
This patches look fine. I am curious, how are you testing debug info support for COFF ?
Well, this patch fails following FE tests on darwin.
LLVM :: FrontendC++/2006-11-06-StackTrace.cpp
LLVM :: FrontendC++/2006-11-30-Pubnames.cpp
LLVM :: FrontendC++/2010-08-31-ByValArg.cpp
LLVM :: FrontendC/2009-02-17-BitField-dbg.c
LLVM :: FrontendC/2010-01-14-StaticVariable.c
LLVM :: FrontendC/2010-02-16-DbgVarScope.c
LLVM :: FrontendObjC/2009-08-17-DebugInfo.m
This is because of
@@ -1903,7 +1912,8 @@
addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_addr,
Asm->GetTempSymbol(“section_line”));
else
- addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
- addSectionOffset(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_addr,
- Asm->GetTempSymbol(“section_line”));
if (!Dir.empty())
addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
You probably wanted to do…
@@ -1904,8 +1913,8 @@
// DW_AT_stmt_list is a offset of line number information for this
// compile unit in debug_line section.
if (Asm->MAI->doesDwarfUsesAbsoluteLabelForStmtList())
- addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_addr,
- Asm->GetTempSymbol(“section_line”));
- addSectionOffset(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_addr,
- Asm->GetTempSymbol(“section_line”));
else
addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
I updated this part and applied your patch. r126425
Thanks for the contribution!
I have been testing by compiling code with either clang or my own project then linking with MinGW’s linker against their libraries then using MinGW’s build of gdb
Thanks for taking the time to review this and get it into the mainline.
[snip]
This is because of
@@ -1903,7 +1912,8 @@
addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_addr,
Asm->GetTempSymbol(“section_line”));
else
- addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
- addSectionOffset(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_addr,
- Asm->GetTempSymbol(“section_line”));
if (!Dir.empty())
addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
You probably wanted to do…
@@ -1904,8 +1913,8 @@
// DW_AT_stmt_list is a offset of line number information for this
// compile unit in debug_line section.
if (Asm->MAI->doesDwarfUsesAbsoluteLabelForStmtList())
- addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_addr,
- Asm->GetTempSymbol(“section_line”));
- addSectionOffset(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_addr,
- Asm->GetTempSymbol(“section_line”));
else
addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
I am not sure about this, Looking at it now I don’t understand what the return value of doesDwarfUsesAbsoluteLabelForStmtList is supposed to mean. I know that when I allowed the COFF’s MCAsmInfo to use this line:
addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
I got a relocation that caused an absolute pointer to the debug_line section instead of the offset from the beginning of the section. This looked like a bug too me. To me it doesn’t matter: I can change DwarfUsesAbsoluteLabelForStmtList to true for MCAsmInfoCOFF and get the correct behavior for COFF output.
[snip]
-Nathan