Skip to content

Commit 2167881

Browse files
committed
[ARM,MC] Support FDPIC relocations
Linux kernel fs/binfmt_elf_fdpic.c supports FDPIC for MMU-less systems. GCC/binutils/qemu support FDPIC ABI for ARM (https://github.com/mickael-guene/fdpic_doc). _ARM FDPIC Toolchain and ABI_ provides a summary. This patch implements FDPIC relocations to the integrated assembler. There are 6 static relocations and 2 dynamic relocations, with R_ARM_FUNCDESC as both static and dynamic. gas requires `--fdpic` to assemble data relocations like `.word f(FUNCDESC)`. This patch adds `MCTargetOptions::FDPIC` and reports an error if FDPIC is not set. Pull Request: llvm#82187
1 parent c5bbf97 commit 2167881

File tree

19 files changed

+153
-11
lines changed

19 files changed

+153
-11
lines changed

llvm/include/llvm/BinaryFormat/ELF.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,7 @@ enum {
362362
ELFOSABI_AMDGPU_PAL = 65, // AMD PAL runtime
363363
ELFOSABI_AMDGPU_MESA3D = 66, // AMD GCN GPUs (GFX6+) for MESA runtime
364364
ELFOSABI_ARM = 97, // ARM
365+
ELFOSABI_ARM_FDPIC = 65, // ARM FDPIC
365366
ELFOSABI_C6000_ELFABI = 64, // Bare-metal TMS320C6000
366367
ELFOSABI_C6000_LINUX = 65, // Linux TMS320C6000
367368
ELFOSABI_STANDALONE = 255, // Standalone (embedded) application

llvm/include/llvm/BinaryFormat/ELFRelocs/ARM.def

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,3 +143,10 @@ ELF_RELOC(R_ARM_THM_BF16, 0x88)
143143
ELF_RELOC(R_ARM_THM_BF12, 0x89)
144144
ELF_RELOC(R_ARM_THM_BF18, 0x8a)
145145
ELF_RELOC(R_ARM_IRELATIVE, 0xa0)
146+
ELF_RELOC(R_ARM_GOTFUNCDESC, 0xa1)
147+
ELF_RELOC(R_ARM_GOTOFFFUNCDESC, 0xa2)
148+
ELF_RELOC(R_ARM_FUNCDESC, 0xa3)
149+
ELF_RELOC(R_ARM_FUNCDESC_VALUE, 0xa4)
150+
ELF_RELOC(R_ARM_TLS_GD32_FDPIC, 0xa5)
151+
ELF_RELOC(R_ARM_TLS_LDM32_FDPIC, 0xa6)
152+
ELF_RELOC(R_ARM_TLS_IE32_FDPIC, 0xa7)

llvm/include/llvm/MC/MCExpr.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,12 @@ class MCSymbolRefExpr : public MCExpr {
223223
VK_SECREL,
224224
VK_SIZE, // symbol@SIZE
225225
VK_WEAKREF, // The link between the symbols in .weakref foo, bar
226+
VK_FUNCDESC,
227+
VK_GOTFUNCDESC,
228+
VK_GOTOFFFUNCDESC,
229+
VK_TLSGD_FDPIC,
230+
VK_TLSLDM_FDPIC,
231+
VK_GOTTPOFF_FDPIC,
226232

227233
VK_X86_ABS8,
228234
VK_X86_PLTOFF,

llvm/include/llvm/MC/MCParser/MCTargetAsmParser.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,10 @@ class MCTargetAsmParser : public MCAsmParserExtension {
525525
// Return whether this parser accept star as start of statement
526526
virtual bool starIsStartOfStatement() { return false; };
527527

528+
virtual MCSymbolRefExpr::VariantKind
529+
getVariantKindForName(StringRef Name) const {
530+
return MCSymbolRefExpr::getVariantKindForName(Name);
531+
}
528532
virtual const MCExpr *applyModifierToExpr(const MCExpr *E,
529533
MCSymbolRefExpr::VariantKind,
530534
MCContext &Ctx) {

llvm/include/llvm/MC/MCTargetOptions.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ class MCTargetOptions {
5151
bool MCNoTypeCheck : 1;
5252
bool MCSaveTempLabels : 1;
5353
bool MCIncrementalLinkerCompatible : 1;
54+
bool FDPIC : 1;
5455
bool ShowMCEncoding : 1;
5556
bool ShowMCInst : 1;
5657
bool AsmVerbose : 1;

llvm/include/llvm/MC/MCTargetOptionsCommandFlags.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ std::optional<bool> getExplicitRelaxAll();
2929

3030
bool getIncrementalLinkerCompatible();
3131

32+
bool getFDPIC();
33+
3234
int getDwarfVersion();
3335

3436
bool getDwarf64();

llvm/lib/MC/MCExpr.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ const MCSymbolRefExpr *MCSymbolRefExpr::create(StringRef Name, VariantKind Kind,
220220

221221
StringRef MCSymbolRefExpr::getVariantKindName(VariantKind Kind) {
222222
switch (Kind) {
223+
// clang-format off
223224
case VK_Invalid: return "<<invalid>>";
224225
case VK_None: return "<<none>>";
225226

@@ -232,13 +233,16 @@ StringRef MCSymbolRefExpr::getVariantKindName(VariantKind Kind) {
232233
case VK_GOTPCREL: return "GOTPCREL";
233234
case VK_GOTPCREL_NORELAX: return "GOTPCREL_NORELAX";
234235
case VK_GOTTPOFF: return "GOTTPOFF";
236+
case VK_GOTTPOFF_FDPIC: return "gottpoff_fdpic";
235237
case VK_INDNTPOFF: return "INDNTPOFF";
236238
case VK_NTPOFF: return "NTPOFF";
237239
case VK_GOTNTPOFF: return "GOTNTPOFF";
238240
case VK_PLT: return "PLT";
239241
case VK_TLSGD: return "TLSGD";
242+
case VK_TLSGD_FDPIC: return "tlsgd_fdpic";
240243
case VK_TLSLD: return "TLSLD";
241244
case VK_TLSLDM: return "TLSLDM";
245+
case VK_TLSLDM_FDPIC: return "tlsldm_fdpic";
242246
case VK_TPOFF: return "TPOFF";
243247
case VK_TPREL: return "TPREL";
244248
case VK_TLSCALL: return "tlscall";
@@ -253,6 +257,9 @@ StringRef MCSymbolRefExpr::getVariantKindName(VariantKind Kind) {
253257
case VK_SECREL: return "SECREL32";
254258
case VK_SIZE: return "SIZE";
255259
case VK_WEAKREF: return "WEAKREF";
260+
case VK_FUNCDESC: return "FUNCDESC";
261+
case VK_GOTFUNCDESC: return "GOTFUNCDESC";
262+
case VK_GOTOFFFUNCDESC: return "GOTOFFFUNCDESC";
256263
case VK_X86_ABS8: return "ABS8";
257264
case VK_X86_PLTOFF: return "PLTOFF";
258265
case VK_ARM_NONE: return "none";
@@ -386,6 +393,7 @@ StringRef MCSymbolRefExpr::getVariantKindName(VariantKind Kind) {
386393
case VK_VE_TLS_GD_LO32: return "tls_gd_lo";
387394
case VK_VE_TPOFF_HI32: return "tpoff_hi";
388395
case VK_VE_TPOFF_LO32: return "tpoff_lo";
396+
// clang-format on
389397
}
390398
llvm_unreachable("Invalid variant kind");
391399
}
@@ -493,13 +501,6 @@ MCSymbolRefExpr::getVariantKindForName(StringRef Name) {
493501
.Case("ie", VK_Hexagon_IE)
494502
.Case("ldgot", VK_Hexagon_LD_GOT)
495503
.Case("ldplt", VK_Hexagon_LD_PLT)
496-
.Case("none", VK_ARM_NONE)
497-
.Case("got_prel", VK_ARM_GOT_PREL)
498-
.Case("target1", VK_ARM_TARGET1)
499-
.Case("target2", VK_ARM_TARGET2)
500-
.Case("prel31", VK_ARM_PREL31)
501-
.Case("sbrel", VK_ARM_SBREL)
502-
.Case("tlsldo", VK_ARM_TLSLDO)
503504
.Case("lo8", VK_AVR_LO8)
504505
.Case("hi8", VK_AVR_HI8)
505506
.Case("hlo8", VK_AVR_HLO8)

llvm/lib/MC/MCParser/AsmParser.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1237,7 +1237,7 @@ bool AsmParser::parsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc,
12371237

12381238
// Lookup the symbol variant if used.
12391239
if (!Split.second.empty()) {
1240-
Variant = MCSymbolRefExpr::getVariantKindForName(Split.second);
1240+
Variant = getTargetParser().getVariantKindForName(Split.second);
12411241
if (Variant != MCSymbolRefExpr::VK_Invalid) {
12421242
SymbolName = Split.first;
12431243
} else if (MAI.doesAllowAtInName() && !MAI.useParensForSymbolVariant()) {

llvm/lib/MC/MCTargetOptions.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ MCTargetOptions::MCTargetOptions()
1515
: MCRelaxAll(false), MCNoExecStack(false), MCFatalWarnings(false),
1616
MCNoWarn(false), MCNoDeprecatedWarn(false), MCNoTypeCheck(false),
1717
MCSaveTempLabels(false), MCIncrementalLinkerCompatible(false),
18-
ShowMCEncoding(false), ShowMCInst(false), AsmVerbose(false),
18+
FDPIC(false), ShowMCEncoding(false), ShowMCInst(false), AsmVerbose(false),
1919
PreserveAsmComments(true), Dwarf64(false),
2020
EmitDwarfUnwind(EmitDwarfUnwindType::Default),
2121
MCUseDwarfDirectory(DefaultDwarfDirectory),

llvm/lib/MC/MCTargetOptionsCommandFlags.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ using namespace llvm;
3636

3737
MCOPT_EXP(bool, RelaxAll)
3838
MCOPT(bool, IncrementalLinkerCompatible)
39+
MCOPT(bool, FDPIC)
3940
MCOPT(int, DwarfVersion)
4041
MCOPT(bool, Dwarf64)
4142
MCOPT(EmitDwarfUnwindType, EmitDwarfUnwind)
@@ -66,6 +67,9 @@ llvm::mc::RegisterMCTargetOptionsFlags::RegisterMCTargetOptionsFlags() {
6667
"emit an object file which can be used with an incremental linker"));
6768
MCBINDOPT(IncrementalLinkerCompatible);
6869

70+
static cl::opt<bool> FDPIC("fdpic", cl::desc("Use the FDPIC ABI"));
71+
MCBINDOPT(FDPIC);
72+
6973
static cl::opt<int> DwarfVersion("dwarf-version", cl::desc("Dwarf version"),
7074
cl::init(0));
7175
MCBINDOPT(DwarfVersion);
@@ -135,6 +139,7 @@ MCTargetOptions llvm::mc::InitMCTargetOptionsFromFlags() {
135139
MCTargetOptions Options;
136140
Options.MCRelaxAll = getRelaxAll();
137141
Options.MCIncrementalLinkerCompatible = getIncrementalLinkerCompatible();
142+
Options.FDPIC = getFDPIC();
138143
Options.Dwarf64 = getDwarf64();
139144
Options.DwarfVersion = getDwarfVersion();
140145
Options.ShowMCInst = getShowMCInst();

llvm/lib/ObjectYAML/ELFYAML.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,7 @@ void ScalarEnumerationTraits<ELFYAML::ELF_ELFOSABI>::enumeration(
406406
ECase(ELFOSABI_AMDGPU_PAL);
407407
ECase(ELFOSABI_AMDGPU_MESA3D);
408408
ECase(ELFOSABI_ARM);
409+
ECase(ELFOSABI_ARM_FDPIC);
409410
ECase(ELFOSABI_C6000_ELFABI);
410411
ECase(ELFOSABI_C6000_LINUX);
411412
ECase(ELFOSABI_STANDALONE);

llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -737,6 +737,9 @@ class ARMAsmParser : public MCTargetAsmParser {
737737
void ReportNearMisses(SmallVectorImpl<NearMissInfo> &NearMisses, SMLoc IDLoc,
738738
OperandVector &Operands);
739739

740+
MCSymbolRefExpr::VariantKind
741+
getVariantKindForName(StringRef Name) const override;
742+
740743
void doBeforeLabelEmit(MCSymbol *Symbol, SMLoc IDLoc) override;
741744

742745
void onLabelParsed(MCSymbol *Symbol) override;
@@ -11358,6 +11361,37 @@ bool ARMAsmParser::parseDirectiveARM(SMLoc L) {
1135811361
return false;
1135911362
}
1136011363

11364+
MCSymbolRefExpr::VariantKind
11365+
ARMAsmParser::getVariantKindForName(StringRef Name) const {
11366+
return StringSwitch<MCSymbolRefExpr::VariantKind>(Name.lower())
11367+
.Case("funcdesc", MCSymbolRefExpr::VK_FUNCDESC)
11368+
.Case("got", MCSymbolRefExpr::VK_GOT)
11369+
.Case("got_prel", MCSymbolRefExpr::VK_ARM_GOT_PREL)
11370+
.Case("gotfuncdesc", MCSymbolRefExpr::VK_GOTFUNCDESC)
11371+
.Case("gotoff", MCSymbolRefExpr::VK_GOTOFF)
11372+
.Case("gotofffuncdesc", MCSymbolRefExpr::VK_GOTOFFFUNCDESC)
11373+
.Case("gottpoff", MCSymbolRefExpr::VK_GOTTPOFF)
11374+
.Case("gottpoff_fdpic", MCSymbolRefExpr::VK_GOTTPOFF_FDPIC)
11375+
.Case("imgrel", MCSymbolRefExpr::VK_COFF_IMGREL32)
11376+
.Case("none", MCSymbolRefExpr::VK_ARM_NONE)
11377+
.Case("plt", MCSymbolRefExpr::VK_PLT)
11378+
.Case("prel31", MCSymbolRefExpr::VK_ARM_PREL31)
11379+
.Case("sbrel", MCSymbolRefExpr::VK_ARM_SBREL)
11380+
.Case("secrel32", MCSymbolRefExpr::VK_SECREL)
11381+
.Case("target1", MCSymbolRefExpr::VK_ARM_TARGET1)
11382+
.Case("target2", MCSymbolRefExpr::VK_ARM_TARGET2)
11383+
.Case("tlscall", MCSymbolRefExpr::VK_TLSCALL)
11384+
.Case("tlsdesc", MCSymbolRefExpr::VK_TLSDESC)
11385+
.Case("tlsgd", MCSymbolRefExpr::VK_TLSGD)
11386+
.Case("tlsgd_fdpic", MCSymbolRefExpr::VK_TLSGD_FDPIC)
11387+
.Case("tlsld", MCSymbolRefExpr::VK_TLSLD)
11388+
.Case("tlsldm", MCSymbolRefExpr::VK_TLSLDM)
11389+
.Case("tlsldm_fdpic", MCSymbolRefExpr::VK_TLSLDM_FDPIC)
11390+
.Case("tlsldo", MCSymbolRefExpr::VK_ARM_TLSLDO)
11391+
.Case("tpoff", MCSymbolRefExpr::VK_TPOFF)
11392+
.Default(MCSymbolRefExpr::VK_Invalid);
11393+
}
11394+
1136111395
void ARMAsmParser::doBeforeLabelEmit(MCSymbol *Symbol, SMLoc IDLoc) {
1136211396
// We need to flush the current implicit IT block on a label, because it is
1136311397
// not legal to branch into an IT block.

llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "llvm/MC/MCSectionELF.h"
3030
#include "llvm/MC/MCSectionMachO.h"
3131
#include "llvm/MC/MCSubtargetInfo.h"
32+
#include "llvm/MC/MCTargetOptions.h"
3233
#include "llvm/MC/MCValue.h"
3334
#include "llvm/Support/Debug.h"
3435
#include "llvm/Support/EndianStream.h"
@@ -1349,7 +1350,9 @@ static MCAsmBackend *createARMAsmBackend(const Target &T,
13491350
return new ARMAsmBackendWinCOFF(T, STI.getTargetTriple().isThumb());
13501351
case Triple::ELF:
13511352
assert(TheTriple.isOSBinFormatELF() && "using ELF for non-ELF target");
1352-
uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(TheTriple.getOS());
1353+
uint8_t OSABI = Options.FDPIC
1354+
? ELF::ELFOSABI_ARM_FDPIC
1355+
: MCELFObjectTargetWriter::getOSABI(TheTriple.getOS());
13531356
return new ARMAsmBackendELF(T, STI.getTargetTriple().isThumb(), OSABI,
13541357
Endian);
13551358
}

llvm/lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "llvm/MC/MCObjectFileInfo.h"
1717
#include "llvm/MC/MCObjectWriter.h"
1818
#include "llvm/MC/MCValue.h"
19+
#include "llvm/Object/ELF.h"
1920
#include "llvm/Support/ErrorHandling.h"
2021
#include "llvm/Support/raw_ostream.h"
2122
#include <cstdint>
@@ -84,6 +85,14 @@ unsigned ARMELFObjectWriter::GetRelocTypeInner(const MCValue &Target,
8485
if (Kind >= FirstLiteralRelocationKind)
8586
return Kind - FirstLiteralRelocationKind;
8687
MCSymbolRefExpr::VariantKind Modifier = Target.getAccessVariant();
88+
auto CheckFDPIC = [&](uint32_t Type) {
89+
if (getOSABI() != ELF::ELFOSABI_ARM_FDPIC)
90+
Ctx.reportError(Fixup.getLoc(),
91+
"relocation " +
92+
object::getELFRelocationTypeName(ELF::EM_ARM, Type) +
93+
" only supported in FDPIC mode");
94+
return Type;
95+
};
8796

8897
if (IsPCRel) {
8998
switch (Fixup.getTargetKind()) {
@@ -240,6 +249,18 @@ unsigned ARMELFObjectWriter::GetRelocTypeInner(const MCValue &Target,
240249
return ELF::R_ARM_TLS_LDM32;
241250
case MCSymbolRefExpr::VK_ARM_TLSDESCSEQ:
242251
return ELF::R_ARM_TLS_DESCSEQ;
252+
case MCSymbolRefExpr::VK_FUNCDESC:
253+
return CheckFDPIC(ELF::R_ARM_FUNCDESC);
254+
case MCSymbolRefExpr::VK_GOTFUNCDESC:
255+
return CheckFDPIC(ELF::R_ARM_GOTFUNCDESC);
256+
case MCSymbolRefExpr::VK_GOTOFFFUNCDESC:
257+
return CheckFDPIC(ELF::R_ARM_GOTOFFFUNCDESC);
258+
case MCSymbolRefExpr::VK_TLSGD_FDPIC:
259+
return CheckFDPIC(ELF::R_ARM_TLS_GD32_FDPIC);
260+
case MCSymbolRefExpr::VK_TLSLDM_FDPIC:
261+
return CheckFDPIC(ELF::R_ARM_TLS_LDM32_FDPIC);
262+
case MCSymbolRefExpr::VK_GOTTPOFF_FDPIC:
263+
return CheckFDPIC(ELF::R_ARM_TLS_IE32_FDPIC);
243264
}
244265
case ARM::fixup_arm_condbranch:
245266
case ARM::fixup_arm_uncondbranch:

llvm/lib/Target/ARM/MCTargetDesc/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ add_llvm_component_library(LLVMARMDesc
2121
CodeGenTypes
2222
MC
2323
MCDisassembler
24+
Object
2425
Support
2526
TargetParser
2627

llvm/test/MC/ARM/fdpic.s

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# RUN: llvm-mc -triple=armv7-linux-gnueabi %s | FileCheck %s --check-prefix=ASM
2+
# RUN: llvm-mc -filetype=obj -triple=armv7-linux-gnueabi --fdpic %s | llvm-readelf -h -r - | FileCheck %s
3+
4+
# RUN: not llvm-mc -filetype=obj -triple=armv7-linux-gnueabi %s -o /dev/null 2>&1 | FileCheck %s --check-prefix=ERR
5+
6+
# ASM: .long f(FUNCDESC)
7+
# ASM-NEXT: .long f(GOTFUNCDESC)
8+
# ASM-NEXT: .long f(GOTOFFFUNCDESC)
9+
10+
# CHECK: OS/ABI: ARM FDPIC
11+
# CHECK: Machine: ARM
12+
# CHECK: Flags: 0x5000000
13+
14+
# CHECK: R_ARM_FUNCDESC 00000000 f
15+
# CHECK-NEXT: R_ARM_GOTFUNCDESC 00000000 f
16+
# CHECK-NEXT: R_ARM_GOTOFFFUNCDESC 00000000 f
17+
# CHECK-NEXT: R_ARM_TLS_GD32_FDPIC 00000000 tls
18+
# CHECK-NEXT: R_ARM_TLS_LDM32_FDPIC 00000000 tls
19+
# CHECK-NEXT: R_ARM_TLS_IE32_FDPIC 00000000 tls
20+
21+
.data
22+
# ERR: [[#@LINE+1]]:7: error: relocation R_ARM_FUNCDESC only supported in FDPIC mode
23+
.long f(FUNCDESC)
24+
# ERR: [[#@LINE+1]]:7: error: relocation R_ARM_GOTFUNCDESC only supported in FDPIC mode
25+
.long f(GOTFUNCDESC)
26+
# ERR: [[#@LINE+1]]:7: error: relocation R_ARM_GOTOFFFUNCDESC only supported in FDPIC mode
27+
.long f(GOTOFFFUNCDESC)
28+
# ERR: [[#@LINE+1]]:7: error: relocation R_ARM_TLS_GD32_FDPIC only supported in FDPIC mode
29+
.long tls(tlsgd_fdpic)
30+
# ERR: [[#@LINE+1]]:7: error: relocation R_ARM_TLS_LDM32_FDPIC only supported in FDPIC mode
31+
.long tls(tlsldm_fdpic)
32+
# ERR: [[#@LINE+1]]:7: error: relocation R_ARM_TLS_IE32_FDPIC only supported in FDPIC mode
33+
.long tls(gottpoff_fdpic)

llvm/test/tools/llvm-readobj/ELF/file-header-os-abi.test

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,13 @@ FileHeader:
192192
# OSABI-ARM-LLVM: OS/ABI: ARM (0x61)
193193
# OSABI-ARM-GNU: OS/ABI: ARM
194194

195+
# RUN: yaml2obj %s -DOSABI=ELFOSABI_ARM_FDPIC -DMACHINE=EM_ARM -o %t.osabi.arm_fdpic
196+
# RUN: llvm-readobj --file-headers %t.osabi.arm_fdpic | FileCheck %s --match-full-lines --check-prefix=OSABI-ARMFDPIC-LLVM
197+
# RUN: llvm-readelf --file-headers %t.osabi.arm_fdpic | FileCheck %s --match-full-lines --check-prefix=OSABI-ARMFDPIC-GNU
198+
199+
# OSABI-ARMFDPIC-LLVM: OS/ABI: ARM FDPIC (0x41)
200+
# OSABI-ARMFDPIC-GNU: OS/ABI: ARM FDPIC
201+
195202
## Check all EM_TI_C6000 specific values.
196203

197204
# RUN: yaml2obj %s -DOSABI=ELFOSABI_C6000_ELFABI -DMACHINE=EM_TI_C6000 -o %t.osabi.c6000.elfabi

llvm/test/tools/llvm-readobj/ELF/reloc-types-arm.test

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,13 @@
135135
# CHECK: Type: R_ARM_THM_TLS_DESCSEQ16 (129)
136136
# CHECK: Type: R_ARM_THM_TLS_DESCSEQ32 (130)
137137
# CHECK: Type: R_ARM_IRELATIVE (160)
138+
# CHECK: Type: R_ARM_GOTFUNCDESC (161)
139+
# CHECK: Type: R_ARM_GOTOFFFUNCDESC (162)
140+
# CHECK: Type: R_ARM_FUNCDESC (163)
141+
# CHECK: Type: R_ARM_FUNCDESC_VALUE (164)
142+
# CHECK: Type: R_ARM_TLS_GD32_FDPIC (165)
143+
# CHECK: Type: R_ARM_TLS_LDM32_FDPIC (166)
144+
# CHECK: Type: R_ARM_TLS_IE32_FDPIC (167)
138145

139146
--- !ELF
140147
FileHeader:
@@ -278,3 +285,10 @@ Sections:
278285
- Type: R_ARM_THM_TLS_DESCSEQ16
279286
- Type: R_ARM_THM_TLS_DESCSEQ32
280287
- Type: R_ARM_IRELATIVE
288+
- Type: R_ARM_GOTFUNCDESC
289+
- Type: R_ARM_GOTOFFFUNCDESC
290+
- Type: R_ARM_FUNCDESC
291+
- Type: R_ARM_FUNCDESC_VALUE
292+
- Type: R_ARM_TLS_GD32_FDPIC
293+
- Type: R_ARM_TLS_LDM32_FDPIC
294+
- Type: R_ARM_TLS_IE32_FDPIC

llvm/tools/llvm-readobj/ELFDumper.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1095,7 +1095,8 @@ const EnumEntry<unsigned> AMDGPUElfOSABI[] = {
10951095
};
10961096

10971097
const EnumEntry<unsigned> ARMElfOSABI[] = {
1098-
{"ARM", "ARM", ELF::ELFOSABI_ARM}
1098+
{"ARM", "ARM", ELF::ELFOSABI_ARM},
1099+
{"ARM FDPIC", "ARM FDPIC", ELF::ELFOSABI_ARM_FDPIC},
10991100
};
11001101

11011102
const EnumEntry<unsigned> C6000ElfOSABI[] = {

0 commit comments

Comments
 (0)