[llvm-commits] Change DwarfUsesAbsoluteLabelForStmtList to false for X86ELFMCAsmInfo.

Jan Sjodin jan_sjodin at yahoo.com
Fri Mar 25 09:04:04 PDT 2011


I found this discussion on llvm-dev:
http://lists.cs.uiuc.edu/pipermail/llvmdev/2010-August/034104.html

This shows that my patch is correct in the sense that it does emit an offset 
(dwarfdump complained about the type of the entry not being DW_FORM_data4), but 
my patch would theoretically not work for ELF since it requires an absolute 
label so that a relocation is created. The thing is that the absolute label vs. 
label difference is not limited  to the stmt list, but is true for debug_abbrev, 
debug_pubnames etc. My patch relies like the other sections on this conversion 
(which is not an optimization at all, but actually ensures that a relocation 
will be created) in:

AsmPrinterDwarf.cpp:194:
  // If the section in question will end up with an address of 0 anyway, we can
  // just emit an absolute reference to save a relocation.
  if (Section.isBaseAddressKnownZero()) {
    OutStreamer.EmitSymbolValue(Label, 4, 0/*AddrSpace*/);
    return;
  }

This code converts the difference into the direct reference needed in ELF. I do 
not know why there was a problem specifically with section_line back then, but 
apparently that was fixed since I could now disable the check: if 
(Asm->MAI->doesDwarfUsesAbsoluteLabelForStmtList()) and rely on the conversion 
later on. Like I mentioned earlier, what dwarfdump really complained about was 
the type of the entry. I could equally rewrite my patch like this:
Index: lib/CodeGen/AsmPrinter/DwarfDebug.cpp
===================================================================
--- lib/CodeGen/AsmPrinter/DwarfDebug.cpp    (revision 128274)
+++ lib/CodeGen/AsmPrinter/DwarfDebug.cpp    (working copy)
@@ -1925,7 +1925,7 @@
   // 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,
+    addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
              Asm->GetTempSymbol("section_line"));
   else
     addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);

The reason why gdb did not complain about this is probably that the type was 
ignored and everything worked since the data was correct.

The question is what the proper cleanup should be. We could simply remove the 
doesDwarfUsesAbsoluteLabelForStmtList and make EmitSectionOffset decide if a 
label reference or a label difference should be emitted. The alternative would 
be to eliminate the conversion in EmitSectionOffset and expand 
doesDwarfUsesAbsoluteLabelForStmtList into something like 
doesDwarfUsesAbsoluteLabelForSections (I don't know if it is limited to certain 
sections), and change DwarfDebug to add labels and emit symbol values instead of 
just using EmitSectionOffset. I do not know what is best in this case, but 
having both mechanisms is not clean.

- Jan  

________________________________
From: Anton Korobeynikov <anton at korobeynikov.info>
To: Jan Sjodin <jan_sjodin at yahoo.com>
Cc: llvm-commits at cs.uiuc.edu
Sent: Tue, March 22, 2011 7:50:19 PM
Subject: Re: [llvm-commits] Change DwarfUsesAbsoluteLabelForStmtList to false 
for X86ELFMCAsmInfo.

Hi Jan

> Ping!
The patch looks ok for me, but could you please look into dwarf
standard to check which behavior is per standard,

Thanks!

-- 
With best regards, Anton Korobeynikov
Faculty of Mathematics and Mechanics, Saint Petersburg State University




More information about the llvm-commits mailing list