[llvm-commits] Change DwarfUsesAbsoluteLabelForStmtList to false for X86ELFMCAsmInfo.
Jan Sjodin
jan_sjodin at yahoo.com
Fri Mar 25 11:23:50 PDT 2011
I setting DwarfUsesAbsoluteLabelForStmtList = false would not fix this bug,
since we are using EmitLabelDifference directly, but it can be made to work.
I see two potential ways of fixing it:
1. Set DwarfUsesAbsoluteLabelForStmtList = false and use EmitSectionOffset:
Index: lib/CodeGen/AsmPrinter/DwarfDebug.cpp
===================================================================
--- lib/CodeGen/AsmPrinter/DwarfDebug.cpp (revision 127576)
+++ lib/CodeGen/AsmPrinter/DwarfDebug.cpp (working copy)
@@ -3272,7 +3272,9 @@
case dwarf::DW_AT_location: {
if (UseDotDebugLocEntry.count(Die) != 0) {
DIELabel *L = cast<DIELabel>(Values[i]);
- Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
+ // Emitting section offset, so the assembler can decide on
+ // reference to label directly, or a label difference.
+ Asm->EmitSectionOffset(L->getValue(), DwarfDebugLocSectionSym);
} else
Values[i]->EmitValue(Asm, Form);
break;
2. Set DwarfUsesAbsoluteLabelForStmtList = true and do the check here.
Index: lib/CodeGen/AsmPrinter/DwarfDebug.cpp
===================================================================
--- lib/CodeGen/AsmPrinter/DwarfDebug.cpp (revision 127576)
+++ lib/CodeGen/AsmPrinter/DwarfDebug.cpp (working copy)
@@ -3272,7 +3272,13 @@
case dwarf::DW_AT_location: {
if (UseDotDebugLocEntry.count(Die) != 0) {
DIELabel *L = cast<DIELabel>(Values[i]);
- Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
+ if(Asm->MAI->doesDwarfUsesAbsoluteLabelForStmtList()) {
+ // Emitting reference to label directly, so the assembler can
+ // emit the relocations and the offset automatically.
+ Asm->EmitReference(L->getValue(), dwarf::DW_EH_PE_udata4);
+ } else {
+ Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
+ }
} else
Values[i]->EmitValue(Asm, Form);
break;
Using doesDwarfUsesAbsoluteLabelForStmtList in this context highlights the issue
of the naming of both the method (too specific) and of the
DwarfUsesAbsoluteLabelForStmtList flag in the previous solution. Especially the
flag is confusing, since the name contradicts what actually happens. Setting it
to false will actually have the opposite effect for ELF if EmitSectionOffset is
used. :)
- Jan
----- Original Message ----
> From: Renato Golin <Renato.Golin at arm.com>
> To: Jan Sjodin <jan_sjodin at yahoo.com>; Anton Korobeynikov
><anton at korobeynikov.info>; Devang Patel <dpatel at apple.com>
> Cc: "llvm-commits at cs.uiuc.edu" <llvm-commits at cs.uiuc.edu>
> Sent: Fri, March 25, 2011 12:52:04 PM
> Subject: RE: [llvm-commits] Change DwarfUsesAbsoluteLabelForStmtList to false
>for X86ELFMCAsmInfo.
>
>
> Hey, this is exactly what my patch was doing! ;)
>
> http://llvm.org/bugs/show_bug.cgi?id=9493
>
> but it was reverted since it broke Darwin,
>
> http://llvm.org/bugs/show_bug.cgi?id=9497
>
>
> Your patch looks remarkably similar to mine, though maybe the change in yours
>is in the right place. ;)
>
> If you can make both bugs above pass, I'm happy with the patch.
>
> cheers,
> --renato
>
> ________________________________________
> From: llvm-commits-bounces at cs.uiuc.edu [llvm-commits-bounces at cs.uiuc.edu] On
>Behalf Of Jan Sjodin [jan_sjodin at yahoo.com]
> Sent: 25 March 2011 16:04
> To: Anton Korobeynikov; Devang Patel
> Cc: llvm-commits at cs.uiuc.edu
> Subject: Re: [llvm-commits] Change DwarfUsesAbsoluteLabelForStmtList to false
>for X86ELFMCAsmInfo.
>
> 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
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
> -- IMPORTANT NOTICE: The contents of this email and any attachments are
>confidential and may also be privileged. If you are not the intended recipient,
>please notify the sender immediately and do not disclose the contents to any
>other person, use it for any purpose, or store or copy the information in any
>medium. Thank you.
>
>
More information about the llvm-commits
mailing list