<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Dec 22, 2019 at 5:40 AM Sourabh Singh Tomar <<a href="mailto:sourav0311@gmail.com">sourav0311@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hello Everyone,<div><br></div><div>Consider this asm snippet for a moment --</div><div><br></div><div>section .debug_info.dwo</div><div>...</div><div>.long   .Ldebug_macinfo0        # DW_AT_macros<br></div><div>...</div><div><br></div><div>.section        .debug_macinfo.dwo,"e",@progbits<br></div><div> .Ldebug_macinfo0:<br>     .byte   0x1     # Define macro<br></div><div>....</div><div>When compiling this with clang, produces</div><div>fatal error: error in backend: A dwo section may not contain relocations -- seems fair,</div><div>Since we don't want relocations in DWO file. Please note here GCC{trunk}  has no problem with this /Okay with relocations in DWO/ Why??<br></div><div><br></div><div>Now the real problem -- Since DW_AT_macros/macinfo can appear in both split/non-split case.{Only in one or another}. Pointing to macro/macro.dwo section.</div><div>Now clang won't allow me to use above approach. So only option left to avoid relocations, emitting DW_AT_macros attribute as a difference of labels.</div><div>i.e</div><div>.long   .Lcu_macro_begin1-.debug_macro.dwo       # DW_AT_macro_info</div></div></blockquote><div><br>Judging by GCC's behavior, and other cases of similar features (consider the abbrev table offset in the CU header in Split DWARF - similarly, it isn't relocated, but is a constant value (computed, potentially by a difference of two labels - but in LLVM's case it's probably just to always emit it as zero, not sure how we actually implement it though))<br> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>This worked great, clang is fine, GDB also happy. But that was manual assembly hack I opted. I didn't find any API in /MCStreamer/ that can provide me a difference of 2 labels as label.<br></div><div>This is needed here --</div><div>TheCU.addSectionLabel(TheCU.getUnitDie(),dwarf::DW_AT_macros,<br>              /*Label here?*/, TLOF.getDwarfMacroDWOSection()->getBeginSymbol()); -- requires a label to add in.<br></div></div></blockquote><div><br></div><div>Yeah, there's lots of other cases in the DWARF where a difference of two labels is needed as an attribute value - consider DW_AT_high_pc for instance (in DWARFv4 and above), it's emitted as a difference of two labels, like this:<br><br>    if (DD->getDwarfVersion() < 4)<br>      addLabelAddress(D, dwarf::DW_AT_high_pc, End);<br>    else<br>      addLabelDelta(D, dwarf::DW_AT_high_pc, End, Begin);<br><br>Oh, an even more analogous example, it seems, is DWARFv4 extension split DWARF support for ranges:<br><br>      if (isDwoUnit())<br>        addSectionDelta(ScopeDIE, dwarf::DW_AT_ranges, List.Label,<br>                        RangeSectionSym);<br>      else<br>        addSectionLabel(ScopeDIE, dwarf::DW_AT_ranges, List.Label,<br>                        RangeSectionSym);<br><br>So it looks like you might be able to use the same logic for the DW_AT_macros attribute. (looks like the only difference between the two options (addLabelDelta and addSectionLabel) is the DW_FORM chosen, and the "addSectionLabel" one uses sec_offset where available, which is what GCC uses for its DW_AT_macro, etc))</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div></div><div>Theirs analogous EmitLabelDifference(Sym, Sym, Size) API -- but that's for emitting + return type is void, So can't plug it in in here.</div><div><br></div><div>Any hints, how to overcome this ?</div><div><br></div><div>Thanks in anticipation!<br>Sourabh.</div><div><br></div></div>
</blockquote></div></div>