From: Bill Schmidt Date: Thu, 22 Oct 2015 15:53:44 +0000 (+0000) Subject: [PPC] Fix PR24686 by failing assembly for an invalid relocation X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=e2e776f769c27150b229c465b0730b140393e580;p=oota-llvm.git [PPC] Fix PR24686 by failing assembly for an invalid relocation PR24686 identifies a problem where a relocation expression is invalid when not all of the symbols in the expression can be locally resolved. This causes the compiler to request a PC-relative half16ds relocation, which is nonsensical for PowerPC. This patch recognizes this situation and ensures we fail the assembly cleanly. Test case provided by Anton Blanchard. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251027 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp b/lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp index ebcea9af279..75ba12b5a83 100644 --- a/lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp +++ b/lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp @@ -113,6 +113,13 @@ unsigned PPCELFObjectWriter::GetRelocType(const MCValue &Target, break; } break; + case PPC::fixup_ppc_half16ds: { + raw_ostream &OS = *(new raw_fd_ostream(2, false)); + Target.print(OS); + OS << "\n"; + report_fatal_error("Invalid PC-relative half16ds relocation"); + break; + } case FK_Data_4: case FK_PCRel_4: Type = ELF::R_PPC_REL32; diff --git a/test/MC/PowerPC/pr24686.s b/test/MC/PowerPC/pr24686.s new file mode 100644 index 00000000000..28cba230b8c --- /dev/null +++ b/test/MC/PowerPC/pr24686.s @@ -0,0 +1,7 @@ +# RUN: not llvm-mc -triple=powerpc64le-unknown-linux-gnu -filetype=obj %s \ +# RUN: 2>&1 | FileCheck %s + +_stext: +ld %r5, p_end - _stext(%r5) + +# CHECK: LLVM ERROR: Invalid PC-relative half16ds relocation