[llvm] [ELF] Add support for CREL to getSectionAndRelocations (PR #126445)
Aiden Grossman via llvm-commits
llvm-commits at lists.llvm.org
Sun Feb 9 16:10:31 PST 2025
https://github.com/boomanaiden154 created https://github.com/llvm/llvm-project/pull/126445
This patch updates the getSectionAndRelocations function to also support
CREL relocation sections. Unit tests have been added. This patch also
updates consumers to say they explicitly do not support CREL format
relocations. Subsequent patches will make the consumers work with CREL
format relocations and also add in testing support.
>From 694df281c6fb70a25a78ecc73bf751075840144a Mon Sep 17 00:00:00 2001
From: Aiden Grossman <aidengrossman at google.com>
Date: Mon, 10 Feb 2025 00:10:20 +0000
Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20initia?=
=?UTF-8?q?l=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Created using spr 1.3.4
---
llvm/lib/Object/ELF.cpp | 10 +++++++++-
llvm/tools/llvm-readobj/ELFDumper.cpp | 10 ++++++++++
llvm/unittests/Object/ELFObjectFileTest.cpp | 17 ++++++++++++++++-
3 files changed, 35 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/Object/ELF.cpp b/llvm/lib/Object/ELF.cpp
index b6d0699ee4fe080..8cb3d7eb141766d 100644
--- a/llvm/lib/Object/ELF.cpp
+++ b/llvm/lib/Object/ELF.cpp
@@ -747,6 +747,13 @@ decodeBBAddrMapImpl(const ELFFile<ELFT> &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<typename ELFFile<ELFT>::Elf_Rela_Range> Relas = EF.relas(*RelaSec);
if (!Relas)
return createError("unable to read relocations for section " +
@@ -958,7 +965,8 @@ ELFFile<ELFT>::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<const Elf_Shdr *> RelSecOrErr = this->getSection(Sec.sh_info);
diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp
index 7806eea6a0c52df..faad89710daa978 100644
--- a/llvm/tools/llvm-readobj/ELFDumper.cpp
+++ b/llvm/tools/llvm-readobj/ELFDumper.cpp
@@ -6833,6 +6833,16 @@ void ELFDumper<ELFT>::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 2a0921690914b4a..493e673d6a07db7 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) {
More information about the llvm-commits
mailing list