This seems fine, but in general please always check with me before pushing to the release branch. (Same for a1f2fd1.)
Thanks, Hans On Sun, Jul 19, 2020 at 12:22 AM Fangrui Song via llvm-branch-commits <llvm-branch-commits@lists.llvm.org> wrote: > > > Author: Fangrui Song > Date: 2020-07-18T15:20:30-07:00 > New Revision: 094d6386ec0478076218303a756edda8a63d7c55 > > URL: > https://github.com/llvm/llvm-project/commit/094d6386ec0478076218303a756edda8a63d7c55 > DIFF: > https://github.com/llvm/llvm-project/commit/094d6386ec0478076218303a756edda8a63d7c55.diff > > LOG: [RelocationResolver] Support R_PPC_REL32 & R_PPC64_REL{32,64} > > This suppresses `failed to compute relocation: R_PPC_REL32, Invalid data was > encountered while parsing the file` > and its 64-bit variants when running llvm-dwarfdump on a PowerPC object file > with .eh_frame > > Unfortunately it is difficult to test the computation: > DWARFDataExtractor::getEncodedPointer does not use the relocated value > and even if it does, we need to teach llvm-dwarfdump --eh-frame to do > some linker job to report a reasonable address. > > (cherry picked from commit b922004ea29d54534c4f09b9cfa655bf5f3360f0) > > Added: > llvm/test/DebugInfo/PowerPC/eh-frame.ll > > Modified: > llvm/lib/Object/RelocationResolver.cpp > > Removed: > > > > ################################################################################ > diff --git a/llvm/lib/Object/RelocationResolver.cpp > b/llvm/lib/Object/RelocationResolver.cpp > index 3f3f79b0f4ff..0058d12dcc87 100644 > --- a/llvm/lib/Object/RelocationResolver.cpp > +++ b/llvm/lib/Object/RelocationResolver.cpp > @@ -152,6 +152,8 @@ static bool supportsPPC64(uint64_t Type) { > switch (Type) { > case ELF::R_PPC64_ADDR32: > case ELF::R_PPC64_ADDR64: > + case ELF::R_PPC64_REL32: > + case ELF::R_PPC64_REL64: > return true; > default: > return false; > @@ -164,6 +166,10 @@ static uint64_t resolvePPC64(RelocationRef R, uint64_t > S, uint64_t A) { > return (S + getELFAddend(R)) & 0xFFFFFFFF; > case ELF::R_PPC64_ADDR64: > return S + getELFAddend(R); > + case ELF::R_PPC64_REL32: > + return (S + getELFAddend(R) - R.getOffset()) & 0xFFFFFFFF; > + case ELF::R_PPC64_REL64: > + return S + getELFAddend(R) - R.getOffset(); > default: > llvm_unreachable("Invalid relocation type"); > } > @@ -259,12 +265,22 @@ static uint64_t resolveX86(RelocationRef R, uint64_t S, > uint64_t A) { > } > > static bool supportsPPC32(uint64_t Type) { > - return Type == ELF::R_PPC_ADDR32; > + switch (Type) { > + case ELF::R_PPC_ADDR32: > + case ELF::R_PPC_REL32: > + return true; > + default: > + return false; > + } > } > > static uint64_t resolvePPC32(RelocationRef R, uint64_t S, uint64_t A) { > - if (R.getType() == ELF::R_PPC_ADDR32) > + switch (R.getType()) { > + case ELF::R_PPC_ADDR32: > return (S + getELFAddend(R)) & 0xFFFFFFFF; > + case ELF::R_PPC_REL32: > + return (S + getELFAddend(R) - R.getOffset()) & 0xFFFFFFFF; > + } > llvm_unreachable("Invalid relocation type"); > } > > > diff --git a/llvm/test/DebugInfo/PowerPC/eh-frame.ll > b/llvm/test/DebugInfo/PowerPC/eh-frame.ll > new file mode 100644 > index 000000000000..3a8f7df6b61a > --- /dev/null > +++ b/llvm/test/DebugInfo/PowerPC/eh-frame.ll > @@ -0,0 +1,39 @@ > +; RUN: llc -filetype=obj -mtriple=powerpc %s -o %t32.o > +; RUN: llvm-readobj -r %t32.o | FileCheck %s --check-prefix=PPC_REL > +; RUN: llvm-dwarfdump --eh-frame %t32.o 2>&1 | FileCheck %s > --check-prefix=PPC > + > +; PPC_REL: R_PPC_REL32 .text 0x0 > +; PPC_REL-NEXT: R_PPC_REL32 .text 0x4 > + > +; PPC-NOT: warning: > +; PPC: FDE cie=00000000 pc=00000000...00000004 > +;; TODO Take relocation into consideration > +; PPC: FDE cie=00000000 pc=00000000...00000004 > + > +; RUN: llc -filetype=obj -mtriple=ppc64 %s -o %t64.o > +; RUN: llvm-readobj -r %t64.o | FileCheck %s --check-prefix=PPC64_REL > +; RUN: llvm-dwarfdump --eh-frame %t64.o 2>&1 | FileCheck %s > --check-prefix=PPC64 > + > +; PPC64_REL: R_PPC64_REL32 .text 0x0 > +; PPC64_REL-NEXT: R_PPC64_REL32 .text 0x10 > + > +; PPC64-NOT: warning: > +; PPC64: FDE cie=00000000 pc=00000000...00000010 > +; PPC64: FDE cie=00000000 pc=00000000...00000010 > + > +; RUN: llc -filetype=obj -mtriple=ppc64le -code-model=large %s -o %t64l.o > +; RUN: llvm-readobj -r %t64l.o | FileCheck %s --check-prefix=PPC64L_REL > +; RUN: llvm-dwarfdump --eh-frame %t64l.o 2>&1 | FileCheck %s > --check-prefix=PPC64 > + > +; PPC64L_REL: R_PPC64_REL64 .text 0x0 > +; PPC64L_REL-NEXT: R_PPC64_REL64 .text 0x10 > + > +define void @foo() { > +entry: > + ret void > +} > + > +define void @bar() { > +entry: > + ret void > +} > > > > _______________________________________________ > llvm-branch-commits mailing list > llvm-branch-commits@lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits