From a7e5ce65f571b14e7c82c03c308231a41a042630 Mon Sep 17 00:00:00 2001 From: Tulio Magno Quites Machado Filho Date: Wed, 19 Jul 2023 17:08:08 -0300 Subject: [PATCH] Improve clang assembler error messages on s390x (rhbz#2223978) Backport a patch from LLVM 17 that improves error messages from the Clang assembler on s390x. Also, disable LLVM_UNREACHABLE_OPTIMIZE in order to improve error messages when llvm_unreachable() is called. There are many cases where llvm_unreachable() is used as a error reporting function instead of the recommended replacement for assert(). Resolves: rhbz#2223978 --- ...error-messages-for-unsupported-reloc.patch | 184 ++++++++++++++++++ llvm.spec | 9 +- 2 files changed, 192 insertions(+), 1 deletion(-) create mode 100644 0001-SystemZ-Improve-error-messages-for-unsupported-reloc.patch diff --git a/0001-SystemZ-Improve-error-messages-for-unsupported-reloc.patch b/0001-SystemZ-Improve-error-messages-for-unsupported-reloc.patch new file mode 100644 index 0000000..34128b6 --- /dev/null +++ b/0001-SystemZ-Improve-error-messages-for-unsupported-reloc.patch @@ -0,0 +1,184 @@ +From efbaf8bc61f4c0e29a3eaafb11ac0ddda8bd3dff Mon Sep 17 00:00:00 2001 +From: Ulrich Weigand +Date: Fri, 30 Jun 2023 16:02:56 +0200 +Subject: [PATCH] [SystemZ] Improve error messages for unsupported relocations + +In the SystemZMCObjectWriter, we currently just abort in case +some unsupported relocation in requested. However, as this +situation can be triggered by invalid (inline) assembler input, +we should really get a regular error message instead. +--- + .../MCTargetDesc/SystemZMCObjectWriter.cpp | 59 +++++++++++-------- + 1 file changed, 35 insertions(+), 24 deletions(-) + +diff --git a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCObjectWriter.cpp b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCObjectWriter.cpp +index c23463ab9bde..0b11468afc52 100644 +--- a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCObjectWriter.cpp ++++ b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCObjectWriter.cpp +@@ -9,6 +9,7 @@ + #include "MCTargetDesc/SystemZMCFixups.h" + #include "MCTargetDesc/SystemZMCTargetDesc.h" + #include "llvm/BinaryFormat/ELF.h" ++#include "llvm/MC/MCContext.h" + #include "llvm/MC/MCELFObjectWriter.h" + #include "llvm/MC/MCExpr.h" + #include "llvm/MC/MCFixup.h" +@@ -40,7 +41,7 @@ SystemZObjectWriter::SystemZObjectWriter(uint8_t OSABI) + /*HasRelocationAddend_=*/ true) {} + + // Return the relocation type for an absolute value of MCFixupKind Kind. +-static unsigned getAbsoluteReloc(unsigned Kind) { ++static unsigned getAbsoluteReloc(MCContext &Ctx, SMLoc Loc, unsigned Kind) { + switch (Kind) { + case FK_Data_1: return ELF::R_390_8; + case FK_Data_2: return ELF::R_390_16; +@@ -49,11 +50,12 @@ static unsigned getAbsoluteReloc(unsigned Kind) { + case SystemZ::FK_390_12: return ELF::R_390_12; + case SystemZ::FK_390_20: return ELF::R_390_20; + } +- llvm_unreachable("Unsupported absolute address"); ++ Ctx.reportError(Loc, "Unsupported absolute address"); ++ return 0; + } + + // Return the relocation type for a PC-relative value of MCFixupKind Kind. +-static unsigned getPCRelReloc(unsigned Kind) { ++static unsigned getPCRelReloc(MCContext &Ctx, SMLoc Loc, unsigned Kind) { + switch (Kind) { + case FK_Data_2: return ELF::R_390_PC16; + case FK_Data_4: return ELF::R_390_PC32; +@@ -63,62 +65,69 @@ static unsigned getPCRelReloc(unsigned Kind) { + case SystemZ::FK_390_PC24DBL: return ELF::R_390_PC24DBL; + case SystemZ::FK_390_PC32DBL: return ELF::R_390_PC32DBL; + } +- llvm_unreachable("Unsupported PC-relative address"); ++ Ctx.reportError(Loc, "Unsupported PC-relative address"); ++ return 0; + } + + // Return the R_390_TLS_LE* relocation type for MCFixupKind Kind. +-static unsigned getTLSLEReloc(unsigned Kind) { ++static unsigned getTLSLEReloc(MCContext &Ctx, SMLoc Loc, unsigned Kind) { + switch (Kind) { + case FK_Data_4: return ELF::R_390_TLS_LE32; + case FK_Data_8: return ELF::R_390_TLS_LE64; + } +- llvm_unreachable("Unsupported absolute address"); ++ Ctx.reportError(Loc, "Unsupported thread-local address (local-exec)"); ++ return 0; + } + + // Return the R_390_TLS_LDO* relocation type for MCFixupKind Kind. +-static unsigned getTLSLDOReloc(unsigned Kind) { ++static unsigned getTLSLDOReloc(MCContext &Ctx, SMLoc Loc, unsigned Kind) { + switch (Kind) { + case FK_Data_4: return ELF::R_390_TLS_LDO32; + case FK_Data_8: return ELF::R_390_TLS_LDO64; + } +- llvm_unreachable("Unsupported absolute address"); ++ Ctx.reportError(Loc, "Unsupported thread-local address (local-dynamic)"); ++ return 0; + } + + // Return the R_390_TLS_LDM* relocation type for MCFixupKind Kind. +-static unsigned getTLSLDMReloc(unsigned Kind) { ++static unsigned getTLSLDMReloc(MCContext &Ctx, SMLoc Loc, unsigned Kind) { + switch (Kind) { + case FK_Data_4: return ELF::R_390_TLS_LDM32; + case FK_Data_8: return ELF::R_390_TLS_LDM64; + case SystemZ::FK_390_TLS_CALL: return ELF::R_390_TLS_LDCALL; + } +- llvm_unreachable("Unsupported absolute address"); ++ Ctx.reportError(Loc, "Unsupported thread-local address (local-dynamic)"); ++ return 0; + } + + // Return the R_390_TLS_GD* relocation type for MCFixupKind Kind. +-static unsigned getTLSGDReloc(unsigned Kind) { ++static unsigned getTLSGDReloc(MCContext &Ctx, SMLoc Loc, unsigned Kind) { + switch (Kind) { + case FK_Data_4: return ELF::R_390_TLS_GD32; + case FK_Data_8: return ELF::R_390_TLS_GD64; + case SystemZ::FK_390_TLS_CALL: return ELF::R_390_TLS_GDCALL; + } +- llvm_unreachable("Unsupported absolute address"); ++ Ctx.reportError(Loc, "Unsupported thread-local address (general-dynamic)"); ++ return 0; + } + + // Return the PLT relocation counterpart of MCFixupKind Kind. +-static unsigned getPLTReloc(unsigned Kind) { ++static unsigned getPLTReloc(MCContext &Ctx, SMLoc Loc, unsigned Kind) { + switch (Kind) { + case SystemZ::FK_390_PC12DBL: return ELF::R_390_PLT12DBL; + case SystemZ::FK_390_PC16DBL: return ELF::R_390_PLT16DBL; + case SystemZ::FK_390_PC24DBL: return ELF::R_390_PLT24DBL; + case SystemZ::FK_390_PC32DBL: return ELF::R_390_PLT32DBL; + } +- llvm_unreachable("Unsupported absolute address"); ++ Ctx.reportError(Loc, "Unsupported PC-relative PLT address"); ++ return 0; + } + + unsigned SystemZObjectWriter::getRelocType(MCContext &Ctx, + const MCValue &Target, + const MCFixup &Fixup, + bool IsPCRel) const { ++ SMLoc Loc = Fixup.getLoc(); + unsigned Kind = Fixup.getKind(); + if (Kind >= FirstLiteralRelocationKind) + return Kind - FirstLiteralRelocationKind; +@@ -126,38 +135,40 @@ unsigned SystemZObjectWriter::getRelocType(MCContext &Ctx, + switch (Modifier) { + case MCSymbolRefExpr::VK_None: + if (IsPCRel) +- return getPCRelReloc(Kind); +- return getAbsoluteReloc(Kind); ++ return getPCRelReloc(Ctx, Loc, Kind); ++ return getAbsoluteReloc(Ctx, Loc, Kind); + + case MCSymbolRefExpr::VK_NTPOFF: + assert(!IsPCRel && "NTPOFF shouldn't be PC-relative"); +- return getTLSLEReloc(Kind); ++ return getTLSLEReloc(Ctx, Loc, Kind); + + case MCSymbolRefExpr::VK_INDNTPOFF: + if (IsPCRel && Kind == SystemZ::FK_390_PC32DBL) + return ELF::R_390_TLS_IEENT; +- llvm_unreachable("Only PC-relative INDNTPOFF accesses are supported for now"); ++ Ctx.reportError(Loc, "Only PC-relative INDNTPOFF accesses are supported for now"); ++ return 0; + + case MCSymbolRefExpr::VK_DTPOFF: + assert(!IsPCRel && "DTPOFF shouldn't be PC-relative"); +- return getTLSLDOReloc(Kind); ++ return getTLSLDOReloc(Ctx, Loc, Kind); + + case MCSymbolRefExpr::VK_TLSLDM: + assert(!IsPCRel && "TLSLDM shouldn't be PC-relative"); +- return getTLSLDMReloc(Kind); ++ return getTLSLDMReloc(Ctx, Loc, Kind); + + case MCSymbolRefExpr::VK_TLSGD: + assert(!IsPCRel && "TLSGD shouldn't be PC-relative"); +- return getTLSGDReloc(Kind); ++ return getTLSGDReloc(Ctx, Loc, Kind); + + case MCSymbolRefExpr::VK_GOT: + if (IsPCRel && Kind == SystemZ::FK_390_PC32DBL) + return ELF::R_390_GOTENT; +- llvm_unreachable("Only PC-relative GOT accesses are supported for now"); ++ Ctx.reportError(Loc, "Only PC-relative GOT accesses are supported for now"); ++ return 0; + + case MCSymbolRefExpr::VK_PLT: +- assert(IsPCRel && "@PLT shouldt be PC-relative"); +- return getPLTReloc(Kind); ++ assert(IsPCRel && "@PLT shouldn't be PC-relative"); ++ return getPLTReloc(Ctx, Loc, Kind); + + default: + llvm_unreachable("Modifier not supported"); +-- +2.41.0 + diff --git a/llvm.spec b/llvm.spec index 83b4c7a..e6f6765 100644 --- a/llvm.spec +++ b/llvm.spec @@ -101,7 +101,7 @@ Name: %{pkg_name} Version: %{maj_ver}.%{min_ver}.%{patch_ver}%{?rc_ver:~rc%{rc_ver}} -Release: 1%{?dist} +Release: 2%{?dist} Summary: The Low Level Virtual Machine License: Apache-2.0 WITH LLVM-exception OR NCSA @@ -121,6 +121,8 @@ Source8: lit.fedora.cfg.py # RHEL-specific patches. Patch101: 0001-Deactivate-markdown-doc.patch +# Backported from LLVM 17 +Patch1: 0001-SystemZ-Improve-error-messages-for-unsupported-reloc.patch # See https://reviews.llvm.org/D137890 for the next two patches Patch2: 0001-llvm-Add-install-targets-for-gtest.patch # Patching third-party dir with a 200 offset in patch number @@ -366,6 +368,7 @@ export ASMFLAGS=$CFLAGS %if %{without compat_build} -DLLVM_VERSION_SUFFIX='' \ %endif + -DLLVM_UNREACHABLE_OPTIMIZE:BOOL=OFF \ -DLLVM_BUILD_LLVM_DYLIB:BOOL=ON \ -DLLVM_LINK_LLVM_DYLIB:BOOL=ON \ -DLLVM_BUILD_EXTERNAL_COMPILER_RT:BOOL=ON \ @@ -643,6 +646,10 @@ fi %endif %changelog +* Wed Jul 19 2023 Tulio Magno Quites Machado Filho - 16.0.6-2 +- Improve error messages for unsupported relocs on s390x (rhbz#2216906) +- Disable LLVM_UNREACHABLE_OPTIMIZE + * Sat Jun 17 2023 Tom Stellard - 16.0.6-1 - 16.0.6 Release