[llvm] [lld][llvm/mc] Add support for sdata8 for FDE CIE (PR #174508)
Farid Zakaria via llvm-commits
llvm-commits at lists.llvm.org
Sun Jan 11 12:10:13 PST 2026
https://github.com/fzakaria updated https://github.com/llvm/llvm-project/pull/174508
>From 31795f8c7bb235ed2aebc625d97ca55ec108454a Mon Sep 17 00:00:00 2001
From: Farid Zakaria <fmzakari at fb.com>
Date: Thu, 8 Jan 2026 11:01:29 -0800
Subject: [PATCH] [lld] Support large encoding for FDE
---
llvm/include/llvm/MC/MCTargetOptions.h | 4 ++++
llvm/include/llvm/MC/MCTargetOptionsCommandFlags.h | 2 ++
llvm/lib/MC/MCObjectFileInfo.cpp | 13 +++++++++----
llvm/lib/MC/MCTargetOptions.cpp | 6 ++----
llvm/lib/MC/MCTargetOptionsCommandFlags.cpp | 9 +++++++++
5 files changed, 26 insertions(+), 8 deletions(-)
diff --git a/llvm/include/llvm/MC/MCTargetOptions.h b/llvm/include/llvm/MC/MCTargetOptions.h
index 235d58d585b40..da62be369a43c 100644
--- a/llvm/include/llvm/MC/MCTargetOptions.h
+++ b/llvm/include/llvm/MC/MCTargetOptions.h
@@ -108,6 +108,10 @@ class MCTargetOptions {
// Whether or not to use full register names on PowerPC.
bool PPCUseFullRegisterNames : 1;
+ // Use 8-byte pointer size for ELF FDE CFI encoding, regardless of code model.
+ // Useful when text sections may exceed 2GB even with medium code model
+ bool LargeFDEEncoding : 1;
+
LLVM_ABI MCTargetOptions();
/// getABIName - If this returns a non-empty string this represents the
diff --git a/llvm/include/llvm/MC/MCTargetOptionsCommandFlags.h b/llvm/include/llvm/MC/MCTargetOptionsCommandFlags.h
index 168131b43cca8..beba9f835afeb 100644
--- a/llvm/include/llvm/MC/MCTargetOptionsCommandFlags.h
+++ b/llvm/include/llvm/MC/MCTargetOptionsCommandFlags.h
@@ -63,6 +63,8 @@ LLVM_ABI bool getX86RelaxRelocations();
LLVM_ABI bool getX86Sse2Avx();
+LLVM_ABI bool getLargeFDEEncoding();
+
LLVM_ABI StringRef getABIName();
LLVM_ABI StringRef getAsSecureLogFile();
diff --git a/llvm/lib/MC/MCObjectFileInfo.cpp b/llvm/lib/MC/MCObjectFileInfo.cpp
index 5afe00eee2242..9667d17e63939 100644
--- a/llvm/lib/MC/MCObjectFileInfo.cpp
+++ b/llvm/lib/MC/MCObjectFileInfo.cpp
@@ -24,6 +24,7 @@
#include "llvm/MC/MCSectionSPIRV.h"
#include "llvm/MC/MCSectionWasm.h"
#include "llvm/MC/MCSectionXCOFF.h"
+#include "llvm/MC/MCTargetOptions.h"
#include "llvm/TargetParser/Triple.h"
using namespace llvm;
@@ -332,7 +333,6 @@ void MCObjectFileInfo::initMachOMCObjectFileInfo(const Triple &T) {
TLSExtraDataSection = TLSTLVSection;
}
-
void MCObjectFileInfo::initELFMCObjectFileInfo(const Triple &T, bool Large) {
switch (T.getArch()) {
case Triple::mips:
@@ -354,10 +354,15 @@ void MCObjectFileInfo::initELFMCObjectFileInfo(const Triple &T, bool Large) {
case Triple::ppc64le:
case Triple::aarch64:
case Triple::aarch64_be:
- case Triple::x86_64:
- FDECFIEncoding = dwarf::DW_EH_PE_pcrel |
- (Large ? dwarf::DW_EH_PE_sdata8 : dwarf::DW_EH_PE_sdata4);
+ case Triple::x86_64: {
+ // Check if the user requested large FDE encoding via MCTargetOptions
+ const MCTargetOptions *TO = Ctx->getTargetOptions();
+ bool Use8ByteFDE = Large || (TO && TO->LargeFDEEncoding);
+ FDECFIEncoding =
+ dwarf::DW_EH_PE_pcrel |
+ (Use8ByteFDE ? dwarf::DW_EH_PE_sdata8 : dwarf::DW_EH_PE_sdata4);
break;
+ }
case Triple::bpfel:
case Triple::bpfeb:
FDECFIEncoding = dwarf::DW_EH_PE_sdata8;
diff --git a/llvm/lib/MC/MCTargetOptions.cpp b/llvm/lib/MC/MCTargetOptions.cpp
index be6d19d111620..ff3ce40a555ee 100644
--- a/llvm/lib/MC/MCTargetOptions.cpp
+++ b/llvm/lib/MC/MCTargetOptions.cpp
@@ -20,11 +20,9 @@ MCTargetOptions::MCTargetOptions()
EmitDwarfUnwind(EmitDwarfUnwindType::Default),
MCUseDwarfDirectory(DefaultDwarfDirectory),
EmitCompactUnwindNonCanonical(false), EmitSFrameUnwind(false),
- PPCUseFullRegisterNames(false) {}
+ PPCUseFullRegisterNames(false), LargeFDEEncoding(false) {}
-StringRef MCTargetOptions::getABIName() const {
- return ABIName;
-}
+StringRef MCTargetOptions::getABIName() const { return ABIName; }
StringRef MCTargetOptions::getAssemblyLanguage() const {
return AssemblyLanguage;
diff --git a/llvm/lib/MC/MCTargetOptionsCommandFlags.cpp b/llvm/lib/MC/MCTargetOptionsCommandFlags.cpp
index 22494fa11eb2a..8ad5ac02cdaa6 100644
--- a/llvm/lib/MC/MCTargetOptionsCommandFlags.cpp
+++ b/llvm/lib/MC/MCTargetOptionsCommandFlags.cpp
@@ -59,6 +59,7 @@ MCOPT(bool, Crel)
MCOPT(bool, ImplicitMapSyms)
MCOPT(bool, X86RelaxRelocations)
MCOPT(bool, X86Sse2Avx)
+MCOPT(bool, LargeFDEEncoding)
MCSTROPT(ABIName)
MCSTROPT(AsSecureLogFile)
@@ -168,6 +169,13 @@ llvm::mc::RegisterMCTargetOptionsFlags::RegisterMCTargetOptionsFlags() {
"instructions with VEX prefix"));
MCBINDOPT(X86Sse2Avx);
+ static cl::opt<bool> LargeFDEEncoding(
+ "large-fde-encoding",
+ cl::desc("Use 8-byte pointer size for ELF FDE CFI encoding, useful "
+ "when text sections may exceed 2GB even with medium code"),
+ cl::init(false));
+ MCBINDOPT(LargeFDEEncoding);
+
static cl::opt<std::string> ABIName(
"target-abi",
cl::desc("The name of the ABI to be targeted from the backend."),
@@ -199,6 +207,7 @@ MCTargetOptions llvm::mc::InitMCTargetOptionsFromFlags() {
Options.ImplicitMapSyms = getImplicitMapSyms();
Options.X86RelaxRelocations = getX86RelaxRelocations();
Options.X86Sse2Avx = getX86Sse2Avx();
+ Options.LargeFDEEncoding = getLargeFDEEncoding();
Options.EmitDwarfUnwind = getEmitDwarfUnwind();
Options.EmitCompactUnwindNonCanonical = getEmitCompactUnwindNonCanonical();
Options.EmitSFrameUnwind = getEmitSFrameUnwind();
More information about the llvm-commits
mailing list