diff --git a/llvm/lib/Object/ELF.cpp b/llvm/lib/Object/ELF.cpp index b6d0699ee4fe0..8cb3d7eb14176 100644 --- a/llvm/lib/Object/ELF.cpp +++ b/llvm/lib/Object/ELF.cpp @@ -747,6 +747,13 @@ decodeBBAddrMapImpl(const ELFFile &EF, assert(RelaSec && "Can't read a SHT_LLVM_BB_ADDR_MAP section in a relocatable " "object file without providing a relocation section."); + // We might end up with relocations in CREL here. If we do, return an + // error since we do not currently support them. + if (RelaSec->sh_type == ELF::SHT_CREL) + return createError("unable to read relocations for section " + + describe(EF, Sec) + + " as the corresponding relocation section format is " + "CREL, which is not currently supported."); Expected::Elf_Rela_Range> Relas = EF.relas(*RelaSec); if (!Relas) return createError("unable to read relocations for section " + @@ -958,7 +965,8 @@ ELFFile::getSectionAndRelocations( continue; } - if (Sec.sh_type != ELF::SHT_RELA && Sec.sh_type != ELF::SHT_REL) + if (Sec.sh_type != ELF::SHT_RELA && Sec.sh_type != ELF::SHT_REL && + Sec.sh_type != ELF::SHT_CREL) continue; Expected RelSecOrErr = this->getSection(Sec.sh_info); diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index 7806eea6a0c52..2128a95510f22 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -6833,6 +6833,16 @@ void ELFDumper::printRelocatableStackSizes( continue; } + // We might end up with relocations in CREL here. If we do, report a + // warning since we do not currently support them. + if (RelocSec->sh_type == ELF::SHT_CREL) { + reportWarning(createError(".stack_sizes (" + describe(*StackSizesELFSec) + + ") has a corresponding CREL relocation " + "section, which is not currently supported"), + FileName); + continue; + } + // A .stack_sizes section header's sh_link field is supposed to point // to the section that contains the functions whose stack sizes are // described in it. diff --git a/llvm/unittests/Object/ELFObjectFileTest.cpp b/llvm/unittests/Object/ELFObjectFileTest.cpp index 2a0921690914b..493e673d6a07d 100644 --- a/llvm/unittests/Object/ELFObjectFileTest.cpp +++ b/llvm/unittests/Object/ELFObjectFileTest.cpp @@ -8,6 +8,7 @@ #include "llvm/Object/ELFObjectFile.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/BinaryFormat/ELF.h" #include "llvm/ObjectYAML/yaml2obj.h" #include "llvm/Support/BlockFrequency.h" #include "llvm/Support/MemoryBuffer.h" @@ -1433,7 +1434,8 @@ TEST(ELFObjectFileTest, GetSectionAndRelocations) { // Basic verification to make sure we have the correct section types. for (auto const &[Sec, RelaSec] : *SecToRelocMapOrErr) { ASSERT_EQ(Sec->sh_type, ELF::SHT_PROGBITS); - ASSERT_EQ(RelaSec->sh_type, ELF::SHT_RELA); + ASSERT_TRUE(RelaSec->sh_type == ELF::SHT_RELA || + RelaSec->sh_type == ELF::SHT_CREL); } }; @@ -1503,6 +1505,19 @@ TEST(ELFObjectFileTest, GetSectionAndRelocations) { DoCheckFails(MissingRelocatableContent, DefaultMatcher, "SHT_RELA section with index 1: failed to get a " "relocated section: invalid section index: 255"); + + StringRef OneTextSectionCREL = R"( +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + - Name: .crel.tex + Type: SHT_CREL + Flags: [ SHF_INFO_LINK ] + Info: .text +)"; + + DoCheckSucceeds(OneTextSectionCREL, DefaultMatcher); } TEST(ELFObjectFileTest, ELFSymbolRefLess) {