[PATCH] D15610: [ELF] - Fixed handling relocations against zero sized .eh_frame section.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 25 01:57:09 PST 2015


grimar added a comment.

In http://reviews.llvm.org/D15610#316843, @rafael wrote:

> LGTM with nits.


Thanks for review !


================
Comment at: ELF/InputSection.cpp:258
@@ -257,1 +257,3 @@
 EHInputSection<ELFT>::getOffset(uintX_t Offset) {
+  // Relocations can be against .eh_frame section
+  // which has zero size. For example crtbeginT.o
----------------
rafael wrote:
> I would expand the comment a bit. What about
> 
>   // The file crtbeginT.o has relocations pointing to the start of an empty
>   // .eh_frame that is known to be the first in the link. It does that to
>   // identify the start of the output .eh_frame. Handle this special case.
> 
Done.

================
Comment at: ELF/OutputSections.cpp:856
@@ -855,3 +855,3 @@
   }
-  return VA + cast<MergeInputSection<ELFT>>(Section)->getOffset(Offset) +
-         Addend;
+  uintX_t SecOff;
+  if (isa<EHInputSection<ELFT>>(Section))
----------------
rafael wrote:
> grimar wrote:
> > ruiu wrote:
> > > Is there any reason to not make getOffset a virtual function?
> > That would require some design change. For some reason approach that I used is seems to be as standart in new lld, for example there is such method:
> > 
> > 
> > ```
> > template <class ELFT>
> > typename ELFFile<ELFT>::uintX_t
> > InputSectionBase<ELFT>::getOffset(uintX_t Offset) {
> >   switch (SectionKind) {
> >   case Regular:
> >     return cast<InputSection<ELFT>>(this)->OutSecOff + Offset;
> >   case EHFrame:
> >     return cast<EHInputSection<ELFT>>(this)->getOffset(Offset);
> >   case Merge:
> >     return cast<MergeInputSection<ELFT>>(this)->getOffset(Offset);
> >   case MipsReginfo:
> >     return cast<MipsReginfoInputSection<ELFT>>(this)->getOffset(Offset);
> >   }
> >   llvm_unreachable("Invalid section kind");
> > }
> > ```
> > 
> > I can only guess why it was done in that way. But answering your question: to make it virtual all such places should be reimplemented first, there will be casting problem if I make it virtual only in SplitInputSection class (which is base for EHInputSection an MergeInputSection). 
> > To use cast<SplitInputSection<ELFT>> I would need to add something to next enum for classof() implementation to recognize the type of SplitInputSection:
> > 
> > ```
> > enum Kind { Regular, EHFrame, Merge, MipsReginfo };
> > ```
> > That looks very inconsistent with what we already have and if requires change then for all at once I think.
> You can just remove the cast actually. I have done that in r256404. You should be able to just rebase.
Done.

================
Comment at: test/ELF/ehframe-relocation.s:14
@@ +13,3 @@
+// CHECK-NEXT: Offset:
+// CHECK-NEXT: Size:
+// CHECK-NEXT: Link: 0
----------------
rafael wrote:
> Just test that size is 0. That ways you can delete next lines and avoid passing -section-data .
Done.

================
Comment at: test/ELF/ehframe-relocation.s:26
@@ +25,3 @@
+// DISASM-NEXT: _start:
+// DISASM-NEXT:    11000: 48 8b 04 25 20 01 01 00 movq 65824, %rax
+// DISASM-NEXT:    11008: 48 8b 04 25 25 01 01 00 movq 65829, %rax
----------------
rafael wrote:
> Use {{.*}} to avoid checking the binary representation.
Done.


Repository:
  rL LLVM

http://reviews.llvm.org/D15610





More information about the llvm-commits mailing list