[llvm] 5e3200f - [JITLink][ELF] Add support for reading extended table
Steven Wu via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 30 09:18:59 PST 2021
Author: Steven Wu
Date: 2021-11-30T09:18:42-08:00
New Revision: 5e3200f3ce5ac807fa0fdd2b12484ee1540c6b50
URL: https://github.com/llvm/llvm-project/commit/5e3200f3ce5ac807fa0fdd2b12484ee1540c6b50
DIFF: https://github.com/llvm/llvm-project/commit/5e3200f3ce5ac807fa0fdd2b12484ee1540c6b50.diff
LOG: [JITLink][ELF] Add support for reading extended table
Add support for reading extended table in ELF object file. This allows
JITLink to support ELF object files with many sections.
Reviewed By: lhames
Differential Revision: https://reviews.llvm.org/D114747
Added:
llvm/test/ExecutionEngine/JITLink/X86/ELF_shndex.s
Modified:
llvm/lib/ExecutionEngine/JITLink/ELFLinkGraphBuilder.h
Removed:
################################################################################
diff --git a/llvm/lib/ExecutionEngine/JITLink/ELFLinkGraphBuilder.h b/llvm/lib/ExecutionEngine/JITLink/ELFLinkGraphBuilder.h
index fdc9877512862..d141072891f4f 100644
--- a/llvm/lib/ExecutionEngine/JITLink/ELFLinkGraphBuilder.h
+++ b/llvm/lib/ExecutionEngine/JITLink/ELFLinkGraphBuilder.h
@@ -143,6 +143,9 @@ class ELFLinkGraphBuilder : public ELFLinkGraphBuilderBase {
// Only SHF_ALLOC sections will have graph sections.
DenseMap<ELFSectionIndex, Section *> GraphSections;
DenseMap<ELFSymbolIndex, Symbol *> GraphSymbols;
+ DenseMap<const typename ELFFile::Elf_Shdr *,
+ ArrayRef<typename ELFFile::Elf_Word>>
+ ShndxTables;
};
template <typename ELFT>
@@ -241,7 +244,7 @@ template <typename ELFT> Error ELFLinkGraphBuilder<ELFT>::prepare() {
return SectionStringTabOrErr.takeError();
// Get the SHT_SYMTAB section.
- for (auto &Sec : Sections)
+ for (auto &Sec : Sections) {
if (Sec.sh_type == ELF::SHT_SYMTAB) {
if (!SymTabSec)
SymTabSec = &Sec;
@@ -250,6 +253,20 @@ template <typename ELFT> Error ELFLinkGraphBuilder<ELFT>::prepare() {
G->getName());
}
+ // Extended table.
+ if (Sec.sh_type == ELF::SHT_SYMTAB_SHNDX) {
+ uint32_t SymtabNdx = Sec.sh_link;
+ if (SymtabNdx >= Sections.size())
+ return make_error<JITLinkError>("sh_link is out of bound");
+
+ auto ShndxTable = Obj.getSHNDXTable(Sec);
+ if (!ShndxTable)
+ return ShndxTable.takeError();
+
+ ShndxTables.insert({&Sections[SymtabNdx], *ShndxTable});
+ }
+ }
+
return Error::success();
}
@@ -401,9 +418,19 @@ template <typename ELFT> Error ELFLinkGraphBuilder<ELFT>::graphifySymbols() {
(Sym.getType() == ELF::STT_NOTYPE || Sym.getType() == ELF::STT_FUNC ||
Sym.getType() == ELF::STT_OBJECT ||
Sym.getType() == ELF::STT_SECTION || Sym.getType() == ELF::STT_TLS)) {
-
- // FIXME: Handle extended tables.
- if (auto *GraphSec = getGraphSection(Sym.st_shndx)) {
+ // Handle extended tables.
+ unsigned Shndx = Sym.st_shndx;
+ if (Shndx == ELF::SHN_XINDEX) {
+ auto ShndxTable = ShndxTables.find(SymTabSec);
+ if (ShndxTable == ShndxTables.end())
+ continue;
+ auto NdxOrErr = object::getExtendedSymbolTableIndex<ELFT>(
+ Sym, SymIndex, ShndxTable->second);
+ if (!NdxOrErr)
+ return NdxOrErr.takeError();
+ Shndx = *NdxOrErr;
+ }
+ if (auto *GraphSec = getGraphSection(Shndx)) {
Block *B = nullptr;
{
auto Blocks = GraphSec->blocks();
diff --git a/llvm/test/ExecutionEngine/JITLink/X86/ELF_shndex.s b/llvm/test/ExecutionEngine/JITLink/X86/ELF_shndex.s
new file mode 100644
index 0000000000000..68039d5946554
--- /dev/null
+++ b/llvm/test/ExecutionEngine/JITLink/X86/ELF_shndex.s
@@ -0,0 +1,105 @@
+// Test object file with extended symbol table can be linked.
+
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o %t
+// RUN: llvm-jitlink -noexec %t
+
+.macro gen_sections4 x
+ .section a\x
+ .section b\x
+ .section c\x
+ .section d\x
+.endm
+
+.macro gen_sections8 x
+ gen_sections4 a\x
+ gen_sections4 b\x
+.endm
+
+.macro gen_sections16 x
+ gen_sections8 a\x
+ gen_sections8 b\x
+.endm
+
+.macro gen_sections32 x
+ gen_sections16 a\x
+ gen_sections16 b\x
+.endm
+
+.macro gen_sections64 x
+ gen_sections32 a\x
+ gen_sections32 b\x
+.endm
+
+.macro gen_sections128 x
+ gen_sections64 a\x
+ gen_sections64 b\x
+.endm
+
+.macro gen_sections256 x
+ gen_sections128 a\x
+ gen_sections128 b\x
+.endm
+
+.macro gen_sections512 x
+ gen_sections256 a\x
+ gen_sections256 b\x
+.endm
+
+.macro gen_sections1024 x
+ gen_sections512 a\x
+ gen_sections512 b\x
+.endm
+
+.macro gen_sections2048 x
+ gen_sections1024 a\x
+ gen_sections1024 b\x
+.endm
+
+.macro gen_sections4096 x
+ gen_sections2048 a\x
+ gen_sections2048 b\x
+.endm
+
+.macro gen_sections8192 x
+ gen_sections4096 a\x
+ gen_sections4096 b\x
+.endm
+
+.macro gen_sections16384 x
+ gen_sections8192 a\x
+ gen_sections8192 b\x
+.endm
+
+.macro gen_sections32768 x
+ gen_sections16384 a\x
+ gen_sections16384 b\x
+.endm
+
+ .section foo
+ .section bar
+
+gen_sections32768 a
+gen_sections16384 b
+gen_sections8192 c
+gen_sections4096 d
+gen_sections2048 e
+gen_sections1024 f
+gen_sections512 g
+gen_sections128 h
+gen_sections64 i
+gen_sections32 j
+gen_sections16 k
+gen_sections8 l
+gen_sections4 m
+
+.section test,"ax"
+.global a
+a:
+nop
+.size a, .-a
+
+.text
+.global main
+main:
+nop
+.size main, .-main
More information about the llvm-commits
mailing list