[llvm] [CodeGen][X86] Honor LargeEHEncoding when selecting x86-64 EH encoding (PR #210109)
Farid Zakaria via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 16 09:50:04 PDT 2026
https://github.com/fzakaria updated https://github.com/llvm/llvm-project/pull/210109
>From 7c11e0f8e0cceadacd582c051206e3f628412ddc Mon Sep 17 00:00:00 2001
From: Farid Zakaria <fmzakari at fb.com>
Date: Thu, 16 Jul 2026 09:49:47 -0700
Subject: [PATCH] [CodeGen][X86] Honor LargeEHEncoding when selecting x86-64 EH
pointer encodings
On x86-64, select the exception-handling pointer encodings as if the
Large code model were in use when MCOptions.LargeEHEncoding is set. This
uses a case-scoped local (EHCM) rather than mutating the object file's
code model, so only the EH encoding selection is affected.
---
.../CodeGen/TargetLoweringObjectFileImpl.cpp | 42 +++++++++++--------
1 file changed, 25 insertions(+), 17 deletions(-)
diff --git a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
index c7d07c1e40393..c68c4af9c3756 100644
--- a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
+++ b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
@@ -122,7 +122,7 @@ void TargetLoweringObjectFileELF::Initialize(MCContext &Ctx,
const TargetMachine &TgtM) {
TargetLoweringObjectFile::Initialize(Ctx, TgtM);
- CodeModel::Model CM = TgtM.getCodeModel();
+ const CodeModel::Model CM = TgtM.getCodeModel();
InitializeELF(TgtM.Options.UseInitArray);
switch (TgtM.getTargetTriple().getArch()) {
@@ -150,29 +150,37 @@ void TargetLoweringObjectFileELF::Initialize(MCContext &Ctx,
dwarf::DW_EH_PE_sdata4
: dwarf::DW_EH_PE_absptr;
break;
- case Triple::x86_64:
- if (TgtM.Options.MCOptions.LargeEHEncoding)
- CM = CodeModel::Large;
+ case Triple::x86_64: {
+ // The large EH encoding forces 64-bit-wide EH pointers regardless of the
+ // code model, so treat it like the Large code model when selecting
+ // encodings below.
+ const CodeModel::Model EHCM =
+ TgtM.Options.MCOptions.LargeEHEncoding ? CodeModel::Large : CM;
if (isPositionIndependent()) {
- PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
- ((CM == CodeModel::Small || CM == CodeModel::Medium)
- ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8);
+ PersonalityEncoding =
+ dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
+ ((EHCM == CodeModel::Small || EHCM == CodeModel::Medium)
+ ? dwarf::DW_EH_PE_sdata4
+ : dwarf::DW_EH_PE_sdata8);
LSDAEncoding = dwarf::DW_EH_PE_pcrel |
- (CM == CodeModel::Small
- ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8);
+ (EHCM == CodeModel::Small ? dwarf::DW_EH_PE_sdata4
+ : dwarf::DW_EH_PE_sdata8);
TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
- ((CM == CodeModel::Small || CM == CodeModel::Medium)
- ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8);
+ ((EHCM == CodeModel::Small || EHCM == CodeModel::Medium)
+ ? dwarf::DW_EH_PE_sdata4
+ : dwarf::DW_EH_PE_sdata8);
} else {
PersonalityEncoding =
- (CM == CodeModel::Small || CM == CodeModel::Medium)
- ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr;
- LSDAEncoding = (CM == CodeModel::Small)
- ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr;
- TTypeEncoding = (CM == CodeModel::Small)
- ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr;
+ (EHCM == CodeModel::Small || EHCM == CodeModel::Medium)
+ ? dwarf::DW_EH_PE_udata4
+ : dwarf::DW_EH_PE_absptr;
+ LSDAEncoding = (EHCM == CodeModel::Small) ? dwarf::DW_EH_PE_udata4
+ : dwarf::DW_EH_PE_absptr;
+ TTypeEncoding = (EHCM == CodeModel::Small) ? dwarf::DW_EH_PE_udata4
+ : dwarf::DW_EH_PE_absptr;
}
break;
+ }
case Triple::hexagon:
PersonalityEncoding = dwarf::DW_EH_PE_absptr;
LSDAEncoding = dwarf::DW_EH_PE_absptr;
More information about the llvm-commits
mailing list